Browse Source

[Feature] Use hashing to reduce redis attack surface

tags/1.7.3
Vsevolod Stakhov 6 years ago
parent
commit
467b8f00bb
1 changed files with 11 additions and 8 deletions
  1. 11
    8
      src/plugins/lua/ratelimit.lua

+ 11
- 8
src/plugins/lua/ratelimit.lua View File

@@ -154,7 +154,7 @@ local lua_redis = require "lua_redis"
local fun = require "fun"
local lua_maps = require "lua_maps"
local lua_util = require "lua_util"
local rspamd_hash = require "rspamd_cryptobox_hash"


local function load_scripts(cfg, ev_base)
@@ -292,7 +292,7 @@ local keywords = {
}

local function gen_rate_key(task, rtype, bucket)
local key_t = {settings.prefix, tostring(lua_util.round(100000.0 / bucket[1]))}
local key_t = {tostring(lua_util.round(100000.0 / bucket[1]))}
local key_keywords = lua_util.str_split(rtype, '_')
local have_user = false

@@ -358,9 +358,12 @@ local function ratelimit_cb(task)
local prefix = gen_rate_key(task, k, bucket)

if prefix then
local hash = settings.prefix ..
string.sub(rspamd_hash.create(prefix):base32(), 1, 24)
prefixes[prefix] = {
bucket = bucket,
name = k,
hash = hash
}
nprefixes = nprefixes + 1
end
@@ -395,12 +398,12 @@ local function ratelimit_cb(task)
for pr,value in pairs(prefixes) do
local bucket = value.bucket
local rate = (1.0 / bucket[1]) / 1000.0 -- Leak rate in messages/ms
rspamd_logger.debugm(N, task, "check limit %s:%s (%s/%s)",
value.name, pr, bucket[2], bucket[1])
rspamd_logger.debugm(N, task, "check limit %s:%s -> %s (%s/%s)",
value.name, pr, value.hash, bucket[2], bucket[1])
lua_redis.exec_redis_script(bucket_check_id,
{task = task, is_write = true},
gen_check_cb(pr, bucket, value.name),
{pr, tostring(now), tostring(rate), tostring(bucket[2]),
{pr.hash, tostring(now), tostring(rate), tostring(bucket[2]),
tostring(settings.expire)})
end
end
@@ -438,8 +441,8 @@ local function ratelimit_update_cb(task)
k, err)
else
rspamd_logger.debugm(N, task,
"updated limit %s:%s (%s/%s), burst: %s, dyn_rate: %s, dyn_burst: %s",
v.name, k, bucket[2], bucket[1], data[1], data[2], data[3])
"updated limit %s:%s -> %s (%s/%s), burst: %s, dyn_rate: %s, dyn_burst: %s",
v.name, k, v.hash, bucket[2], bucket[1], data[1], data[2], data[3])
end
end
local now = rspamd_util.get_time()
@@ -448,7 +451,7 @@ local function ratelimit_update_cb(task)
lua_redis.exec_redis_script(bucket_update_id,
{task = task, is_write = true},
update_bucket_cb,
{k, tostring(now), tostring(mult_rate), tostring(mult_burst),
{v.hash, tostring(now), tostring(mult_rate), tostring(mult_burst),
tostring(settings.max_rate_mult), tostring(settings.max_bucket_mult),
tostring(settings.expire)})
end

Loading…
Cancel
Save