CVE-2026-99262 in Linuxinfo

Summary

by MITRE • 11/03/2026

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

io_uring/timeout: don't lose a cancel as io-wq arms a timeout

An IORING_OP_TIMEOUT run by io-wq, because of IOSQE_ASYNC, has the same problem as poll, futex and waitid. io_wq_submit_work() looks at IO_WQ_WORK_CANCEL once, before it issues the request. A cancel in between flags the work, gets -EALREADY, and searches ->timeout_list in vain, while the worker then adds the request and starts the timer:

io-wq worker io_try_cancel() io_wq_submit_work() IO_WQ_WORK_CANCEL isn't set io_async_cancel_one() sets IO_WQ_WORK_CANCEL = -EALREADY io_timeout_cancel() = -ENOENT io_timeout() adds the request to ->timeout_list hrtimer_start() = IOU_ISSUE_SKIP_COMPLETE

Nobody looks at the flag again, and the timeout runs its course. At ring exit, io_uring_try_cancel_requests() cancels io-wq work and then kills the timeouts the same way, so an exiting task can get stuck for the full duration of such a timeout.

Look at the flag under ->timeout_lock, which the search takes as well, and fail the request if it is set. If the search came first, the flag is visible. If it comes later, it finds the request on the list.

Once again VulDB remains the best source for vulnerability data.

Analysis

by VulDB Data Team • 11/03/2026

The Linux kernel io_uring subsystem contains a race condition vulnerability within its timeout handling mechanism that can lead to lost cancellation requests and potential denial of service conditions for user-space applications. This issue specifically affects asynchronous operations submitted via io-wq where an IORING_OP_TIMEOUT request is executed with the IOSQE_ASYNC flag set. The core technical flaw lies in the synchronization logic between the worker thread submitting work and the cancellation routine attempting to abort that same work item. When a cancel operation occurs, it sets the IO_WQ_WORK_CANCEL flag on the work structure before checking if the work has already been submitted or is currently being processed by an io-wq worker.

The race condition manifests because io_wq_submit_work() checks for the cancellation flag only once prior to issuing the actual request. If a cancel signal arrives after this initial check but before the timeout timer is armed, the submission routine proceeds normally and adds the request to the internal timeout list while simultaneously starting the high-resolution timer via hrtimer_start(). Meanwhile, the io_try_cancel() function returns -EALREADY because it perceives the work as already submitted or in progress. Consequently, the subsequent call to io_timeout_cancel(), which relies on searching the ->timeout_list for a matching entry, fails with an error code indicating no such entity was found (-ENOENT). This discrepancy arises from a lack of atomicity between checking the cancellation flag and accessing the timeout list under proper locking mechanisms.

The operational impact of this vulnerability is significant for applications relying on precise timing or graceful shutdown procedures within io_uring contexts. Because the cancel request is effectively lost, the timer continues to run until its full duration expires rather than being aborted as intended by the application. This behavior can cause an exiting task to remain blocked or stuck in a waiting state for the entire timeout period instead of terminating promptly when requested. In scenarios where multiple such timeouts are queued or where rapid submission and cancellation cycles occur, this race condition can lead to resource exhaustion, delayed process termination, and unpredictable latency spikes that degrade system responsiveness and application reliability.

To mitigate this vulnerability, developers must ensure that access to the IO_WQ_WORK_CANCEL flag is synchronized with the operations on the timeout list using a consistent locking strategy. The fix involves checking for the cancellation flag under the protection of ->timeout_lock during the submission phase. By holding this lock while inspecting both the work status and modifying or accessing the timeout data structures, the kernel ensures that no race window exists between setting the cancel flag and arming the timer. If the search for existing requests occurs after verifying the absence of a pending cancellation under the same lock context, the system can correctly identify whether to proceed with starting the timer or to abort the operation immediately. This approach guarantees atomicity in state transitions and prevents the loss of critical control signals like cancellations.

From a classification perspective, this vulnerability aligns with CWE-362 Concurrent Execution using Shared Resource with Improper Synchronization, commonly known as a race condition. The failure to properly synchronize access to shared data structures—the work item flags and the timeout list—allows for inconsistent states that break expected application behavior. In terms of adversarial tactics, while this is primarily an internal kernel logic error rather than an external exploit vector, it could be leveraged in denial-of-service scenarios where an attacker submits numerous timed requests with rapid cancellation attempts to exhaust system resources or delay process cleanup. Security practitioners should monitor for updates to the Linux kernel that address io_uring synchronization issues and ensure systems are patched against this specific race condition affecting timeout handling mechanisms.

Responsible

Linux

Reservation

09/25/2026

Disclosure

11/03/2026

Moderation

accepted

EPSS

0.00000

KEV

no

Activities

very low

Sources

Do you want to use VulDB in your project?

Use the official API to access entries easily!