Cloudanix VulnDB

CVE-2026-99230

None

CVSS

—

EPSS

0.2%

Published

Nov 2, 2026

CISA due date

—

Cloudanix analysis

Schedule a fix SSVC: Track

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

  1. Submit cancelable io_uring command that populates ->hash_node
  2. Trigger io_uring_cmd_del_cancelable() leaving LIST_POISON in the node
  3. Force request recycling through the io_uring request cache
  4. Allocate the poisoned request for a concurrent vectored futex wait
  5. Race the wake-up so io_futexv_complete() dereferences the poisoned node
  6. 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