data built 2026-10-19T13:16:53Z

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

7.8 EPSS 0.2% AV:L

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

ReleaseStatus VersionWhat this means
Debian 12bookwormvulnerable6.1.190-1No 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 13trixiefixed6.12.57-1Update the kernel and reboot. Fixed in 6.12.57-1. A running kernel keeps the old code until the machine restarts.
Debian 14forkyfixed6.16.10-1Update the kernel and reboot. Fixed in 6.16.10-1. A running kernel keeps the old code until the machine restarts.
Debian unstablesidfixed6.16.10-1Update 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

IntroducedFixed inCommit
5.86.12.503d429cb1278e
5.86.16.106233715b4b71
5.86.17e4414b01c1cd

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.