Look up another CVE · open CVE-2025-39990 in the interactive tracker
CVE-2025-39990
bpf: Check the helper function is valid in get_helper_proto
Published 2025-10-15 (12 months ago) by the Linux kernel CNA. Subsystem kernel/bpf. Debian urgency: not yet assigned.
What to do, per Debian release
Debian's own status for CVE-2025-39990 in every release this site tracks, and what each one means in practice. Every status below is the one the Debian Security Team publishes for this CVE. source
| Release | Status | Version | What this means |
|---|---|---|---|
| Debian 12bookworm | vulnerable | 6.1.190-1 | No fix published anywhere yet, neither in Debian nor upstream for the series bookworm tracks. Watch the Debian tracker page for this CVE. Advisories for bookworm have historically landed a median of 23 days after publication. |
| Debian 13trixie | fixed | 6.12.57-1 | Update the kernel and reboot. Fixed in 6.12.57-1. A running kernel keeps the old code until the machine restarts. |
| Debian 14forky | fixed | 6.16.10-1 | Update the kernel and reboot. Fixed in 6.16.10-1. A running kernel keeps the old code until the machine restarts. |
| Debian unstablesid | fixed | 6.16.10-1 | Update the kernel and reboot. Fixed in 6.16.10-1. A running kernel keeps the old code until the machine restarts. |
The vulnerability
What the bug is
kernel test robot reported verifier bug [1] where the helper func pointer could be NULL due to disabled config option. As Alexei suggested we could check on that in get_helper_proto directly. Marking tail_call helper func with BPF_PTR_POISON, because it is unused by design. [1] https://lore.kernel.org/oe-lkp/202507160818.68358831-lkp@intel.com
Where it lives
The fix touches these files. If the subsystem is one you do not use, the practical exposure is lower, though the package is still the vulnerable one.
kernel/bpf/core.c
kernel/bpf/verifier.c
- What this is
- BPF [CORE]MAINTAINERS section matched on kernel/bpf/core.c · bpf@vger.kernel.org · Maintained
Check it on the machine
grep -w CONFIG_BPF /boot/config-$(uname -r)Reads the booted kernel's own configuration, on the machine and nowhere else. =y is built in, =m is a module, and an is not set line means the code is not there.
Show whether Debian builds this, per release
Debian builds this code. Every release below compiles the affected file into the kernels it ships.
- bookworm, trixie, forky, sidy
- y
- built into the kernel image on every flavour - only a patch removes it
- Build switch
- CONFIG_BPF
From the configuration Debian publishes for every kernel flavour it builds. It covers only the architectures Debian ships a linux-config package for, and nothing about a kernel you built yourself. Debian's own status above stays authoritative about the source package.MAINTAINERS kbuild Makefiles Debian linux-config packages
Signals
- Published
- 2025-10-15 (12 months ago)source
- CVSS
- 7.8 high
CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:Hsource recompute it - Attack vector
- local (AV:L)source
- EPSS
- 0.15%, higher than 4.0% of all CVEssource
- CISA KEV
- not listedthe KEV catalogue
- Debian urgency
- not yet assignedsource
- Subsystem
- kernel/bpf
Upstream fixes
The versions the CNA records as introducing and fixing this, and the commit for each. source
| Introduced | Fixed in | Commit |
|---|---|---|
| 5.8 | 6.12.50 | 3d429cb1278e |
| 5.8 | 6.16.10 | 6233715b4b71 |
| 5.8 | 6.17 | e4414b01c1cd |
Why the CNA scored it this way
Quoted from the kernel CNA's own scoring file, word for word. A highlighted metric carries the most severe value CVSS v3.1 defines for it, which is what pushes the score up. source
- AV:LAttack vector, local
- The vulnerability is reached only through the local `bpf(BPF_PROG_LOAD)` syscall, which is used to submit the crafted program to the verifier. There is no remote or adjacent-network path into `get_helper_proto()`.
- AC:LAttack complexity, low
- On an affected build the attacker deterministically triggers the bug every time by loading a program that calls a helper whose weak proto is zeroed — no race, no memory-layout dependency, no unpredictable state. Both the `verifier_bug()` WARN path and the `bpf_get_branch_snapshot` inline path are fully under the attacker's control via the program bytecode.
- PR:LPrivileges required, low
- Program load plus `CAP_PERFMON`/`CAP_BPF` is required, but `CAP_PERFMON` is a narrow, non-root capability commonly granted to unprivileged profiling and BPF observability daemons, and `bpf_token_capable()` explicitly makes it delegable to unprivileged users inside user namespaces via bpffs BPF tokens. This is an ordinary low-privileged account boundary, not init-namespace root.
- UI:NUser interaction, none
- The attacker loads and exercises the BPF program entirely on their own; no other user or administrator has to perform any action.
- S:UScope, unchanged
- The corruption and the crash both occur inside the kernel that is already the security authority for the calling process — a conventional local kernel privilege-escalation/DoS, with no VM, IOMMU, or sandbox boundary crossed.
- C:HConfidentiality impact, high
- With all `arg_type[]` zeroed to `ARG_DONTCARE` the verifier validates nothing, and the inlined `bpf_get_branch_snapshot` copies LBR records (kernel from/to instruction pointers) to an attacker-chosen destination that can be a readable BPF map value, disclosing kernel text addresses and defeating KASLR; the same unvalidated-pointer primitive generalizes to broader kernel memory disclosure.
- I:HIntegrity impact, high
- `__intel_pmu_snapshot_branch_stack()` performs `memcpy(entries, cpuc->lbr_entries, 24 * cnt)` with `entries` an entirely unvalidated attacker-supplied scalar, giving an arbitrary kernel-memory write of up to several hundred bytes — a direct privilege-escalation primitive.
- A:HAvailability impact, high
- The common path hits `verifier_bug()` → `BPF_WARN_ONCE`, which taints the kernel and panics outright on the many hardened/production and Android kernels that set `panic_on_warn=1`; the arbitrary-write path trivially oopses the kernel by targeting unmapped or critical memory.