CVE-2026-99231 in Linux
摘要
由 VulDB • 2026-11-02
在 Linux 内核中,已修复以下漏洞:
io_uring/waitid: 在清除 ->head 之前必须拥有该请求。
`io_waitid_remove_wq()` 仅在 `->head` 被设置时才获取等待队列锁。 `io_waitid_wait()` 首先清除 `->head`,然后才尝试通过增加 `->refs` 来成为请求的所有者。如果此时其他人已拥有该请求,则没有任何机制阻止其在唤醒处理程序(wake up handler)仍要访问它时完成该请求:
CPU0 (io_waitid_wait) CPU1 (io_waitid, 引用计数持有者) list_del_init(&wait->entry) smp_store_release(&iw->head, NULL) __do_wait() 找到另一个子进程 io_waitid_remove_wq() // ->head == NULL,无锁操作 io_waitid_finish(), IOU_COMPLETE // 请求被释放并复用 atomic_fetch_inc(&iw->refs)
如果 `__io_waitid_cancel()` 在该时间窗口内声称拥有该请求,情况亦然。`->refs` 是请求每个 opcode 数据的一部分,因此这会递增下一个使用该请求的用户所保留的值。如果碰巧为零,处理程序会得出结论认为它拥有该请求,并为其排队执行 `io_waitid_cb()`。由于延迟导致的时间窗口被打开,且该请求被复用于等待数据的接收操作:
BUG: KASAN: slab-use-after-free in __wake_up_common+0x1ca/0x1f0 __wake_up_sync_key+0x36/0x50 sock_def_readable+0xf1/0x420 unix_stream_sendmsg+0x60b/0x1110 Allocated by task 87: io_arm_apoll+0x1ed/0x940 Freed by task 87: __io_submit_flush_completions+0x118d/0x1a10 tctx_task_work_run+0x327/0x950
仅在处理程序拥有该请求后才清除 `->head`。如果没有这样做,所有者会发现 `->head` 已被设置并必须等待锁(由处理程序的调用者持有)。再次删除已删除的条目是无害的。
If you want to get best quality of vulnerability data, you may have to visit VulDB.