Look up another CVE · open CVE-2026-63809 in the interactive tracker
CVE-2026-63809
bpf: use kvfree() for replaced sysctl write buffer
Published 2026-07-19 (3 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-2026-63809 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 | fixed | 6.1.177-1 | Update the kernel and reboot. Fixed in 6.1.177-1. A running kernel keeps the old code until the machine restarts. |
| Debian 13trixie | fixed | 6.12.95-1 | Update the kernel and reboot. Fixed in 6.12.95-1. A running kernel keeps the old code until the machine restarts. |
| Debian 14forky | fixed | 7.1.3-1 | Update the kernel and reboot. Fixed in 7.1.3-1. A running kernel keeps the old code until the machine restarts. |
| Debian unstablesid | fixed | 7.1.3-1 | Update the kernel and reboot. Fixed in 7.1.3-1. A running kernel keeps the old code until the machine restarts. |
The vulnerability
What the bug is
proc_sys_call_handler() allocates its temporary sysctl buffer with kvzalloc() and passes it to __cgroup_bpf_run_filter_sysctl(). Since kvzalloc() may fall back to vmalloc() for large allocations, freeing that buffer with kfree() is wrong and can corrupt memory. Use kvfree() to safely handle both kmalloc and kvzalloc()/vmalloc allocations. The bug was first flagged by an experimental analysis tool we are developing for kernel memory-management bugs while analyzing v6.13-rc1. The tool is still under development and is not yet publicly available. Manual inspection confirms that the bug is still present in v7.1-rc5. Reproduced the bug based on v7.1-rc4 in a QEMU x86_64 guest booted with KASAN and CONFIG_FAILSLAB enabled. To exercise the replacement path, the test tree also included the accompanying fix for the stale ret == 1 check in __cgroup_bpf_run_filter_sysctl(). The reproducer confines failslab injections to the proc_sys_call_handler() range, uses stacktrace-depth=32, and injects fail-nth=1 while writing 8191 bytes to /proc/sys/kernel/domainname from a task in the target cgroup. Under that setup, fail-nth=1 triggered the fault: BUG: unable to handle page fault for address: ffffeb0200024d48 #PF: supervisor read access in kernel mode #PF: error_code(0x0000) - not-present page PGD 0 P4D 0 Oops: Oops: 0000 SMP KASAN NOPTI CPU: 2 UID: 0 PID: 209 Comm: repro_proc_sys_ Not tainted 7.1.0-rc4-00686-g97625979a5d4 PREEMPT(lazy) Hardware name: QEMU Standard PC (Q35 + ICH9, 2009), BIOS 1.15.0-1 04/01/2014 RIP: 0010:kfree+0x6e/0x510 ... Call Trace: <TASK> ? __cgroup_bpf_run_filter_sysctl+0x626/0xc30 __cgroup_bpf_run_filter_sysctl+0x74d/0xc30 ? __pfx___cgroup_bpf_run_filter_sysctl+0x10/0x10 ? srso_return_thunk+0x5/0x5f ? __kvmalloc_node_noprof+0x345/0x870 ? proc_sys_call_handler+0x250/0x480 ? srso_return_thunk+0x5/0x5f proc_sys_call_handler+0x3a2/0x480 ? __pfx_proc_sys_call_handler+0x10/0x10 ? srso_return_thunk+0x5/0x5f ? selinux_file_permission+0x39f/0x500 ? srso_return_thunk+0x5/0x5f ? lock_is_held_type+0x9e/0x120 vfs_write+0x98e/0x1000 ... </TASK> With this fix applied on top of the same test setup, rerunning the reproducer with fail-nth=1 yields no corresponding Oops reports.
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/cgroup.c
- What this is
- BPF [GENERAL] (Safe Dynamic Programs and Tools)MAINTAINERS section matched on kernel/bpf/ · bpf@vger.kernel.org · Supported
Check it on the machine
grep -wE 'CONFIG_BPF|CONFIG_CGROUP_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 switches
- CONFIG_BPF, CONFIG_CGROUP_BPF
- 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-07-19 (3 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.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 |
|---|---|---|
| 5.10.20 | 5.10.260 | d0a81ed5ff5d |
| 5.12 | 5.15.211 | 77355ef7a9f6 |
| 5.12 | 6.1.177 | e1d1e203a600 |
| 5.12 | 6.6.144 | 81fc9a13acae |
| 5.12 | 6.12.95 | 838fe9c28121 |
| 5.12 | 6.18.38 | 65bd0c0afb0e |
| 5.12 | 7.1.3 | 70df4de46577 |
| 5.12 | 7.2 | 4c21b5927d43 |
| 5.11.3 | 0 | 0 |
Debian advisories
| Advisory | Date | Shipped to | Debian |
|---|---|---|---|
| DLA-4717-1 | 2026-08-05 | bullseye 5.10.262-1 | tracker |
| DLA-4700-1 | 2026-07-26 | bullseye 6.1.177-1~deb11u1 | tracker |
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 bug is reached only via a local write() to /proc/sys/* through proc_sys_call_handler() → BPF_CGROUP_RUN_PROG_SYSCTL() → __cgroup_bpf_run_filter_sysctl(); there is no network, adjacent-radio, or physical-device entry point.
- AC:LAttack complexity, low
- An attacker controls all prerequisites: they can mount/join a cgroup, load and attach a cgroup/sysctl BPF program that calls bpf_sysctl_set_new_value(), issue a >PAGE_SIZE sysctl write, and induce kmalloc failure (e.g., memory pressure) so kvzalloc() falls back to vmalloc and the wrong kfree() path is taken.
- PR:LPrivileges required, low
- In a user+network namespace (unshare -Urn), CAP_NET_ADMIN grants write access to /proc/sys/net/* sysctls, and CAP_BPF plus CAP_NET_ADMIN suffice to load/attach BPF_PROG_TYPE_CGROUP_SYSCTL; cgroup management is available with namespace CAP_SYS_ADMIN, without init-namespace root.
- UI:NUser interaction, none
- Exploitation is fully attacker-driven through syscalls (write, bpf) and requires no victim interaction.
- S:UScope, unchanged
- Impact is kernel memory corruption and potential privilege escalation within the same kernel/host security boundary, not a cross-boundary escape such as VM or IOMMU bypass.
- C:HConfidentiality impact, high
- Calling kfree() on a vmalloc-backed kvzalloc() buffer corrupts slab allocator metadata and can be leveraged for arbitrary kernel memory disclosure, not merely a bounded leak.
- I:HIntegrity impact, high
- Invalid kfree() of vmalloc memory is a heap corruption primitive that can corrupt slab freelists and be developed into arbitrary kernel writes or code execution.
- A:HAvailability impact, high
- The reproducer triggers an immediate kernel oops/page fault in kfree(), and the underlying allocator corruption can also cause panics, hangs, or repeated crashes.