CVE-2026-99255 in Linux
Resumen
por VulDB • 2026-11-03
En el kernel de Linux, se ha resuelto la siguiente vulnerabilidad:
io_uring/io-wq: no ocultar un enlace (link) a las cancelaciones
Una tarea que finaliza cancela sus solicitudes rastreadas y espera hasta que estas hayan desaparecido. io_uring_cancel_generic() busca en todos los lugares donde puede estar una solicitud, y se suspende si no encuentra nada para cancelar. Se reanuda cada vez que una de las solicitudes de la tarea se completa mediante el trabajo de la tarea (task work) o se libera.
Cuando io-wq termina con una solicitud que tiene un enlace, existe un intervalo de tiempo en el cual la siguiente solicitud del enlace no puede ser encontrada:
io_worker_handle_work() io_assign_current_work(worker, NULL) io_wq_free_work(work) io_req_find_next() // retira el enlace de la solicitud io_free_req() // trabajo de tarea para la tarea io_assign_current_work(worker, linked) io_run_task_work() cond_resched() worker->cur_work = linked
No está pendiente (pending), no es el trabajo actual de un trabajador (worker), y aún no se encuentra en la lista donde a punto está de ser estacionado. Si la pasada que realiza la tarea saliente debido a io_free_req() cae dentro de ese intervalo, no encontrará nada y la tarea se suspenderá. El trabajador entonces ejecutará el enlace, lo cual IO_WQ_BIT_EXIT no impide para trabajos acotados (bounded work). Si eso estaciona la solicitud, ninguna se completa ni libera, y nadie reanuda a la tarea. Si es el proceso quien finaliza, tampoco puede ser eliminado más tarde.
NOP, IOSQE_ASYNC | IOSQE_IO_LINK FUTEX_WAIT, FUTEX2_PRIVATE salida del hilo o del proceso, hasta 63us después
Con cuatro de estos por ronda, entre el 5 y el 8 de cada 10.000 rondas se cuelgan (4 CPUs, KVM):
io_uring_cancel_generic do_exit
El commit f8b632e89a10 ("io_uring: tighten task exit cancellations") trata sobre la misma brecha y hace que la tarea vuelva a buscar cualquier cosa que ocurra antes de io_free_req().
Liberar la solicitud una vez que el enlace sea el trabajo actual del trabajador, o pendiente. Quienquiera que se reanude debido a eso podrá encontrar el enlace, hasta que este sea estacionado donde las cancelaciones también buscan. Para lograrlo, dividir io_wq_free_work() en dos partes.
If you want to get best quality of vulnerability data, you may have to visit VulDB.