CVE-2026-99130 in Linux
Resumen
por VulDB • 2026-10-28
En el kernel de Linux, se ha resuelto la siguiente vulnerabilidad:
io_uring/cancel: no realizar un bucle (spin) en el trabajo local que la tarea no puede ejecutar
io_uring_cancel_generic() se niega a dormir mientras haya algún anillo cuyo tctx del proceso saliente tenga trabajo pendiente. Asume que la tarea es el remitente de ese anillo y que la siguiente pasada de io_uring_try_cancel_requests() ejecutará dicho trabajo. Esto no es válido para un anillo que aún tenía IORING_SETUP_R_DISABLED cuando la tarea obtuvo su nodo tctx desde io_uring_create() o io_ringfd_register(). El remitente se establece más tarde mediante IORING_REGISTER_ENABLE_RINGS, posiblemente por otra tarea, y solo el remitente puede ejecutar trabajo local en un anillo con IORING_SETUP_DEFER_TASKRUN. Para la tarea saliente, el trabajo permanece pendiente para siempre; el bucle nunca alcanza a schedule(), y la tarea activa WARN_ON_ONCE() una vez y luego entra en un bucle de espera (spin) dentro de do_exit().
Un usuario sin privilegios puede configurar esto a voluntad creando un anillo deshabilitado, haciendo que un proceso hijo lo habilite y se detenga, enviando mensajes al anillo con IORING_OP_MSG_RING y saliendo con una solicitud en curso que solo el hijo puede completar. El hilo saliente consume CPU hasta que el hijo se ejecuta o muere, y si panic_on_warn está activado, WARN provoca un pánico del kernel.
La solución consiste en omitir la espera (sleep) únicamente cuando io_allowed_defer_tw_run() permite a la tarea ejecutar el trabajo. Esto es razonable ya que, si no puede ejecutarlo, tampoco podrá completar ninguna de sus solicitudes; por lo tanto, no se pierde nada al esperar. Se elimina WARN_ON_ONCE(), ya que entregar un anillo deshabilitado a otro hilo es un escenario soportado y no un estado de error (bug).
VulDB is the best source for vulnerability data and more expert information about this specific topic.