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.
CVSS Details
- CVSS 3.1 Base Score: 7.8
- CVSS 3.1 Vector: (CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H)
Covered by Rapid7
| Product | Vendor Advisory | Solution File | Added | Published |
|---|---|---|---|---|
| Amazon_linux_2023 | — | Upgrade kernel6.12-tools-debuginfoUpgrade perfUpgrade python3-perf6.12-debuginfoUpgrade perf6.12-debuginfoUpgrade kernel-headersUpgrade kernel6.12-modules-extraUpgrade kernel6.12-debuginfo-common-aarch64Upgrade perf-debuginfoUpgrade bpftool6.12-debuginfoUpgrade kernel-tools-develUpgrade kernel-toolsUpgrade kernel-modules-extra-commonUpgrade python3-perfUpgrade kernel6.12-debuginfoUpgrade bpftool6.12Upgrade kernel-debuginfoUpgrade kernel6.12Upgrade kernel6.12-debuginfo-common-x86_64Upgrade kernel-debuginfo-common-aarch64Upgrade kernel-develUpgrade perf6.12Upgrade kernel6.12-modules-extra-commonUpgrade bpftool-debuginfoUpgrade kernel6.12-develUpgrade kernelUpgrade kernel-modules-extraUpgrade python3-perf6.12Upgrade kernel6.12-toolsUpgrade kernel-tools-debuginfoUpgrade kernel-debuginfo-common-x86_64Upgrade kernel6.12-headersUpgrade kernel-livepatch-6.12.100-125.179Upgrade kernel6.12-tools-develUpgrade python3-perf-debuginfoUpgrade kernel-livepatch-6.1.180-225.360Upgrade bpftool | Aug 18, 2026 | Jul 25, 2026 |
| Debian | — | Upgrade linux-6.1Upgrade linux-6.12Upgrade linux | Aug 2, 2026 | Aug 2, 2026 |
| Redhat_linux | — | No solution exists | Jul 30, 2026 | Jul 25, 2026 |
| Ubuntu | — | Upgrade linux-image-generic-64kUpgrade linux-image-gke-7.0Upgrade linux-image-7.0.0-1006-gkeUpgrade linux-image-raspi-realtime-7.0Upgrade linux-image-nvidia-64k-hwe-26.04Upgrade linux-image-7.0.0-1011-oracle-64kUpgrade linux-image-realtime-7.0Upgrade linux-image-realtime-hwe-26.04Upgrade linux-image-ibm-7.0Upgrade linux-image-gke-hwe-26.04Upgrade linux-image-virtualUpgrade linux-image-realtime-64k-7.0Upgrade linux-image-gcp-64k-7.0Upgrade linux-image-nvidia-bos-7.0Upgrade linux-image-generic-64k-hwe-26.04Upgrade linux-image-realtime-64kUpgrade linux-image-nvidiaUpgrade linux-image-virtual-7.0Upgrade linux-image-gke-64k-hwe-26.04Upgrade linux-image-nvidia-bos-64kUpgrade linux-image-7.0.0-31-realtime-64kUpgrade linux-image-7.0.0-1019-raspiUpgrade linux-image-gkeUpgrade linux-image-7.0.0-2018-nvidia-bosUpgrade linux-image-7.0.0-1018-nvidia-64kUpgrade linux-image-7.0.0-31-generic-64kUpgrade linux-image-virtual-hwe-24.04Upgrade linux-image-aws-64kUpgrade linux-image-aws-64k-7.0Upgrade linux-image-nvidia-hwe-26.04Upgrade linux-image-genericUpgrade linux-image-7.0.0-1014-azureUpgrade linux-image-oracleUpgrade linux-image-7.0.0-1006-gke-64kUpgrade linux-image-7.0.0-1013-oemUpgrade linux-image-7.0.0-1019-raspi-realtimeUpgrade linux-image-realtimeUpgrade linux-image-generic-64k-7.0Upgrade linux-image-azure-lts-26.04Upgrade linux-image-aws-7.0Upgrade linux-image-gcp-64kUpgrade linux-image-nvidia-7.0Upgrade linux-image-realtime-64k-hwe-26.04Upgrade linux-image-raspiUpgrade linux-image-generic-7.0Upgrade linux-image-7.0.0-1018-nvidiaUpgrade linux-image-7.0.0-1013-ibmUpgrade linux-image-generic-hwe-26.04Upgrade linux-image-oracle-64kUpgrade linux-image-oem-26.04bUpgrade linux-image-azureUpgrade linux-image-7.0.0-2018-nvidia-bos-64kUpgrade linux-image-7.0.0-1011-gcp-64kUpgrade linux-image-7.0.0-1011-oracleUpgrade linux-image-oem-7.0Upgrade linux-image-oem-26.04Upgrade linux-image-nvidia-64kUpgrade linux-image-gke-64kUpgrade linux-image-generic-hwe-24.04Upgrade linux-image-generic-64k-hwe-24.04Upgrade linux-image-gcpUpgrade linux-image-azure-7.0Upgrade linux-image-gcp-7.0Upgrade linux-image-nvidia-64k-7.0Upgrade linux-image-gke-64k-7.0Upgrade linux-image-7.0.0-1012-awsUpgrade linux-image-7.0.0-1011-gcpUpgrade linux-image-raspi-realtimeUpgrade linux-image-nvidia-bos-64k-7.0Upgrade linux-image-7.0.0-31-genericUpgrade linux-image-oem-26.04aUpgrade linux-image-raspi-7.0Upgrade linux-image-nvidia-bosUpgrade linux-image-ibmUpgrade linux-image-awsUpgrade linux-image-virtual-hwe-26.04Upgrade linux-image-7.0.0-1012-aws-64kUpgrade linux-image-7.0.0-31-realtimeUpgrade linux-image-oracle-7.0Upgrade linux-image-oracle-64k-7.0 | Sep 14, 2026 | Sep 7, 2026 |
| Vmware Photon_os | — | Use 'tdnf update' to upgrade all packages to the latest version. | Aug 14, 2026 | Jul 25, 2026 |
Prioritise with Active Threat Intelligence
With curated Threat Intelligence, you can see which vulnerabilities truly put you at risk, prioritize what matters most, and act before attackers do.
Explore Intelligence Hub