GPU VulnDB

Database/Kernel, userspace & hypervisor

Linux kernel BPF verifier: u64 kfunc buffer size truncated into a u32 mem_size bound

CVSS 7.8CVE-2026-93125Kernel, userspace & hypervisorcurated

Impact

check_kfunc_args() stored an unbounded u64 constant into meta->r0_size, which check_kfunc_call() then copied into the returned register's u32 mem_size field. A constant with its upper 32 bits set was silently truncated instead of rejected at load time, so the verifier accepted a PTR_TO_MEM register carrying a bound of roughly 4 GiB over whatever the kfunc actually allocated. Every later access check against that register used the wrong bound, giving out-of-bounds kernel read and write from a loaded program. On a GPU node this matters wherever BPF loading is reachable from inside the fleet - node-level observability agents, CNI dataplanes, or any pod granted CAP_BPF - because host kernel compromise on a shared GPU host reaches every tenant on that host and the node cannot be drained cheaply.

Who can reach it

Local user or container able to load a BPF program that calls a kfunc with an rdonly_buf_size/rdwr_buf_size argument, i.e. CAP_BPF/CAP_SYS_ADMIN in some namespace. Not reachable from an unprivileged pod with BPF blocked by seccomp or by the runtime default profile.

What to do

Take the stable kernel fix that rejects rdonly_buf_size/rdwr_buf_size values above U32_MAX where meta->r0_size is set; the commits are linked in the record. There is no runtime toggle beyond keeping BPF program loading away from tenants, so this is a kernel package update and a reboot of each GPU node - schedule it with the drain, since a GPU host cannot be live-patched for a verifier change.

References

Related entries

All Kernel, userspace & hypervisor entries

This entry is curated: imported from vendor advisories with machine assistance, not yet individually verified. Confirm against your vendor's advisory before acting, and report anything wrong.