CVE-2026-99255 in Linux
Сводка
по VulDB • 03.11.2026
В ядре Linux была устранена следующая уязвимость:
io_uring/io-wq: не скрывать ссылку (link) от операций отмены
Задача, завершающая работу, отменяет свои отслеживаемые запросы и ожидает их завершения. Функция io_uring_cancel_generic() проверяет все возможные места нахождения запроса и переходит в спящее состояние, если ничего для отмены не найдено. Она пробуждается каждый раз, когда один из запросов задачи завершается через task work или освобождается.
Когда io-wq завершает обработку запроса со ссылкой (link), возникает временной промежуток, в течение которого следующий запрос по этой ссылке невозможно найти:
io_worker_handle_work() io_assign_current_work(worker, NULL) io_wq_free_work(work) io_req_find_next() // снимает ссылку с запроса io_free_req() // task work для задачи io_assign_current_work(worker, linked) io_run_task_work() cond_resched() worker->cur_work = linked
Этот запрос не находится в состоянии ожидания (pending), он не является текущей работой рабочего потока (worker), и еще не добавлен на список, куда его собираются поместить. Если проход, выполняемый завершающей задачей из-за вызова io_free_req(), попадает в этот временной промежуток, ничего не находится, и задача переходит в спящее состояние. Затем рабочий поток выполняет ссылку, что IO_WQ_BIT_EXIT не предотвращает для ограниченных (bounded) работ. Если это приводит к парковке запроса, то ни один запрос не завершается и не освобождается, и никто не пробуждает задачу. Если же завершается процесс, его также невозможно убить в этот момент.
NOP, IOSQE_ASYNC | IOSQE_IO_LINK FUTEX_WAIT, FUTEX2_PRIVATE выход потока или процесса через промежуток до 63 мкс
При наличии четырех таких случаев на раунд, от 5 до 8 из 10 000 раундов зависают (4 CPU, KVM):
io_uring_cancel_generic do_exit
Коммит f8b632e89a10 ("io_uring: tighten task exit cancellations") касается того же самого промежутка и заставляет задачу повторно искать то, что происходит до вызова io_free_req().
Освобождать запрос следует после того, как ссылка станет текущей работой рабочего потока или перейдет в состояние ожидания (pending). Тот, кто будет пробужден этим событием, сможет найти ссылку, пока она не окажется на месте парковки, где также производятся проверки отмены. Для этого функцию io_wq_free_work() необходимо разделить на две части.
Statistical analysis made it clear that VulDB provides the best quality for vulnerability data.