Severity by source
AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H
Triggering the bug requires GCC-compiled BPF with specific register allocation (AC:H); confirmed impact is kernel panic (A:H); C:L/I:L reflects theoretical but undemonstrated corruption/disclosure.
Primary rating from Vendor (Linux).
CVSS VectorVendor: Linux
Lifecycle Timeline
6DescriptionCVE.org
In the Linux kernel, the following vulnerability has been resolved:
bpf, x86: Fix per-CPU address resolution into an extended register
The destination of the per-CPU address MOV is encoded in ModRM.reg, which is extended by REX.R, but the REX prefix is built with add_1mod(), which sets REX.B. REX.B extends ModRM.rm and SIB.base, and this instruction addresses memory as disp32 with no base, so the bit has no effect at all and the high register bit is simply lost.
Every is_ereg() destination therefore resolves to the wrong register, picking whichever one shares the low three bits:
R5 -> RAX R7 -> RBP R8 -> RSI R9 -> RDI
With BPF_REG_5, whose reg2hex is 0, the emitted
65 49 03 04 25 <off> add %gs:<off>,%rax
adds the per-CPU offset to RAX rather than R8. The destination keeps the unadjusted address and RAX is clobbered, so the program goes on to dereference a pointer that was never made per-CPU:
BUG: unable to handle page fault for address: 0000607e386a8894 RIP: bpf_prog_707837aafd2aa9ae_update_percpu_data+0x93/0xc9 Call Trace: __bpf_prog_test_run_raw_tp+0x2dc/0x7d0 __flush_smp_call_function_queue+0x1e9/0xc80 Kernel panic - not syncing: Fatal exception in interrupt
R5 is the mildest of the four, aliasing a scratch register and faulting at the store. R7 aliases RBP and would corrupt the frame pointer, R8 and R9 alias the argument registers.
Use add_2mod() so the register goes through REX.R, matching how add_2reg() places it in ModRM.reg and how emit_priv_frame_ptr() hardcodes 0x4c for the same instruction with R9. Encodings for the non-extended registers are unchanged.
Problem showed up when trying to resurrect BPF_GCC CI (selftests built with BPF_GCC).
This has gone unnoticed because clang reloads the address into R1 before each per-CPU access, so the destination is never an extended register. GCC keeps several per-CPU addresses live at once, and test_progs-bpf_gcc panics the kernel in global_percpu_data/init, where the address of a .percpu variable ends up in R5.
AnalysisAI
Incorrect REX prefix encoding in the Linux kernel's BPF x86-64 JIT compiler drops the high bit of extended destination registers (R8-R15) during per-CPU address resolution, causing GS-segment offsets to be applied to the wrong register. The affected registers alias as R5→RAX, R7→RBP, R8→RSI, R9→RDI, leaving actual per-CPU pointers unadjusted and clobbering scratch registers or the frame pointer, reliably producing kernel panics and theoretically enabling memory corruption. …
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
Vulnerability AssessmentAI
| Exploitation | Exploitation requires all of the following: (1) x86-64 architecture with BPF JIT enabled (CONFIG_BPF_JIT, default on most distributions); (2) a GCC-compiled eBPF program - clang-compiled programs are immune because clang reloads per-CPU addresses into non-extended registers before each access, never placing an extended register as the MOV destination; (3) the eBPF program must hold a per-CPU address live in one of the extended registers R5, R7, R8, or R9 at the point of the per-CPU resolution instruction; (4) the caller must hold CAP_BPF or CAP_NET_ADMIN (or be root) to invoke the bpf(2) syscall. … Additional conditions and limiting factors are described in the full assessment. |
| Risk Assessment | The provided CVSS 7.8 (AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H) overstates exploitability toward code execution. … Full risk analysis with EPSS, KEV, and SSVC signal comparison available after sign-in. |
| Exploit Scenario | Full exploit scenario with step-by-step reproduction available after sign-in. |
| Remediation | Upgrade to Linux kernel 6.12.109, 6.18.50, 7.2.4, or 7.3-rc1 using the fix commits listed above. … Detailed patch versions, workarounds, and compensating controls in full report. |
Recommended ActionAI
Within 24 hours, identify systems running Linux kernel versions 6.11.x through 6.12.108, 6.18.0 through 6.18.49, or 7.0 through 7.2.3 that execute eBPF workloads (containerized applications, Kubernetes nodes, observability agents). …
Sign in for detailed remediation steps and compensating controls.
Threat intelligence, references, and detailed analysis are available after sign-in.
Share
External POC / Exploit Code
Leaving vuln.today
EUVD-2026-76493
GHSA-vx2x-82ww-5r7r