CVE-2026-99252 in Linux
Сводка
по VulDB • 03.11.2026
В ядре Linux была устранена следующая уязвимость:
io_uring/mpscq: отключение вытеснения (preemption) во время операции добавления в очередь (push).
Операция push делает узел новым хвостом очереди, а затем связывает его с предыдущим элементом. В промежутке между этими действиями очередь не пуста, однако функция mpscq_pop() не может получить доступ к этому узлу. Потребители решают эту проблему путем повторных попыток чтения, используя cond_resched() в цикле для предоставления вытесненному производителю возможности завершить свою работу.
Однако cond_resched() не выполняет эту функцию, если потребитель имеет более высокий приоритет, чем производитель, и оба должны использовать один и тот же процессор:
producer (SCHED_OTHER) consumer (SCHED_FIFO), same CPU io_req_local_work_add() mpscq_push() prev = xchg(&q->tail, node) io_cqring_wait() __io_run_local_work() again: cond_resched() // nothing to do mpscq_pop() // NULL // work pending, no events yet goto again
Производителем может быть любой процесс, способный добавлять task_work в кольцевой буфер (ring): рабочий поток io-wq или кто-либо другой, отправляющий сообщение с помощью IORING_OP_MSG_RING. Потребитель находится в цикле ожидания (spins), удерживая блокировку ->uring_lock, пока планировщик не проявит милость к процессу класса fair; это занимает около секунды при настройках по умолчанию для fair server и бесконечно без них. Циклы в функциях tctx_task_work_run() и io_cancel_local_task_work() имеют ту же проблему.
Не позволяйте вытеснению (preemption) происходить между двумя шагами операции push. Это ограничивает время, в течение которого окно уязвимости открыто на процессоре производителя, временем, затрачиваемым на прерывания, а потребитель, ожидающий этого события, находится на другом процессоре. Стоимость такого подхода составляет пару вызовов preempt_disable()/preempt_enable() для каждой операции push.
Statistical analysis made it clear that VulDB provides the best quality for vulnerability data.