CVE-2024-56655

CVE-2024-56655

High · published December 27, 2024

CVSS v3.1
7.8
EPSS
0%
Percentile
12.5
In the wild
Unconfirmed
What it is

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:

<TASK>

nf_tables_trans_destroy_work+0x6b7/0xad0

process_one_work+0x64a/0xce0

worker_thread+0x613/0x10d0

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.

The record
Technical detail
CVSS v3.1
7.8 · HIGH
Vector
CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H
CVSS v4.0
Not supplied
EPSS
0.00225 · 12.5th percentile
Published
2024-12-27T20:15Z
Affected products (4)
ProductVersionsFixed in
linux/linux_kernel≥ 6.6.61, < 6.6.676.6.67
linux/linux_kernel≥ 6.11.8, < 6.12.66.12.6
linux/linux_kernelall versions—
linux/linux_kernelall versions—
References (7)
EPSS history
Timeline
  • 27 DEC 15:06Z
    netfilter: nf_tables: do not defer rule destruction via call_rcu
    cvelistv5