CVE-2026-99230
NoneCVSS
—
EPSS
0.2%
Published
Nov 2, 2026
CISA due date
—
Cloudanix analysis
A recently discovered flaw in the Linux kernel can let a local user crash the system or gain higher privileges by tricking the kernel into reusing old internal data that was never properly cleaned up.
- Exploitation
- Local Privilege
- Attacker needs
- Local User
- Complexity
- Moderate
- Impact
- Denial Of Service
- Component
- OS kernel
- Class
- Use After Free
- Remediation
- Upgrade
- Effort
- Medium
- Patch risk
- Low
What it actually does
Use-after-free in io_uring request recycling: hlist_del() from io_uring_cmd_del_cancelable() leaves LIST_POISON values in ->hash_node; recycled requests reused in io_futexv paths without reinitialization cause wild-memory writes through poisoned pointers in __io_futex_complete().
Why it matters to the business
Local attackers can crash the kernel or potentially escalate privileges on any Linux system using io_uring and futex operations; the flaw is only one day old with no public exploits yet, giving defenders a short window before weaponization.
How an attack unfolds
An attacker issues a cancelable uring command (e.g., ublk FETCH_REQ) that is later removed via hlist_del(), leaving poison in the request's hash_node. The request is returned to the cache and reallocated for a vectored futex wait. When the futex wake-up races with setup, io_futexv_complete() calls hlist_del_init() on the poisoned node, dereferencing LIST_POISON2 and triggering a general protection fault that can be turned into controlled memory corruption for privilege escalation.
How to fix it
Upgrade to a kernel containing the fix that ensures ->hash_node is left in an unhashed state (hlist_del_init or equivalent) for all io_uring command paths; rebuild and reboot affected systems; prioritize servers and containers that expose io_uring to untrusted workloads.
How to confirm the fix worked
Confirm the patch is present by inspecting the io_uring/cmd.c source for the corrected io_uring_cmd_del_cancelable() logic that avoids leaving poison; run kernel regression tests exercising io_uring cancelable commands concurrent with futex waits; verify no LIST_POISON dereferences occur under load.
Typical attack path
- Submit cancelable io_uring command that populates ->hash_node
- Trigger io_uring_cmd_del_cancelable() leaving LIST_POISON in the node
- Force request recycling through the io_uring request cache
- Allocate the poisoned request for a concurrent vectored futex wait
- Race the wake-up so io_futexv_complete() dereferences the poisoned node
- Exploit resulting wild-memory write for kernel code execution
How to detect it
Search kernel logs and crash dumps for the exact call trace containing io_futexv_complete, tctx_task_work_run, and wild-memory-access or KASAN reports involving LIST_POISON addresses; correlate with processes that use io_uring and futex syscalls.
What your security team should do
- Apply the upstream fix within 7 days given the one-day publication age and use-after-free class
- Disable io_uring via seccomp or sysctl where not required until patched
- Monitor kernel oops logs for io_futexv_complete and tctx_task_work_run signatures
- Audit workloads using ublk or other cancelable uring commands for exposure
The record
In the Linux kernel, the following vulnerability has been resolved: io_uring/cmd: don't leave list poison in ->hash_node io_uring_cmd_del_cancelable() uses hlist_del() to take a command off ->cancelable_uring_cmd, which leaves LIST_POISON1/2 behind in ->hash_node. Requests are recycled through the request cache without being reinitialised, and not every user of ->hash_node sets it up before it is used: If a vectored futex wait is woken while futex_wait_multiple_setup() is still queueing the futexes, io_futexv_wait() doesn't add the request to ->futex_list, and leaves the completion to the task_work queued by the wake up. io_futexv_complete() ends in __io_futex_complete(), whose hlist_del_init() is fine for a request that is unhashed, which is how all other users of the node leave it. If the request was a cancelable uring_cmd in its previous life, e.g. a ublk FETCH_REQ, it writes through LIST_POISON2: Oops: general protection fault, probably for non-canonical address KASAN: maybe wild-memory-access in range [0xdead000000000120-...] RIP: 0010:io_futexv_complete+0x219/0x420 Call Trace: tctx_task_work_run+0x804/0x950 tctx_task_work+0x71/0xa0 task_work_run+0x118/0x200 Leave the node unhashed.
Affected packages
| Ecosystem | Package | Introduced | Fixed |
|---|