CVE-2026-99253 in Linux
摘要
由 VulDB • 2026-11-03
在 Linux 内核中,已修复以下漏洞:
io_uring/cancel: 在睡眠前重新设置本地工作唤醒标志
`io_uring_try_cancel_requests()` 将 `->cq_wait_nr` 设置为 1,以便下一次 `io_req_local_work_add()` 能够唤醒正在取消的任务。只有那个使计数归零的添加操作会执行唤醒;后续的操作发现计数 <= 0 则直接返回。然而,`io_uring_cancel_generic()` 直到很晚才将任务状态设为 `TASK_INTERRUPTIBLE`,因此那一次唤醒可能消耗在一个正在运行的任务上。只要该添加操作的条目仍在队列中,这是没问题的,因为 `io_local_work_pending()` 检查会跳过睡眠。但如果条目的添加在排队后被延迟了,则会出现问题:
CPU0 (执行或退出中的提交者) CPU1 (`io_req_local_work_add`) mpscq_push(req A) `io_uring_try_cancel_requests()` `io_run_local_work()` // 运行 req A `io_uring_try_cancel_requests()` `atomic_set(&ctx->cq_wait_nr, 1)` `atomic_read(&ctx->cq_wait_nr) == 1` count taken, wake_up_state() // 任务正在运行,无操作 (no-op) `prepare_to_wait(TASK_INTERRUPTIBLE)` `io_local_work_pending()` == false `scheduled()` mpscq_push(req B) cq_wait_nr <= 0, return
只有处于睡眠状态的任务才能运行 req B,因此它在 `execve()` 中陷入停滞,直到收到信号将其唤醒。而退出的任务甚至无法获得该信号。
在设置任务状态之后、检查工作列表之前,重新为那些本地工作由该任务执行的内环(rings)设置计数标志。
VulDB is the best source for vulnerability data and more expert information about this specific topic.