Skip to main content

Linux Kernel EUVDEUVD-2026-64387

| CVE-2026-74700 HIGH
2026-08-22 Linux GHSA-696w-35hf-m34q
7.8
CVSS 3.1 · Vendor: Linux
Share

Severity by source

Vendor (Linux) PRIMARY
7.8 HIGH
AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H
vuln.today AI
7.0 HIGH

Race condition exploitation requires precise concurrent timing, warranting AC:H; PR:L reflects required CAP_NET_ADMIN; AV:L confirmed by tc subsystem's local Netlink interface.

3.1 AV:L/AC:H/PR:L/UI:N/S:U/C:H/I:H/A:H
4.0 AV:L/AC:H/AT:P/PR:L/UI:N/VC:H/VI:H/VA:H/SC:N/SI:N/SA:N

Primary rating from Vendor (Linux).

CVSS VectorVendor: Linux

CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H
Attack Vector
Local
Attack Complexity
Low
Privileges Required
Low
User Interaction
None
Scope
Unchanged
Confidentiality
High
Integrity
High
Availability
High

Lifecycle Timeline

5
Analysis Generated
Aug 25, 2026 - 07:19 vuln.today
CVSS changed
Aug 25, 2026 - 06:22 NVD
7.8 (HIGH)
Patch available
Aug 22, 2026 - 16:01 EUVD
CVE Published
Aug 22, 2026 - 15:33 cve.org
UNKNOWN (no severity yet)
CVE Published
Aug 22, 2026 - 15:33 cve.org
HIGH 7.8

DescriptionCVE.org

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

net/sched: cls_api: Always acquire rtnl_lock when destroying locked classifiers

Another challenge with unlocked filters. There is a short window in tc_new_tfilter where a tcf_proto can be found and briefly referenced by a totally unrelated, unlocked classifier's request and cause a race.

Feng created a poc which created this race with two threads, one creating a u32 filter and other a flower filter in the same chain/prio:

  1. Both threads enter tc_new_tfilter, both find the chain empty, both

drop filter_chain_lock

  1. u32 finishes tcf_proto_create("u32") first, calls

tcf_chain_tp_insert_unique() -> inserts u32_tp into the chain

  1. flower finishes tcf_proto_create("flower") later, calls

tcf_chain_tp_insert_unique() -> tcf_chain_tp_find() now sees u32_tp already there, takes a reference on it, destroys flower's own tp_new and returns u32_tp to the caller.

Flower then hits the kind mismatch check (because it requested for kind "flower" but tp->ops->kind is "u32") and goes through the errout path which calls tcf_proto_put() on u32_tp. If the u32 thread has already gone through its own errout (its change() call failed on the PoC's empty options) and dropped its create and insert refs, flower's put is the last one and drops u32_tp's refcnt to zero.

At this point tp->ops->destroy() runs in a context that never took rtnl_lock. When that happens, it might cause a UAF like the following (illustrated by the PoC):

[ +0.000710] BUG: KASAN: slab-use-after-free in u32_init (net/sched/cls_u32.c:393) [ +0.000281] Read of size 8 at addr ffff888120022f00 by task poc_feng_xue/524

Call Trace: u32_init (net/sched/cls_u32.c:393) tc_new_tfilter (net/sched/cls_api.c:2378)

Allocated by task 526: u32_init (net/sched/cls_u32.c:378) tc_new_tfilter (net/sched/cls_api.c:2378)

Freed by task 522: kfree u32_destroy (net/sched/cls_u32.c:662) tcf_proto_destroy (net/sched/cls_api.c:446) tcf_proto_put (net/sched/cls_api.c:459) tc_new_tfilter (net/sched/cls_api.c:2459)

Fix this by having tcf_proto_destroy() take rtnl_lock around tp->ops->destroy() for locked classifiers whenever rtnl is not held.

To explain why I used a temp variable "not_lockless" I'd like to point to a semi-related note on rtnl_held vs TCF_PROTO_OPS_DOIT_UNLOCKED (adding here for future cleanup if deemed necessary): The rtnl_held parameter and the TCF_PROTO_OPS_DOIT_UNLOCKED flag are redundant sources of truth for whether rtnl_lock is held. Among the nine classifier destroy(..rtnl_held..) callbacks, only flower consults the rtnl_held parameter which it propagates to tc_setup_cb_destroy() and tc_setup_cb_call(). The other eight (u32, flow, bpf, cgroup, route, basic, fw, mall) ignore it entirely;-> those that call tc_setup_cb_destroy() (u32, bpf, mall) hardcode true always instead of forwarding the parameter.

A future cleanup should remove the rtnl_held parameter from the destroy callback signature entirely and have callers rely solely on their knowledge whether they are running in an unlocked context.

AnalysisAI

Use-after-free in the Linux kernel's traffic control classifier API (net/sched/cls_api) allows a local attacker with CAP_NET_ADMIN to corrupt kernel memory by racing two concurrent tc_new_tfilter() calls targeting the same chain and priority with different classifier types. A proof-of-concept is referenced in the upstream kernel commit but is not independently confirmed as publicly released. …

Unlock full vulnerability intelligence

  • Risk assessment & exploitation conditions
  • Attack chain visualization
  • Remediation with exact patch versions
  • Threat intelligence from 22 sources
  • Personal watchlist & email alerts

Free forever · No credit card required

Attack ChainAIDerived

Hypothetical attack flow derived from CVE metadata

Recon
Obtain CAP_NET_ADMIN (direct or via user namespace)
Delivery
Spawn two concurrent tc_new_tfilter threads on same chain/priority
Exploit
Race through tcf_chain_tp_insert_unique collision
Install
Losing thread holds last reference to winning thread's tcf_proto
C2
tcf_proto_put() drops refcount to zero
Execute
u32_destroy() executes without rtnl_lock
Impact
Use-after-free yields kernel memory corruption or privilege escalation

Vulnerability AssessmentAI

Exploitation Exploitation requires local system access and the CAP_NET_ADMIN capability, which is needed to create or modify tc (traffic control) filters via the Netlink rtnetlink interface. … Additional conditions and limiting factors are described in the full assessment.
Risk Assessment The NVD CVSS 3.1 score of 7.8 (High) with AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H correctly anchors this as a local privilege escalation path, though assigning AC:L to a kernel race condition is arguably generous - CVSS guidance reserves AC:H for scenarios requiring specific timing or preparatory conditions, which a race does satisfy; the PoC's reproducibility is the key factor pulling AC toward Low. … Full risk analysis with EPSS, KEV, and SSVC signal comparison available after sign-in.
Exploit Scenario A local attacker with CAP_NET_ADMIN privilege spawns two threads simultaneously - one issuing a tc filter creation request for classifier type 'u32' and the other for 'flower' - both targeting the same qdisc chain and priority. The race causes the flower thread to acquire a reference on the u32 tcf_proto after the u32 thread's own error path has already released its references, making flower's subsequent tcf_proto_put() the last one and triggering u32_destroy() without rtnl_lock held, producing a UAF. …
Remediation Upgrade to a patched Linux kernel release: 6.6.152 or later on the 6.6 stable branch, 6.12.104 or later on the 6.12 branch, 6.18.45 or later on the 6.18 branch, 7.1.9 or later on the 7.1 branch, or 7.2 and later on mainline. … Detailed patch versions, workarounds, and compensating controls in full report.

Recommended ActionAI

Within 24 hours, inventory Linux systems running vulnerable kernel versions and verify current kernel builds using your asset management tools. …

Sign in for detailed remediation steps and compensating controls.

Threat intelligence, references, and detailed analysis are available after sign-in.

Share

EUVD-2026-64387 vulnerability details – vuln.today

This site uses cookies essential for authentication and security. No tracking or analytics cookies are used. Privacy Policy