CVE-2026-81009 Overview
CVE-2026-81009 affects the Linux kernel's io_uring subsystem, specifically the query interface. The function io_handle_query_entry() clamps the header size for inbound copy_from_user() operations but retains the original user-supplied value as usize. When copy_struct_to_user() uses that unchecked usize and finds it larger than the kernel result, it calls clear_user() on the trailing bytes. Because hdr.size is a __u32, an attacker can request nearly 4 GiB of memory zeroing, including on error paths where res_size stays 0. The interface is reachable without a ring through IORING_REGISTER_QUERY.
Critical Impact
Local unprivileged users can trigger up to 4 GiB of user-space memory zeroing per request, enabling denial-of-service conditions against the kernel through the IORING_REGISTER_QUERY interface.
Affected Products
- Linux kernel versions containing the io_uring query interface
- Distributions shipping affected mainline kernels with io_uring enabled
- Systems permitting unprivileged access to io_uring syscalls
Discovery Timeline
- 2026-09-11 - CVE-2026-81009 published to the National Vulnerability Database (NVD)
- 2026-09-11 - Last updated in NVD database
Technical Details for CVE-2026-81009
Vulnerability Analysis
The vulnerability resides in the io_handle_query_entry() function within the Linux kernel io_uring subsystem. The function correctly clamps hdr.size before invoking copy_from_user() to prevent oversized inbound copies. It fails, however, to apply the same clamp to the usize variable retained from the original user request.
When copy_struct_to_user() is subsequently called with the unclamped usize, the helper compares the caller-supplied size against the size of the kernel-produced result. If the user value is larger, the routine calls clear_user() to zero the trailing bytes in the user buffer. Because hdr.size is declared as __u32, valid values reach nearly 4 GiB.
The issue is amplified on error paths. When processing fails, res_size stays at 0, but clear_user() still zeroes the entire user-declared range. Any local process can trigger the flaw through the IORING_REGISTER_QUERY operation without first creating a ring, broadening the attack surface.
Root Cause
The root cause is improper input validation of a size field crossing the user/kernel boundary. The kernel applied bounds checking to one code path (copy_from_user) but forgot to propagate that clamp to the outbound copy_struct_to_user call, violating the recommended contract for the copy_struct_* helper family.
Attack Vector
A local unprivileged process invokes IORING_REGISTER_QUERY with a crafted hdr.size value approaching UINT_MAX. The kernel accepts the request, and the outbound copy path clears the caller-specified byte range in user memory. Repeated invocations force the kernel to perform sustained large-scale clear_user() operations, consuming CPU time and starving other processes. The IORING_REGISTER_QUERY operation does not require an established ring, lowering the barrier for exploitation.
See the upstream fix commits at git.kernel.org 2b8ad498, git.kernel.org 417e02f7, and git.kernel.org ba77efee for the source-level change.
Detection Methods for CVE-2026-81009
Indicators of Compromise
- Processes issuing io_uring_register(2) syscalls with the IORING_REGISTER_QUERY opcode and unusually large hdr.size values
- Sustained high system CPU utilization tied to clear_user() or copy_struct_to_user code paths visible in kernel profiles
- Repeated short-lived processes probing io_uring registration interfaces without creating rings
Detection Strategies
- Enable Linux audit rules for the io_uring_register syscall and alert on high-frequency invocations from non-privileged users
- Use eBPF-based tracing (for example, bpftrace) to record hdr.size arguments passed to io_handle_query_entry()
- Correlate spikes in kernel-mode CPU time with process command lines and UIDs to identify abusive workloads
Monitoring Recommendations
- Track kernel version telemetry across the fleet to prioritize hosts still running unpatched builds
- Monitor for unexplained slowdowns or unresponsiveness on multi-tenant Linux hosts, container platforms, and CI runners
- Ingest kernel audit and syscall telemetry into a centralized analytics platform for baseline deviation analysis
How to Mitigate CVE-2026-81009
Immediate Actions Required
- Identify all Linux hosts running kernels that include the io_uring query interface and inventory patch status
- Apply the upstream stable-tree fixes referenced by the kernel commits as soon as vendor packages become available
- Restrict io_uring availability for untrusted workloads by setting kernel.io_uring_disabled=2 where feasible
Patch Information
The fix rejects hdr.size values larger than PAGE_SIZE, aligning the query interface with the recommended contract for copy_struct_* helpers. Merge the changes referenced in commits 2b8ad498, 417e02f7, and ba77efee from the Linux stable tree, or install distribution kernel updates that incorporate them.
Workarounds
- Set the kernel.io_uring_disabled sysctl to 2 to disable io_uring system-wide on hosts that do not require it
- Use seccomp filters to block the io_uring_register syscall for untrusted container or sandboxed workloads
- Apply cgroup CPU quotas to limit the impact of processes issuing abusive io_uring requests until patches are deployed
# Configuration example
# Disable io_uring system-wide (requires kernel 6.6+)
sysctl -w kernel.io_uring_disabled=2
echo 'kernel.io_uring_disabled=2' >> /etc/sysctl.d/99-io-uring.conf
# Verify current kernel version
uname -r
Disclaimer: This content was generated using AI. While we strive for accuracy, please verify critical information with official sources.