Skip to content
OpenAdvisories
High · 7.8 CVE-2024-41010 EUVD-2024-39359GHSA-7rc8-rqg8-27m3

bpf: Fix too early release of tcx_entry

Published Jul 17, 2024 · Updated Aug 5, 2026 · Assigned by Linux

Vendor: Linux Product: Linux Package: kernel Package: linux Package: linux Package: linux-allwinner-5.19 Package: linux-aws Package: linux-aws-5.0 Package: linux-aws-5.11 Package: linux-aws-5.13 Package: linux-aws-5.19 Package: linux-aws-5.3 Package: linux-aws-5.8 Package: linux-aws-6.2 Package: linux-aws-6.8 Package: linux-azure Package: linux-azure-5.11 Package: linux-azure-5.13 Package: linux-azure-5.19 Package: linux-azure-5.3 Package: linux-azure-5.8 Package: linux-azure-6.2 Package: linux-azure-6.8 Package: linux-azure-edge Package: linux-azure-fde Package: linux-azure-fde-5.19 Package: linux-azure-fde-6.2 Package: linux-gcp Package: linux-gcp-5.11 Package: linux-gcp-5.13 Package: linux-gcp-5.19 Package: linux-gcp-5.3 Package: linux-gcp-5.8 Package: linux-gcp-6.2 Package: linux-gcp-6.8 Package: linux-gke Package: linux-gke-4.15 Package: linux-gke-5.15 Package: linux-gke-5.4 Package: linux-gkeop Package: linux-gkeop-5.4 Package: linux-hwe Package: linux-hwe-5.11 Package: linux-hwe-5.13 Package: linux-hwe-5.19 Package: linux-hwe-5.8 Package: linux-hwe-6.2 Package: linux-hwe-6.5 Package: linux-hwe-6.8 Package: linux-hwe-edge Package: linux-ibm Package: linux-intel-5.13 Package: linux-intel-iot-realtime Package: linux-lowlatency Package: linux-lowlatency-hwe-5.19 Package: linux-lowlatency-hwe-6.2 Package: linux-lowlatency-hwe-6.5 Package: linux-lowlatency-hwe-6.8 Package: linux-nvidia Package: linux-nvidia-6.2 Package: linux-nvidia-6.8 Package: linux-nvidia-lowlatency Package: linux-oem Package: linux-oem-5.10 Package: linux-oem-5.13 Package: linux-oem-5.14 Package: linux-oem-5.17 Package: linux-oem-5.6 Package: linux-oem-6.0 Package: linux-oem-6.1 Package: linux-oem-6.8 Package: linux-oracle Package: linux-oracle-5.0 Package: linux-oracle-5.11 Package: linux-oracle-5.13 Package: linux-oracle-5.3 Package: linux-oracle-5.8 Package: linux-oracle-6.8 Package: linux-raspi Package: linux-raspi-realtime Package: linux-raspi2 Package: linux-realtime Package: linux-riscv Package: linux-riscv-5.11 Package: linux-riscv-5.19 Package: linux-riscv-5.8 Package: linux-riscv-6.5 Package: linux-riscv-6.8 Package: linux-starfive-5.19 Package: linux-starfive-6.2 Platform: Linux Ecosystem: Azure Linux Ecosystem: Debian Ecosystem: Ubuntu

Description

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

bpf: Fix too early release of tcx_entry

Pedro Pinto and later independently also Hyunwoo Kim and Wongi Lee reported
an issue that the tcx_entry can be released too early leading to a use
after free (UAF) when an active old-style ingress or clsact qdisc with a
shared tc block is later replaced by another ingress or clsact instance.

Essentially, the sequence to trigger the UAF (one example) can be as follows:

1. A network namespace is created
2. An ingress qdisc is created. This allocates a tcx_entry, and
&tcx_entry->miniq is stored in the qdisc's miniqp->p_miniq. At the
same time, a tcf block with index 1 is created.
3. chain0 is attached to the tcf block. chain0 must be connected to
the block linked to the ingress qdisc to later reach the function
tcf_chain0_head_change_cb_del() which triggers the UAF.
4. Create and graft a clsact qdisc. This causes the ingress qdisc
created in step 1 to be removed, thus freeing the previously linked
tcx_entry:

rtnetlink_rcv_msg()
=> tc_modify_qdisc()
=> qdisc_create()
=> clsact_init() [a]
=> qdisc_graft()
=> qdisc_destroy()
=> __qdisc_destroy()
=> ingress_destroy() [b]
=> tcx_entry_free()
=> kfree_rcu() // tcx_entry freed

5. Finally, the network namespace is closed. This registers the
cleanup_net worker, and during the process of releasing the
remaining clsact qdisc, it accesses the tcx_entry that was
already freed in step 4, causing the UAF to occur:

cleanup_net()
=> ops_exit_list()
=> default_device_exit_batch()
=> unregister_netdevice_many()
=> unregister_netdevice_many_notify()
=> dev_shutdown()
=> qdisc_put()
=> clsact_destroy() [c]
=> tcf_block_put_ext()
=> tcf_chain0_head_change_cb_del()
=> tcf_chain_head_change_item()
=> clsact_chain_head_change()
=> mini_qdisc_pair_swap() // UAF

There are also other variants, the gist is to add an ingress (or clsact)
qdisc with a specific shared block, then to replace that qdisc, waiting
for the tcx_entry kfree_rcu() to be executed and subsequently accessing
the current active qdisc's miniq one way or another.

The correct fix is to turn the miniq_active boolean into a counter. What
can be observed, at step 2 above, the counter transitions from 0->1, at
step [a] from 1->2 (in order for the miniq object to remain active during
the replacement), then in [b] from 2->1 and finally [c] 1->0 with the
eventual release. The reference counter in general ranges from [0,2] and
it does not need to be atomic since all access to the counter is protected
by the rtnl mutex. With this in place, there is no longer a UAF happening
and the tcx_entry is freed at the correct time.

Affected products

VendorProductAffectedFixed
Linux Linux 6.6 6.6.41

Fixed in Linux distributions

Distributions backport fixes, so the version that fixes this vulnerability differs per release — upgrade to at least the version shown. From the distributions' security trackers and advisories.

ReleasePackageFixed inAdvisory
Debian 14 linux 6.9.10-1 —
Debian 13 linux 6.9.10-1 —
ReleasePackageFixed inAdvisory
Ubuntu 24.04 LTS linux 6.8.0-48.48 USN-7089-1
Ubuntu 24.04 LTS linux-aws 6.8.0-1018.20 USN-7089-3
Ubuntu 24.04 LTS linux-azure 6.8.0-1017.20 USN-7089-2
Ubuntu 24.04 LTS linux-gcp +1 6.8.0-1017.19 USN-7095-1, USN-7089-2
Ubuntu 24.04 LTS linux-gke 6.8.0-1013.17 USN-7089-6
Ubuntu 24.04 LTS linux-gkeop 6.8.0-1002.4 USN-7156-1
Ubuntu 24.04 LTS linux-ibm 6.8.0-1015.15 USN-7089-2
Ubuntu 24.04 LTS linux-lowlatency 6.8.0-48.48.3 USN-7089-7
Ubuntu 24.04 LTS linux-nvidia-lowlatency 6.8.0-1017.19.1 USN-7095-1
Ubuntu 24.04 LTS linux-oem-6.8 6.8.0-1016.16 USN-7089-4
Ubuntu 24.04 LTS linux-oracle 6.8.0-1015.16 USN-7089-3
Ubuntu 24.04 LTS linux-raspi 6.8.0-1014.16 USN-7089-5
Ubuntu 24.04 LTS linux-riscv 6.8.0-48.48.1 —
Ubuntu 22.04 LTS linux-aws-6.8 6.8.0-1018.19~22.04.1 USN-7089-3
Ubuntu 22.04 LTS linux-azure-6.8 6.8.0-1017.20~22.04.1 USN-7090-1
Ubuntu 22.04 LTS linux-gcp-6.8 +1 6.8.0-1017.19~22.04.1 USN-7095-1, USN-7089-1
Ubuntu 22.04 LTS linux-hwe-6.8 6.8.0-48.48~22.04.1 USN-7089-1
Ubuntu 22.04 LTS linux-lowlatency-hwe-6.8 6.8.0-48.48.3~22.04.1 USN-7089-7
Ubuntu 22.04 LTS linux-oracle-6.8 6.8.0-1015.15~22.04.1 USN-7089-3
Ubuntu 22.04 LTS linux-riscv +25 No fix yet —
Ubuntu 22.04 LTS linux-riscv-6.8 6.8.0-48.48.1~22.04.2 —
Ubuntu 20.04 LTS linux-gke +26 No fix yet —
Ubuntu 18.04 LTS linux-gcp +13 No fix yet —
Ubuntu 16.04 LTS linux-hwe-edge No fix yet —
Show 1 more (older releases, extended support, other products)
ReleasePackageFixed inAdvisory
Ubuntu Pro Realtime 24.04 LTS linux-raspi-realtime 6.8.0-2013.14 —
Ubuntu Pro Realtime 24.04 LTS linux-realtime 6.8.1-1011.11 —
ReleasePackageFixed inAdvisory
RHEL 9 rv +77 5.14.0-570.12.1.el9_6 RHSA-2025:6966
ReleasePackageFixed inAdvisory
SLES 15 SP6 kernel-64kb +6 6.4.0-150600.23.22.1 SUSE-SU-2024:3383-1
SLES 15 SP6 kernel-azure +2 6.4.0-150600.8.11.1 SUSE-SU-2024:3194-1
SLES 15 SP6 kernel-default-base 6.4.0-150600.23.22.1.150600.12.8.3 SUSE-SU-2024:3383-1
Show 3 more (older releases, extended support, other products)
ReleasePackageFixed inAdvisory
SLE Micro 6.0 kernel-default-base 6.4.0-17.1.1.51 SUSE-SU-2025:20044-1
SLE Micro 6.0 kernel-livepatch-MICRO-6-0_Update_2 +1 1-1.1 SUSE-SU-2025:20047-1, SUSE-SU-2025:20044-1
SLE Micro 6.0 kernel-rt +1 6.4.0-10.1 SUSE-SU-2025:20047-1
SLE Micro 6.0 kernel-source +2 6.4.0-19.1 SUSE-SU-2025:20044-1
SLE Live Patching 15 SP6 kernel-default 6.4.0-150600.23.22.1 SUSE-SU-2024:3383-1
SLE Live Patching 15 SP6 kernel-livepatch-SLE15-SP6-RT_Update_2 1-150600.1.3.2 SUSE-SU-2024:3195-1
SLE Live Patching 15 SP6 kernel-livepatch-SLE15-SP6_Update_4 1-150600.13.3.3 SUSE-SU-2024:3383-1
SUSE Real Time Module 15 SP6 kernel-rt +2 6.4.0-150600.10.8.3 SUSE-SU-2024:3195-1
SUSE Real Time Module 15 SP6 kernel-syms-rt 6.4.0-150600.10.8.1 SUSE-SU-2024:3195-1
ReleasePackageFixed inAdvisory
openSUSE Leap 15.6 dtb-aarch64 +10 6.4.0-150600.23.22.1 SUSE-SU-2024:3383-1
openSUSE Leap 15.6 kernel-azure +2 6.4.0-150600.8.11.1 SUSE-SU-2024:3194-1
openSUSE Leap 15.6 kernel-default-base 6.4.0-150600.23.22.1.150600.12.8.3 SUSE-SU-2024:3383-1
openSUSE Leap 15.6 kernel-rt +2 6.4.0-150600.10.8.3 SUSE-SU-2024:3195-1
openSUSE Leap 15.6 kernel-syms-rt 6.4.0-150600.10.8.1 SUSE-SU-2024:3195-1

Azure Linux

ReleasePackageFixed inAdvisory
Azure Linux 3 kernel 6.6.43.1-7 —

Oracle Linux

ReleasePackageFixed inAdvisory
Oracle Linux 9 bpftool 7.5.0-802.el9_6 ELSA-2025-6966
Oracle Linux 9 rv +28 5.14.0-570.12.1.0.1.el9_6 ELSA-2025-6966

Advisories 18

References