Skip to content
Noroxi
CVE-2025-71066· NVD / CVE Program· CNA Linux

net/sched: ets: Always remove class from active list before deleting in ets_qdisc_change

In the Linux kernel, the following vulnerability has been resolved: net/sched: ets: Always remove class from active list before deleting in ets_qdisc_change zdi-disclosures@trendmicro.com says: The vulnerability is a race condition between `ets_qdisc_dequeue` and `ets_qdisc_change`. It leads to UAF on `struct Qdisc` object. Attacker requires the capability to create new user and network namespace in order to trigger the bug. See my additional commentary at the end of the analysis. Analysis: static int ets_qdisc_change(struct Qdisc *sch, struct nlattr *opt, struct netlink_ext_ack *extack) { ... // (1) this lock is preventing .change handler (`ets_qdisc_change`) //to race with .dequeue handler (`ets_qdisc_dequeue`) sch_tree_lock(sch); for (i = nbands; i < oldbands; i++) { if (i >= q->nstrict && q->classes[i].qdisc->q.qlen) list_del_init(&q->classes[i].alist); qdisc_purge_queue(q->classes[i].qdisc); } WRITE_ONCE(q->nbands, nbands); for (i = nstrict; i < q->nstrict; i++) { if (q->classes[i].qdisc->q.qlen) { // (2) the class is added to the q->active list_add_tail(&q->classes[i].alist, &q->active); q->classes[i].deficit = quanta[i]; } } WRITE_ONCE(q->nstrict, nstrict); memcpy(q->prio2band, priomap, sizeof(priomap)); for (i = 0; i < q->nbands; i++) WRITE_ONCE(q->classes[i].quantum, quanta[i]); for (i = oldbands; i < q->nbands; i++) { q->classes[i].qdisc = queues[i]; if (q->classes[i].qdisc != &noop_qdisc) qdisc_hash_add(q->classes[i].qdisc, true); } // (3) the qdisc is unlocked, now dequeue can be called in parallel // to the rest of .change handler sch_tree_unlock(sch); ets_offload_change(sch); for (i = q->nbands; i < oldbands; i++) { // (4) we're reducing the refcount for our class's qdisc and // freeing it qdisc_put(q->classes[i].qdisc); // (5) If we call .dequeue between (4) and (5), we will have // a strong UAF and we can control RIP q->classes[i].qdisc = NULL; WRITE_ONCE(q->classes[i].quantum, 0); q->classes[i].deficit = 0; gnet_stats_basic_sync_init(&q->classes[i].bstats); memset(&q->classes[i].qstats, 0, sizeof(q->classes[i].qstats)); } return 0; } Comment: This happens because some of the classes have their qdiscs assigned to NULL, but remain in the active list. This commit fixes this issue by always removing the class from the active list before deleting and freeing its associated qdisc Reproducer Steps (trimmed version of what was sent by zdi-disclosures@trendmicro.com) ``` DEV="${DEV:-lo}" ROOT_HANDLE="${ROOT_HANDLE:-1:}" BAND2_HANDLE="${BAND2_HANDLE:-20:}" # child under 1:2 PING_BYTES="${PING_BYTES:-48}" PING_COUNT="${PING_COUNT:-200000}" PING_DST="${PING_DST:-127.0.0.1}" SLOW_TBF_RATE="${SLOW_TBF_RATE:-8bit}" SLOW_TBF_BURST="${SLOW_TBF_BURST:-100b}" SLOW_TBF_LAT="${SLOW_TBF_LAT:-1s}" cleanup() { tc qdisc del dev "$DEV" root 2>/dev/null } trap cleanup EXIT ip link set "$DEV" up tc qdisc del dev "$DEV" root 2>/dev/null || true tc qdisc add dev "$DEV" root handle "$ROOT_HANDLE" ets bands 2 strict 2 tc qdisc add dev "$DEV" parent 1:2 handle "$BAND2_HANDLE" \ tbf rate "$SLOW_TBF_RATE" burst "$SLOW_TBF_BURST" latency "$SLOW_TBF_LAT" tc filter add dev "$DEV" parent 1: protocol all prio 1 u32 match u32 0 0 flowid 1:2 tc -s qdisc ls dev $DEV ping -I "$DEV" -f -c "$PING_COUNT" -s "$PING_BYTES" -W 0.001 "$PING_DST" \ >/dev/null 2>&1 & tc qdisc change dev "$DEV" root handle "$ROOT_HANDLE" ets bands 2 strict 0 tc qdisc change dev "$DEV" root handle "$ROOT_HANDLE" ets bands 2 strict 2 tc -s qdisc ls dev $DEV tc qdisc del dev "$DEV" parent ---truncated---

HighCVSS 7.8 · v3.1—No exploit Fix available
Published
Jan 13, 2026
Updated
Aug 5, 2026
EPSS
0.2% · 6th percentile
Follow this CVE

Sign in to follow · You’ll be notified if a followed record enters KEV, gets an exploit or is updated.

Report tools

JSON

Action score

31

Monitor

Low priority for now.

CVSS
31 / 40 · 7.8 / 10
CISA KEV
0 / 30 · Not listed
EPSS
0 / 30 · 0.2%

CISA SSVC decision

Exploitation
none
Automatable
no
Technical impact
total

Vulnrichment: CISA's decision-tree inputs.

CNA vs NVD score

NVD
—
CNA · Linux
7.8
NVD has not scored this yet; the score shown is the CNA’s.

The score given by the assigning authority versus NVD’s independent score. A gap means the severity is contested.

Affected systems

—

Versions reported by the vendor

Affected version ranges reported by the assigning authority (Linux). Independent of NVD's CPE analysis and usually ahead of it.

  • Linux Linux

    • 5.16affected
    • ae2659d2c670252759ee9c823c4e039c0e05a6f2 and later · before 062d5d544e564473450d72e6af83077c2b2ff7c3affected · git
    • e25bdbc7e951ae5728fee1f4c09485df113d013c and later · before c7f6e7cc14df72b997258216e99d897d2df0dbbdaffected · git
    • de6d25924c2a8c2988c6a385990cafbe742061bf and later · before a75d617a4ef08682f5cfaadc01d5141c87e019c9affected · git
    • de6d25924c2a8c2988c6a385990cafbe742061bf and later · before 9987cda315c08f63a02423fa2f9a1f6602c861a0affected · git
    • de6d25924c2a8c2988c6a385990cafbe742061bf and later · before 06bfb66a7c8b45e3fed01351a4b087410ae5ef39affected · git
    • de6d25924c2a8c2988c6a385990cafbe742061bf and later · before 45466141da3c98a0c5fa88be0bc14b4b6a4bd75caffected · git
    • de6d25924c2a8c2988c6a385990cafbe742061bf and later · before ce052b9402e461a9aded599f5b47e76bc727f7deaffected · git
    • 5.10.83 and later · before 5.10.248affected · semver
    • 5.15.6 and later · before 5.15.198affected · semver

Package-level exposure

OSV and GitHub Advisory data: ecosystem, package and range. SBOM matching uses this table.

EcosystemPackageAffected rangeFix
AlmaLinux:10kernelbefore 6.12.0-211.32.1.el10_26.12.0-211.32.1.el10_2
AlmaLinux:10kernel-64kbefore 6.12.0-211.32.1.el10_26.12.0-211.32.1.el10_2
AlmaLinux:10kernel-64k-corebefore 6.12.0-211.32.1.el10_26.12.0-211.32.1.el10_2
AlmaLinux:10kernel-64k-debugbefore 6.12.0-211.32.1.el10_26.12.0-211.32.1.el10_2
AlmaLinux:10kernel-64k-debug-corebefore 6.12.0-211.32.1.el10_26.12.0-211.32.1.el10_2
AlmaLinux:10kernel-64k-debug-develbefore 6.12.0-211.32.1.el10_26.12.0-211.32.1.el10_2
AlmaLinux:10kernel-64k-debug-devel-matchedbefore 6.12.0-211.32.1.el10_26.12.0-211.32.1.el10_2
AlmaLinux:10kernel-64k-debug-modulesbefore 6.12.0-211.32.1.el10_26.12.0-211.32.1.el10_2
AlmaLinux:10kernel-64k-debug-modules-corebefore 6.12.0-211.32.1.el10_26.12.0-211.32.1.el10_2
AlmaLinux:10kernel-64k-debug-modules-extrabefore 6.12.0-211.32.1.el10_26.12.0-211.32.1.el10_2
AlmaLinux:10kernel-64k-develbefore 6.12.0-211.32.1.el10_26.12.0-211.32.1.el10_2
AlmaLinux:10kernel-64k-devel-matchedbefore 6.12.0-211.32.1.el10_26.12.0-211.32.1.el10_2
AlmaLinux:10kernel-64k-modulesbefore 6.12.0-211.32.1.el10_26.12.0-211.32.1.el10_2
AlmaLinux:10kernel-64k-modules-corebefore 6.12.0-211.32.1.el10_26.12.0-211.32.1.el10_2
AlmaLinux:10kernel-64k-modules-extrabefore 6.12.0-211.32.1.el10_26.12.0-211.32.1.el10_2
AlmaLinux:10kernel-abi-stablelistsbefore 6.12.0-211.32.1.el10_26.12.0-211.32.1.el10_2
AlmaLinux:10kernel-corebefore 6.12.0-211.32.1.el10_26.12.0-211.32.1.el10_2
AlmaLinux:10kernel-cross-headersbefore 6.12.0-211.32.1.el10_26.12.0-211.32.1.el10_2
AlmaLinux:10kernel-debugbefore 6.12.0-211.32.1.el10_26.12.0-211.32.1.el10_2
AlmaLinux:10kernel-debug-corebefore 6.12.0-211.32.1.el10_26.12.0-211.32.1.el10_2
AlmaLinux:10kernel-debug-develbefore 6.12.0-211.32.1.el10_26.12.0-211.32.1.el10_2
AlmaLinux:10kernel-debug-devel-matchedbefore 6.12.0-211.32.1.el10_26.12.0-211.32.1.el10_2
AlmaLinux:10kernel-debug-modulesbefore 6.12.0-211.32.1.el10_26.12.0-211.32.1.el10_2
AlmaLinux:10kernel-debug-modules-corebefore 6.12.0-211.32.1.el10_26.12.0-211.32.1.el10_2

+96

Other highest-scoring records for the same primary product.

  • CVE-2026-74705udp: fix potential use-after-free in tunnel segmentation
    40Plan
  • CVE-2026-74612veth: fix skb length accounting after XDP frag adjustment
    40Plan
  • CVE-2026-74475vxlan: use neigh_ha_snapshot() in route_shortcircuit()
    40Plan
  • CVE-2026-74309vdpa/octeon_ep: fix IRQ-to-ring mapping in interrupt handler
    40Plan
  • CVE-2026-74280crypto: marvell/octeontx - fix DMA cleanup using wrong loop index
    40Plan
  • CVE-2026-74279crypto: cavium/cpt - fix DMA cleanup using wrong loop index
    40Plan

Remediation

Which version to upgrade to

Fix versions compiled from the vendor, package registries and Microsoft. Verify the vendor's note before upgrading.

Product / packageFixed versionSource
Linux Linux062d5d544e564473450d72e6af83077c2b2ff7c3Vendor (CNA)
Linux Linux06bfb66a7c8b45e3fed01351a4b087410ae5ef39Vendor (CNA)
Linux Linux45466141da3c98a0c5fa88be0bc14b4b6a4bd75cVendor (CNA)
Linux Linux5.10.248Vendor (CNA)
Linux Linux5.15.198Vendor (CNA)
Linux Linux9987cda315c08f63a02423fa2f9a1f6602c861a0Vendor (CNA)
Linux Linuxa75d617a4ef08682f5cfaadc01d5141c87e019c9Vendor (CNA)
Linux Linuxc7f6e7cc14df72b997258216e99d897d2df0dbbdVendor (CNA)
Linux Linuxce052b9402e461a9aded599f5b47e76bc727f7deVendor (CNA)
azl3 kernel 6.6.119.3-3 on Azure Linux 3.06.6.121.1-1 · CBL-Mariner ReleasesMicrosoft (MSRC)
almalinux:kernel6.12.0-211.32.1.el10_2 · AlmaLinux:10Package registry (OSV)
almalinux:kernel-64k6.12.0-211.32.1.el10_2 · AlmaLinux:10Package registry (OSV)
almalinux:kernel-64k-core6.12.0-211.32.1.el10_2 · AlmaLinux:10Package registry (OSV)
almalinux:kernel-64k-debug6.12.0-211.32.1.el10_2 · AlmaLinux:10Package registry (OSV)
almalinux:kernel-64k-debug-core6.12.0-211.32.1.el10_2 · AlmaLinux:10Package registry (OSV)
almalinux:kernel-64k-debug-devel6.12.0-211.32.1.el10_2 · AlmaLinux:10Package registry (OSV)
almalinux:kernel-64k-debug-devel-matched6.12.0-211.32.1.el10_2 · AlmaLinux:10Package registry (OSV)
almalinux:kernel-64k-debug-modules6.12.0-211.32.1.el10_2 · AlmaLinux:10Package registry (OSV)
almalinux:kernel-64k-debug-modules-core6.12.0-211.32.1.el10_2 · AlmaLinux:10Package registry (OSV)
almalinux:kernel-64k-debug-modules-extra6.12.0-211.32.1.el10_2 · AlmaLinux:10Package registry (OSV)
almalinux:kernel-64k-devel6.12.0-211.32.1.el10_2 · AlmaLinux:10Package registry (OSV)
almalinux:kernel-64k-devel-matched6.12.0-211.32.1.el10_2 · AlmaLinux:10Package registry (OSV)
debian:linux6.1.162-1 · Debian:12Package registry (OSV)
opensuse:dtb-aarch646.4.0-150600.23.92.1 · openSUSE:Leap 15.6Package registry (OSV)
opensuse:kernel-64kb6.4.0-150600.23.92.1 · openSUSE:Leap 15.6Package registry (OSV)
opensuse:kernel-debug6.4.0-150600.23.92.1 · openSUSE:Leap 15.6Package registry (OSV)
red hat:kernel-64k-debug-debuginfo0:6.12.0-211.32.1.el10_2 · Red Hat:enterprise_linux:10.2Package registry (OSV)
red hat:kernel-64k-debug-devel0:6.12.0-211.32.1.el10_2 · Red Hat:enterprise_linux:10.2Package registry (OSV)
red hat:kernel-64k-debug-devel-matched0:6.12.0-211.32.1.el10_2 · Red Hat:enterprise_linux:10.2Package registry (OSV)
red hat:kernel-64k-debuginfo0:6.12.0-211.32.1.el10_2 · Red Hat:enterprise_linux:10.2Package registry (OSV)

+30

Exploit status

No known public exploit

No public exploit has been observed yet. That doesn't mean you're safe, only that the bar is a little higher.

Research context

For pentesters and researchers: attack profile, score disagreement, timeline, patch commits, credits, variant and chain candidates, bug bounty scope. All derived from existing data; no exploit code.

Timeline

From publication to today: proof of concept, Metasploit module, CISA KEV and fix record. Dates are as reported by the sources.

No dated events beyond publication.

EPSS, last 120 days

FIRST EPSS daily score; only changes of 0.01 or more are recorded (step chart).

Patch and commit links

Commit, PR and diff links among the references. A starting point for patch-diffing and variant hunting; fixes, not exploits.

No commit or PR link among the references.

Finders, reporters and analysts named in the CNA record. Click a name for that researcher’s other records.

No credits in the CNA record.

Variant candidates

Same product, same weakness class, within 18 months. If the patch missed the root cause, the sibling bug is here.

No nightly-computed relations.

Chain candidates

An authentication bypass and a privilege-requiring bug in the same product, published close together: combined they may become an unauthenticated path.

—

Bug bounty scope

No known public program.

Source: bounty-targets-data (public HackerOne, Bugcrowd, Intigriti, YesWeHack listings).

Technical details

Attack conditions

  • Someone with local access to the system can trigger it.
  • A low-privileged account is enough.
  • No user action is required.
  • No special conditions are required; it is repeatable.

If successful

Confidentiality
high · data can be read
Integrity
high · data or configuration can be modified
Availability
high · the service can be disrupted
Attack vector
Local
Attack complexity
Low
Privileges required
Low
User interaction
None
Scope
Unchanged
Confidentiality impact
High
Integrity impact
High
Availability impact
High

CVSS vector

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

nvd-secondary

Attack context

MITRE CAPEC attack patterns and ATT&CK techniques for this weakness class (CWE). A starting point for detection rules and threat hunting.

Noroxi analysis

No Noroxi analysis for this record yet

We don't hand-write analysis for all 385,000+ vulnerabilities; that wouldn't be honest. For notable, high-impact vulnerabilities our team writes the mechanism, detection and remediation steps.

We use this product, ask for help

Change log

  1. Fix✗ → ✓

For records you follow, these changes also arrive as notifications. →

References

All records