• Florian Westphal's avatar
    netfilter: sync with packet rx also after removing queue entries · 514ed62e
    Florian Westphal authored
    We need to sync packet rx again after flushing the queue entries.
    Otherwise, the following race could happen:
    
    cpu1: nf_unregister_hook(H) called, H unliked from lists, calls
    synchronize_net() to wait for packet rx completion.
    
    Problem is that while no new nf_queue_entry structs that use H can be
    allocated, another CPU might receive a verdict from userspace just before
    cpu1 calls nf_queue_nf_hook_drop to remove this entry:
    
    cpu2: receive verdict from userspace, lock queue
    cpu2: unlink nf_queue_entry struct E, which references H, from queue list
    cpu1: calls nf_queue_nf_hook_drop, blocks on queue spinlock
    cpu2: unlock queue
    cpu1: nf_queue_nf_hook_drop drops affected queue entries
    cpu2: call nf_reinject for E
    cpu1: kfree(H)
    cpu2: potential use-after-free for H
    
    Cc: Eric W. Biederman <ebiederm@xmission.com>
    Fixes: 085db2c0 ("netfilter: Per network namespace netfilter hooks.")
    Signed-off-by: default avatarFlorian Westphal <fw@strlen.de>
    Signed-off-by: default avatarPablo Neira Ayuso <pablo@netfilter.org>
    514ed62e
core.c 11.2 KB