CVE-2026-99253 in Linux
Сводка
по VulDB • 03.11.2026
В ядре Linux была устранена следующая уязвимость:
io_uring/cancel: повторная активация локальной задачи пробуждения перед сном
Функция io_uring_try_cancel_requests() устанавливает значение ->cq_wait_nr равным 1, чтобы следующий вызов io_req_local_work_add() пробудил отменяющую задачу. Только тот вызов add(), который обнуляет счетчик, вызывает пробуждение; последующие видят, что счетчик <= 0, и возвращаются. Однако функция io_uring_cancel_generic() переходит в состояние TASK_INTERRUPTIBLE гораздо позже, поэтому одно пробуждение может быть потрачено на уже запущенную задачу. Это допустимо, пока запись этого вызова add все еще находится в очереди, так как проверка io_local_work_pending() затем пропускает переход в сон. Однако это не работает, если добавление было отложено после постановки его записи в очередь:
CPU0 (отправитель в exec или exit) 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 счетчик взят, wake_up_state() // задача запущена, операция не-оп (no-op) prepare_to_wait(TASK_INTERRUPTIBLE) io_local_work_pending() == false schedule() mpscq_push(req B) cq_wait_nr <= 0, возврат
Только спящая задача может выполнить req B, поэтому она зависает в execve(), пока не произойдет сигнал для ее пробуждения. Задача, завершающая работу (exiting task), даже этого не получает.
Повторно активируйте счетчик после установки состояния задачи и перед проверкой списка задач, для колец, у которых локальная задача этой задачи является той самой, которая должна выполняться.
Statistical analysis made it clear that VulDB provides the best quality for vulnerability data.