Look up another CVE · open CVE-2026-93125 in the interactive tracker
CVE-2026-93125
bpf: Reject rdonly/rdwr_buf_size kfunc arguments that exceed u32 max
Published 2026-09-17 (31 days 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-2026-93125 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 | vulnerable | 6.12.113-1 | No fix published anywhere yet, neither in Debian nor upstream for the series trixie tracks. Watch the Debian tracker page for this CVE. Advisories for trixie have historically landed a median of 11 days after publication. |
| Debian 14forky | fixed | 7.2.6-1 | Update the kernel and reboot. Fixed in 7.2.6-1. A running kernel keeps the old code until the machine restarts. |
| Debian unstablesid | fixed | 7.2.6-1 | Update the kernel and reboot. Fixed in 7.2.6-1. A running kernel keeps the old code until the machine restarts. |
The vulnerability
What the bug is
check_kfunc_args() detects a kfunc argument named rdonly_buf_size or rdwr_buf_size and stores reg->var_off.value into meta->r0_size, a u64, and does not bound it. check_kfunc_call() later copies that value into the returned register's mem_size field: meta->r0_size = reg->var_off.value; ... regs[BPF_REG_0].mem_size = meta.r0_size; regs[BPF_REG_0].mem_size is u32. A constant whose upper 32 bits are set gets truncated instead of causing a load-time rejection, so the verifier records a PTR_TO_MEM register with an approximately 4 GiB mem_size for whatever allocation the kfunc returned. A later access check against that register uses the truncated, wrong bound. Reject rdonly_buf_size/rdwr_buf_size values that exceed U32_MAX at the point meta->r0_size is set.
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/verifier.c
- What this is
- BPF [CORE]MAINTAINERS section matched on kernel/bpf/verifier.c · bpf@vger.kernel.org · Maintained
Check it on the machine
grep -wE 'CONFIG_BPF|CONFIG_BPF_SYSCALL' /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 switches
- CONFIG_BPF, CONFIG_BPF_SYSCALL
- Reads as
- all on means the file is compiled; any one off means it is not.
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
- 2026-09-17 (31 days 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.13%, higher than 2.1% 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 |
|---|---|---|
| 6.1 | 6.18.57 | 93a20b14f862 |
| 6.1 | 7.2.6 | 56a3846830ac |
| 6.1 | 7.3 | 2aaf67f0516f |
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
- check_kfunc_args() takes the oversized rdonly_buf_size/rdwr_buf_size from the BPF program's own constant (reg->var_off.value) on the local bpf(BPF_PROG_LOAD) path (bpf_prog_load → bpf_check → check_kfunc_call). That immediate is not a field of a received packet or a ksmbd/nfsd message.
- AC:LAttack complexity, low
- The attacker picks a 64-bit immediate with upper bits set (e.g. ~0ULL as in hid_rdesc_fixup_get_data_overflow) as the rdonly_buf_size/rdwr_buf_size argument; tnum_is_const succeeds and regs[BPF_REG_0].mem_size = meta.r0_size truncates deterministically, with no race or layout outside their control.
- PR:LPrivileges required, low
- do_check_common() rejects BPF_PSEUDO_KFUNC_CALL unless env->bpf_capable, which bpf_check() sets from bpf_token_capable(token, CAP_BPF). CAP_BPF is a reduced capability and is delegable into a user namespace via a BPF token, so init-namespace root is not required.
- UI:NUser interaction, none
- The attacker loads the crafted program with bpf(BPF_PROG_LOAD) and runs it themselves via BPF_PROG_TEST_RUN or by attaching their own HID-BPF/io_uring struct_ops. No separate victim action such as mounting an image is required.
- S:UScope, unchanged
- The truncated PTR_TO_MEM mem_size lets the verified program read and write host kernel memory, which is a standard kernel privilege escalation in the same authority. It does not cross a KVM/Xen, IOMMU, or guest-to-host boundary.
- C:HConfidentiality impact, high
- check_kfunc_call() copies the truncated r0_size into a PTR_TO_MEM register, so check_mem_region_access() allows loads of up to ~4 GiB. bpf_kfunc_call_test_get_rdonly_mem takes const int rdonly_buf_size: a value such as 0x1FFFFFFFF becomes -1, the size > 8 check fails open, and the 8-byte prog_test_ref_kfunc is treated as a 4 GiB readable buffer.
- I:HIntegrity impact, high
- rdwr_buf_size kfuncs (bpf_kfunc_call_test_get_rdwr_mem, hid_bpf_get_data, bpf_io_uring_get_region) mark R0 as writable PTR_TO_MEM. The same truncated mem_size lets check_mem_region_access() accept stores past the real object, which is an arbitrary kernel write.
- A:HAvailability impact, high
- Those verifier-allowed out-of-bounds loads and stores overrun the kfunc's actual object (prog_test_struct from get_mem, hid_bpf_get_data's ctx_kern->data, or an io_uring mapped region) and can oops or panic the kernel.