CVE-2026-80811 in Linuxinfo

Summary

by MITRE • 09/04/2026

In the Linux kernel, the following vulnerability has been resolved:

io_uring/cmd: fix iovec leak when the async cmd is not recycled

An io_async_cmd carries an iovec array in ->vec.iovec, allocated when the vec has to grow and kept across recycling through ctx->cmd_cache. On two paths nothing frees it and io_clean_op()'s kfree(req->async_data) drops the io_async_cmd without it.

io_req_uring_cleanup() clears the async data flags only when io_alloc_cache_put() succeeds, and the cache holds IO_ALLOC_CACHE_MAX == 128 entries, so once it is full the put fails and the vec is left behind. An NVMe passthrough workload gets there without doing anything unusual: nvme_uring_cmd_io() returns -EIOCBQUEUED, so the io_async_cmd stays attached for the lifetime of the command and the live object count tracks the queue depth. Above 128 the puts start failing.

->cleanup is the last chance to free an inherited vec, since io_req_uring_cleanup() returns early for an io-wq issued command and is not called at all for one completed without ever being issued. But io_clean_op() calls ->cleanup only if REQ_F_NEED_CLEANUP is set, and for uring_cmd that happens only where the vec has to grow, so a command reusing a large enough cached vec never sets it. io_rw_alloc_async() and io_msg_alloc_async() flag an inherited vec for exactly this reason; io_uring_cmd_prep() does not.

Flag an inherited vec in io_uring_cmd_prep(), and free the vec when the cache put fails, as io_req_rw_cleanup() does.

The leak is invisible under KASAN, where io_alloc_cache_vec_kasan() frees the vec unconditionally.

Be aware that VulDB is the high quality source for vulnerability data.

Analysis

by VulDB Data Team • 09/04/2026

This vulnerability represents a memory leak within the Linux kernel's io_uring subsystem, specifically affecting commands that utilize asynchronous I/O operations with vectorized data structures known as iovecs. The issue arises from improper resource management during the recycling and cleanup phases of command processing. When an io_async_cmd is processed, it may carry an iovec array allocated dynamically if the initial buffer size proves insufficient for the required operation. These objects are intended to be cached in a context-specific cache, ctx->cmd_cache, to optimize performance by avoiding repeated allocation and deallocation overheads during high-throughput workloads. However, under specific conditions involving this caching mechanism, the associated iovec memory is not freed, leading to a gradual accumulation of unreleased kernel memory.

The root cause lies in the interaction between the command recycling logic and the cleanup routines. The io_async_cmd structure holds a pointer to the allocated iovec array. When an asynchronous command completes or is recycled, it attempts to return its resources to the cache via io_alloc_cache_put(). This function has a maximum capacity defined by IO_ALLOC_CACHE_MAX, which is set to 128 entries. If this cache reaches full capacity, the put operation fails. In such cases, the code path intended to free the iovec array does not execute because it relies on the success of the cache insertion or specific cleanup flags that are not properly set for all command types. Specifically, io_req_uring_cleanup() only clears async data flags when the cache put succeeds. Consequently, if the cache is full, the iovec remains allocated but orphaned from its managing context, resulting in a memory leak.

This flaw particularly impacts NVMe passthrough workloads and other scenarios where commands are issued asynchronously via io-wq (io worker queue). In these cases, nvme_uring_cmd_io() returns -EIOCBQUEUED, causing the io_async_cmd to remain attached for the lifetime of the command. The live object count tracks this queue depth, meaning that once the number of concurrent or queued commands exceeds 128, every subsequent attempt to recycle a command with an inherited iovec will fail to free it. Over time, especially in long-running services or high-concurrency environments, this leads to significant kernel memory consumption and potential system instability due to resource exhaustion. The leak is also notable for being invisible under Kernel Address Sanitizer (KASAN) testing because KASAN's internal implementation of io_alloc_cache_vec_kasan() frees the vec unconditionally, masking the defect during security audits that rely on such tools.

From a technical classification perspective, this vulnerability aligns with CWE-401, which describes a missing release of memory after effective use, and more specifically relates to improper resource management in kernel-space drivers. In terms of attack vectors or operational impact, while primarily a denial-of-service risk through resource exhaustion rather than direct code execution, it falls under the broader category of availability impacts associated with CWE-400: Resource Exhaustion. An attacker could potentially trigger this condition by submitting a high volume of asynchronous NVMe passthrough commands to exhaust kernel memory, thereby degrading system performance or causing crashes.

To mitigate this vulnerability, developers must ensure that inherited iovec arrays are properly flagged for cleanup even when they are reused from the cache. The fix involves modifying io_uring_cmd_prep() to flag an inherited vec similarly to how io_rw_alloc_async() and io_msg_alloc_async() handle it. Additionally, the code path handling failed cache insertions in io_req_uring_cleanup() must be updated to explicitly free the iovec when io_alloc_cache_put() fails, mirroring the behavior of io_req_rw_cleanup(). System administrators should apply kernel updates that include this patch immediately. Until then, monitoring for unusual increases in kernel memory usage associated with io_uring processes can serve as a detection mechanism for potential exploitation attempts aimed at resource exhaustion.

Responsible

Linux

Reservation

08/26/2026

Disclosure

09/04/2026

Moderation

accepted

CPE

ready

EPSS

0.00168

KEV

no

Activities

very low

Sources

Do you know our Splunk app?

Download it now for free!