Live › vulnerability › CVE-2026-98647
Go to dashboardThe Linux kernel BPF verifier can divide by zero in btf_struct_walk() when a program accesses past a struct whose trailing flexible array has an empty element type. Loading a crafted BPF program can crash the kernel with an oops.
Summary written from the sources below. Check the originals before acting.
First seen by InfraStack 2026-10-23 21:57 UTC. All times on this page are UTC.
Systems running a Linux kernel with the BPF verifier, where BPF programs can be loaded, especially hosts that allow unprivileged BPF or run sleepable BPF programs that use local kptrs. Hosts that do not load BPF programs or that lock down BPF loading are less exposed. The sources do not say which kernel versions are fixed.
No product ranges from the sources yet.
uname -r and compare against the fixed kernel builds listed in the NVD or distribution advisory for CVE-2026-98647.sysctl kernel.unprivileged_bpf_disabled; a value of 0 lets unprivileged users load programs.sysctl -w kernel.unprivileged_bpf_disabled=2 to limit BPF program loading.Each row is the first time that source carried this signal. The analyst’s rows are its own findings.
In the Linux kernel, the following vulnerability has been resolved:
bpf: Fix divide-by-zero in btf_struct_walk()
When an access goes past the struct and the last member is a flexible array, btf_struct_walk() folds the offset back into a single element with (off - moff) % t->size, but never checks that the element type has a size.
BTF takes an empty struct, so this in program BTF
/* event could be empty */
struct event {
#ifdef HAVE_TIMESTAMP __u64 ts; #endif };
struct batch {
int nr;
struct event events[];
};
divides by zero at prog load time. Getting there needs a PTR_TO_BTF_ID that is not MEM_ALLOC, e.g. a plain read of a local kptr stashed in a map from a sleepable program.
Oops: divide error: 0000 [#1] SMP KASAN PTI RIP: 0010:btf_struct_walk+0x53f/0x1570 Call Trace: <TASK> btf_struct_access+0x42a/0xcd0 check_ptr_to_btf_access+0x4dc/0x1160 check_mem_access+0x3a45/0x8740 check_load_mem+0x36a/0xd10 do_check_common+0x3ef0/0xb210 bpf_check+0x6d3b/0x8580 bpf_prog_load+0xf7c/0x2720 __sys_bpf+0xa83/0x3690 __x64_sys_bpf+0xc7/0x150 x64_sys_call+0x1f3f/0x27e0 do_syscall_64+0xe5/0x610 entry_SYSCALL_64_after_hwframe+0x76/0x7e </TASK>
Reject a zero-sized element type. The fixed array path in the same function already bails out on the same thing:
btf_struct_walk()
...
/* skip empty array */
if (moff == mtrue_end)
continue;
msize /= total_nelems;
This page as .md · .json · in your agent: get_signal("CVE-2026-98647")
NVD data is provided by NIST and is public domain. Posts quoted belong to their authors.