inet: frag: enforce memory limits earlier
We currently check current frags memory usage only when a new frag queue is created. This allows attackers to first consume the memory budget (default : 4 MB) creating thousands of frag queues, then sending tiny skbs to exceed high_thresh limit by 2 to 3 order of magnitude. Note that before commit648700f76b
("inet: frags: use rhashtables for reassembly units"), work queue could be starved under DOS, getting no cpu cycles. After commit648700f76b
, only the per frag queue timer can eventually remove an incomplete frag queue and its skbs. Fixes:b13d3cbfb8
("inet: frag: move eviction of queues to work queue") Signed-off-by: Eric Dumazet <edumazet@google.com> Reported-by: Jann Horn <jannh@google.com> Cc: Florian Westphal <fw@strlen.de> Cc: Peter Oskolkov <posk@google.com> Cc: Paolo Abeni <pabeni@redhat.com> Acked-by: Florian Westphal <fw@strlen.de> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
e39eb59999
commit
56e2c94f05
|
@ -157,9 +157,6 @@ static struct inet_frag_queue *inet_frag_alloc(struct netns_frags *nf,
|
||||||
{
|
{
|
||||||
struct inet_frag_queue *q;
|
struct inet_frag_queue *q;
|
||||||
|
|
||||||
if (!nf->high_thresh || frag_mem_limit(nf) > nf->high_thresh)
|
|
||||||
return NULL;
|
|
||||||
|
|
||||||
q = kmem_cache_zalloc(f->frags_cachep, GFP_ATOMIC);
|
q = kmem_cache_zalloc(f->frags_cachep, GFP_ATOMIC);
|
||||||
if (!q)
|
if (!q)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
@ -204,6 +201,9 @@ struct inet_frag_queue *inet_frag_find(struct netns_frags *nf, void *key)
|
||||||
{
|
{
|
||||||
struct inet_frag_queue *fq;
|
struct inet_frag_queue *fq;
|
||||||
|
|
||||||
|
if (!nf->high_thresh || frag_mem_limit(nf) > nf->high_thresh)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
rcu_read_lock();
|
rcu_read_lock();
|
||||||
|
|
||||||
fq = rhashtable_lookup(&nf->rhashtable, key, nf->f->rhash_params);
|
fq = rhashtable_lookup(&nf->rhashtable, key, nf->f->rhash_params);
|
||||||
|
|
Loading…
Reference in New Issue