Skip to content

Commit 4c1f351

Browse files
committed
netfilter: nf_tables: skip netdev events generated on netns removal
Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=2028203 Upstream Status: commit 68a3765 commit 68a3765 Author: Florian Westphal <[email protected]> Date: Wed Oct 6 16:20:34 2021 +0200 netfilter: nf_tables: skip netdev events generated on netns removal syzbot reported following (harmless) WARN: WARNING: CPU: 1 PID: 2648 at net/netfilter/core.c:468 nft_netdev_unregister_hooks net/netfilter/nf_tables_api.c:230 [inline] nf_tables_unregister_hook include/net/netfilter/nf_tables.h:1090 [inline] __nft_release_basechain+0x138/0x640 net/netfilter/nf_tables_api.c:9524 nft_netdev_event net/netfilter/nft_chain_filter.c:351 [inline] nf_tables_netdev_event+0x521/0x8a0 net/netfilter/nft_chain_filter.c:382 reproducer: unshare -n bash -c 'ip link add br0 type bridge; nft add table netdev t ; \ nft add chain netdev t ingress \{ type filter hook ingress device "br0" \ priority 0\; policy drop\; \}' Problem is that when netns device exit hooks create the UNREGISTER event, the .pre_exit hook for nf_tables core has already removed the base hook. Notifier attempts to do this again. The need to do base hook unregister unconditionally was needed in the past, because notifier was last stage where reg->dev dereference was safe. Now that nf_tables does the hook removal in .pre_exit, this isn't needed anymore. Reported-and-tested-by: [email protected] Fixes: 767d121 ("netfilter: nftables: fix possible UAF over chains from packet path in netns") Signed-off-by: Florian Westphal <[email protected]> Signed-off-by: Pablo Neira Ayuso <[email protected]> Signed-off-by: Florian Westphal <[email protected]>
1 parent d5c4ea2 commit 4c1f351

File tree

1 file changed

+3
-6
lines changed

1 file changed

+3
-6
lines changed

net/netfilter/nft_chain_filter.c

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -342,12 +342,6 @@ static void nft_netdev_event(unsigned long event, struct net_device *dev,
342342
return;
343343
}
344344

345-
/* UNREGISTER events are also happening on netns exit.
346-
*
347-
* Although nf_tables core releases all tables/chains, only this event
348-
* handler provides guarantee that hook->ops.dev is still accessible,
349-
* so we cannot skip exiting net namespaces.
350-
*/
351345
__nft_release_basechain(ctx);
352346
}
353347

@@ -366,6 +360,9 @@ static int nf_tables_netdev_event(struct notifier_block *this,
366360
event != NETDEV_CHANGENAME)
367361
return NOTIFY_DONE;
368362

363+
if (!check_net(ctx.net))
364+
return NOTIFY_DONE;
365+
369366
nft_net = nft_pernet(ctx.net);
370367
mutex_lock(&nft_net->commit_mutex);
371368
list_for_each_entry(table, &nft_net->tables, list) {

0 commit comments

Comments
 (0)