CVE-2024-56655 Information
Description
In the Linux kernel the following vulnerability has been resolved:
netfilter: nf_tables: do not defer rule destruction via call_rcu
nf_tables_chain_destroy can sleep it can’t be used from call_rcu callbacks.
Moreover nf_tables_rule_release() is only safe for error unwinding while transaction mutex is held and the to-be-desroyed rule was not exposed to either dataplane or dumps as it deactives+frees without the required synchronize_rcu() in-between.
nft_rule_expr_deactivate() callbacks will change ->use counters of other chains/sets see e.g. nft_lookup .deactivate callback these must be serialized via transaction mutex.
Also add a few lockdep asserts to make this more explicit.
Calling synchronize_rcu() isn’t ideal but fixing this without is hard and way more intrusive. As-is we can get:
WARNING: .. net/netfilter/nf_tables_api.c:5515 nft_set_destroy+0x..
Workqueue: events nf_tables_trans_destroy_work
RIP: 0010:nft_set_destroy+0x3fe/0x5c0
Call Trace:
In case the synchronize_rcu becomes an issue we can explore alternatives.
One way would be to allocate nft_trans_rule objects + one nft_trans_chain object deactivate the rules + the chain and then defer the freeing to the nft destroy workqueue. We’d still need to keep the synchronize_rcu path as a fallback to handle -ENOMEM corner cases though.
Reference
https://git.kernel.org/stable/c/27f0574253f6c24c8ee4e3f0a685b75ed3a256ed https://git.kernel.org/stable/c/7cf0bd232b565d9852cb25fd094f77254773e048 https://git.kernel.org/stable/c/b04df3da1b5c6f6dc7cdccc37941740c078c4043
Share on: