CVE-2024-53044

CVE-2024-53044

High · published November 19, 2024

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

In the Linux kernel, the following vulnerability has been resolved:

net/sched: sch_api: fix xa_insert() error path in tcf_block_get_ext()

This command:

$ tc qdisc replace dev eth0 ingress_block 1 egress_block 1 clsact

Error: block dev insert failed: -EBUSY.

fails because user space requests the same block index to be set for

both ingress and egress.

[ side note, I don't think it even failed prior to commit 913b47d3424e

("net/sched: Introduce tc block netdev tracking infra"), because this

is a command from an old set of notes of mine which used to work, but

alas, I did not scientifically bisect this ]

The problem is not that it fails, but rather, that the second time

around, it fails differently (and irrecoverably):

$ tc qdisc replace dev eth0 ingress_block 1 egress_block 1 clsact

Error: dsa_core: Flow block cb is busy.

[ another note: the extack is added by me for illustration purposes.

the context of the problem is that clsact_init() obtains the same

&q->ingress_block pointer as &q->egress_block, and since we call

tcf_block_get_ext() on both of them, "dev" will be added to the

block->ports xarray twice, thus failing the operation: once through

the ingress block pointer, and once again through the egress block

pointer. the problem itself is that when xa_insert() fails, we have

emitted a FLOW_BLOCK_BIND command through ndo_setup_tc(), but the

offload never sees a corresponding FLOW_BLOCK_UNBIND. ]

Even correcting the bad user input, we still cannot recover:

$ tc qdisc replace dev swp3 ingress_block 1 egress_block 2 clsact

Error: dsa_core: Flow block cb is busy.

Basically the only way to recover is to reboot the system, or unbind and

rebind the net device driver.

To fix the bug, we need to fill the correct error teardown path which

was missed during code movement, and call tcf_block_offload_unbind()

when xa_insert() fails.

[ last note, fundamentally I blame the label naming convention in

tcf_block_get_ext() for the bug. The labels should be named after what

they do, not after the error path that jumps to them. This way, it is

obviously wrong that two labels pointing to the same code mean

something is wrong, and checking the code correctness at the goto site

is also easier ]

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.00214 · 11.1th percentile
Published
2024-11-19T23:15Z
Affected products (6)
ProductVersionsFixed in
linux/linux_kernel≥ 6.8, < 6.11.76.11.7
linux/linux_kernelall versions—
linux/linux_kernelall versions—
linux/linux_kernelall versions—
linux/linux_kernelall versions—
linux/linux_kernelall versions—
References (2)
EPSS history
Timeline
  • 19 NOV 17:19Z
    net/sched: sch_api: fix xa_insert() error path in tcf_block_get_ext()
    cvelistv5