CVE-2026-98017 PUBLISHED

net/sched: defer qdisc freeing after failed creation

Assigner: Linux
Reserved: 25.09.2026 Published: 25.09.2026 Updated: 25.09.2026

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

net/sched: defer qdisc freeing after failed creation

An RTM_NEWQDISC request can make clsact bind a populated shared ingress block during ->init(), publishing an embedded mini_Qdisc to lockless readers. If the same request has an invalid TCA_RATE, estimator setup fails after ->init(); the unwind removes the pointer but synchronously frees its containing qdisc while tc_run() may still hold it.

Retire failed qdiscs through the same RCU helper as normal destruction. Inline the synchronous free into the callback now that no direct callers remain.

Metrics

CVSS Vector: CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H
CVSS Score: 7.8

AV:L - The trigger is a local rtnetlink RTM_NEWQDISC message (tc_modify_qdisc -> qdisc_create) with a clsact kind, a shared TCA_INGRESS_BLOCK and an invalid TCA_RATE. Packets only drive the reader side (tc_run), and no remote peer supplies the input that causes the bug. AC:L - The attacker controls both sides of the race: they repeat the failing clsact create, which runs qdisc_free() with no grace period, while pushing traffic through their own veth/dummy device so that tc_run() dereferences the published miniq. No outside condition is needed. PR:L - tc_modify_qdisc only needs CAP_NET_ADMIN in the netns that owns the device, which an unprivileged user gets through unshare -Urn plus a self-created veth/dummy interface. That makes it reachable as PR:L rather than requiring init-namespace root. UI:N - The attacker performs every step themselves: creating the shared block and filter, sending the failing RTM_NEWQDISC, and generating traffic. No victim action is needed. S:U - The use-after-free and any resulting privilege escalation stay inside the same kernel security authority. No hypervisor or IOMMU boundary is crossed. C:H - The mini_Qdisc embedded in the freed qdisc (a kmalloc'd object, so its slot can be reclaimed) is read by tc_run: miniq->block and miniq->filter_list are passed to tcf_classify. With a sprayed replacement object, the attacker controls these pointers, which can be used to leak kernel memory. I:H - tc_run calls mini_qdisc_bstats_cpu_update(), which writes through the cpu_bstats pointer taken from the freed object, and tcf_classify follows a filter_list the attacker can control. After reclaim, this gives a controlled write and a path to hijacking control flow. A:H - Freeing the qdisc while RCU readers in tc_run still hold its embedded miniq leads to KASAN splats and oopses when the packet path touches the freed or reallocated memory. The result is a kernel crash.

Product Status

Vendor Linux
Product Linux
Versions Default: unaffected
  • affected from 51ab2994c387c80b45caf8b8067b3f3b97771d25 to 20bf6fa34b345333971bd4464a322cce87b83f4e (excl.)
  • affected from 51ab2994c387c80b45caf8b8067b3f3b97771d25 to 156a3bab69744e9225bb9eff8c5cc53da18d5a2e (excl.)
  • affected from 51ab2994c387c80b45caf8b8067b3f3b97771d25 to 5bfe927c5b4b290fad529186218c728589b4b101 (excl.)
  • affected from 51ab2994c387c80b45caf8b8067b3f3b97771d25 to e6662f2100f8d33b0f4d0047c219efd6bba186ea (excl.)
Vendor Linux
Product Linux
Versions Default: affected
  • Version 4.16 is affected
  • unaffected from 0 to 4.16 (excl.)
  • unaffected from 6.12.111 to 6.12.* (incl.)
  • unaffected from 6.18.53 to 6.18.* (incl.)
  • unaffected from 7.2.7 to 7.2.* (incl.)
  • unaffected from 7.3-rc3 to * (incl.)

References