Skip to main content

Linux Kernel CVE-2026-64352

| EUVDEUVD-2026-48896 HIGH
Use After Free (CWE-416)
2026-07-25 Linux GHSA-p2wc-grc5-cwhm
High
Disputed · 7.8 NVD
Share

Severity by source

Sources disagree (Low–High)
NVD PRIMARY
7.8 HIGH
AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H
vuln.today AI
2.5 LOW

Requires CAP_BPF and a debug kernel (AC:H); confirmed impact is lockdep console spam (A:L) only, no UAF demonstrated.

3.1 AV:L/AC:H/PR:L/UI:N/S:U/C:N/I:N/A:L
4.0 AV:L/AC:H/AT:P/PR:L/UI:N/VC:N/VI:N/VA:L/SC:N/SI:N/SA:N
SUSE
5.5 MEDIUM
AV:L/AC:L/PR:L/UI:N/S:U/C:N/I:N/A:H
Red Hat
5.5 LOW
qualitative

vuln.today treats the vendor’s rating as authoritative. A higher third-party CVSS (e.g. CISA-ADP) is shown for transparency but does not drive the headline severity.

CVSS VectorNVD

Attack Vector
Local
Attack Complexity
Low
Privileges Required
Low
User Interaction
None
Scope
Unchanged
Confidentiality
High
Integrity
High
Availability
High

Lifecycle Timeline

6
Metadata Corrected
Sep 03, 2026 - 16:40 vuln.today
tag: Information Disclosure removed
Analysis Generated
Sep 03, 2026 - 16:14 vuln.today
CVSS changed
Sep 03, 2026 - 16:07 NVD
7.8 (HIGH)
Patch available
Jul 25, 2026 - 11:18 EUVD
CVE Published
Jul 25, 2026 - 08:50 cve.org
UNKNOWN (no severity yet)
CVE Published
Jul 25, 2026 - 08:50 nvd
HIGH 7.8

DescriptionNVD

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

bpf: Allow LPM map access from sleepable BPF programs

trie_lookup_elem() annotates its rcu_dereference_check() walks with only rcu_read_lock_bh_held(). Because rcu_dereference_check(p, c) resolves to "c || rcu_read_lock_held()", this passes for XDP/NAPI and classic RCU readers but fails for sleepable BPF programs, which enter via __bpf_prog_enter_sleepable() and hold only rcu_read_lock_trace().

trie_update_elem() and trie_delete_elem() have the same problem in a different form: they walk the trie with plain rcu_dereference(), which asserts rcu_read_lock_held() unconditionally. Both are reachable from sleepable BPF programs via the bpf_map_update_elem / bpf_map_delete_elem helpers, and from the syscall path under classic rcu_read_lock(). In the writer paths the trie is actually protected by trie->lock (an rqspinlock taken across the walk); we never relied on the RCU read-side lock to keep nodes alive there.

A sleepable LSM hook that ends up touching an LPM trie therefore triggers lockdep on debug kernels:

========= WARNING: suspicious RCU usage 7.1.0-... Tainted: G E ----------------------------- kernel/bpf/lpm_trie.c:249 suspicious rcu_dereference_check() usage! 1 lock held by net_tests/540: #0: (rcu_tasks_trace_srcu_struct){....}-{0:0}, at: __bpf_prog_enter_sleepable+0x26/0x280 Call Trace: dump_stack_lvl lockdep_rcu_suspicious trie_lookup_elem bpf_prog_..._enforce_security_socket_connect bpf_trampoline_... security_socket_connect __sys_connect do_syscall_64

This is lockdep-only -- no UAF, since Tasks Trace RCU does serialize against the trie's reclaim path -- but it spams the console once per distinct callsite on every debug kernel running a sleepable BPF LSM that touches an LPM trie, which is increasingly common.

For the lookup path, switch the rcu_dereference_check() annotation from rcu_read_lock_bh_held() to bpf_rcu_lock_held(), which accepts all three contexts (classic, BH, Tasks Trace). Other map types already follow this convention.

For trie_update_elem() and trie_delete_elem(), annotate the walks as rcu_dereference_protected(*p, 1) -- matching trie_free() in the same file -- since trie->lock is held across the walk. rqspinlock has no lockdep_map, so the predicate degenerates to '1' rather than lockdep_is_held(&trie->lock); the protection is real but not machine-verifiable. trie_get_next_key() also uses bare rcu_dereference() but is reachable only from the BPF syscall, which holds classic rcu_read_lock() before dispatching, so it is left untouched.

AnalysisAI

Incorrect RCU lock annotations in the Linux kernel's BPF LPM trie map implementation (kernel/bpf/lpm_trie.c) cause lockdep false positives on debug kernels when sleepable BPF programs access BPF_MAP_TYPE_LPM_TRIE maps via lookup, update, or delete operations. The mismatch arises because sleepable BPF programs hold rcu_read_lock_trace() while the trie code asserts rcu_read_lock_bh_held() or rcu_read_lock_held(), producing repeated 'suspicious RCU usage' kernel warnings per distinct callsite. The Linux kernel developers explicitly state no actual use-after-free occurs, since Tasks Trace RCU already serializes against trie node reclaim; however, the incorrect annotation undermines lockdep's ability to detect future regressions and is increasingly impactful as sleepable BPF LSM programs become common in production security tooling. No public exploit exists and no CISA KEV listing has been issued.

Technical ContextAI

The Linux kernel BPF subsystem provides LPM (Longest Prefix Match) trie maps (BPF_MAP_TYPE_LPM_TRIE) used heavily for efficient IP prefix lookups in network filtering and security enforcement programs. Three distinct RCU read-side contexts exist: classic rcu_read_lock(), BH-disabled rcu_read_lock_bh(), and the sleepable-context rcu_read_lock_trace() used by Tasks Trace RCU. The rcu_dereference_check(p, c) macro resolves to 'c || rcu_read_lock_held()', so it accepts classic and BH readers but silently rejects Tasks Trace holders - which is exactly the context sleepable BPF programs enter via __bpf_prog_enter_sleepable(). CWE-416 (Use-After-Free) reflects the theoretical risk that an incorrectly annotated RCU pointer dereference could eventually permit a race against node reclaim if the synchronization model changes; the annotation itself is the machine-verifiable contract protecting against that class of bug. The fix applies bpf_rcu_lock_held() to the lookup path (already the convention used by other BPF map types) and rcu_dereference_protected(*p, 1) to writer paths that hold trie->lock (an rqspinlock without a lockdep map), consistent with the existing trie_free() pattern in the same file. Affected CPE per EUVD: cpe:2.3:a:linux:linux:* from commit 694cea395fded onward through each stable branch's respective fix commit.

RemediationAI

Upgrade to a patched Linux kernel release appropriate to the deployed series: 5.15.212, 6.1.178, 6.6.145, 6.12.97, 6.18.40, 7.1.4, or 7.2-rc1 (or any later release in those series). Upstream patch commits are available at https://git.kernel.org/stable/c/304ca50582f0c047370f85e13caec456f78c9fcc (6.12.x), https://git.kernel.org/stable/c/f0967d4f1ba4323a3cb7dc8fdba74dd3a8caaf04 (6.6.x), and additional branch-specific commits listed in the CVE references. Distribution users should apply kernel updates from their vendor's security channel rather than building from source. As an interim compensating control, operators can avoid loading sleepable BPF programs (BPF_F_SLEEPABLE) that access LPM trie maps - this prevents the lockdep path from triggering - though this trades off BPF LSM capability. Alternatively, disabling lockdep (CONFIG_PROVE_LOCKING=n) on non-debug production kernels eliminates the console spam without restricting BPF functionality, though this removes a valuable concurrency-bug detector. No patch-free mitigation fully addresses the underlying annotation incorrectness.

Vendor StatusVendor

SUSE

Severity: Moderate
Product Status
openSUSE Tumbleweed Fixed
SUSE Linux Enterprise Desktop 15 SP7 Affected
SUSE Linux Enterprise Desktop 15 SP7 Affected
SUSE Linux Enterprise High Availability Extension 15 SP7 Affected
SUSE Linux Enterprise High Availability Extension 15 SP7 Affected

Share

CVE-2026-64352 vulnerability details – vuln.today

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