Vulnerabilidad en Linux (CVE-2025-68807)
Gravedad:
Pendiente de análisis
Tipo:
No Disponible / Otro tipo
Fecha de publicación:
13/01/2026
Última modificación:
15/04/2026
Descripción
En el kernel de Linux, la siguiente vulnerabilidad ha sido resuelta:<br />
<br />
block: corrige la condición de carrera entre wbt_enable_default y el envío de E/S<br />
<br />
Cuando wbt_enable_default() se mueve fuera de la congelación de la cola en elevator_change(), puede hacer que el contador inflight de wbt se vuelva negativo (-1), lo que lleva a tareas colgadas en la ruta de writeback. Las tareas se quedan atascadas en wbt_wait() porque el contador está en un estado inconsistente.<br />
<br />
El problema ocurre porque wbt_enable_default() podría competir con el envío de E/S, permitiendo que el contador se decremente antes de la inicialización adecuada. Esto se manifiesta como:<br />
<br />
rq_wait[0]:<br />
inflight: -1<br />
has_waiters: True<br />
<br />
rwb_enabled() verifica el estado, que puede actualizarse exactamente entre wbt_wait() (rq_qos_throttle()) y wbt_track()(rq_qos_track()), entonces el contador inflight se volverá negativo.<br />
<br />
Y resulta en advertencias de tareas colgadas como:<br />
task:kworker/u24:39 state:D stack:0 pid:14767<br />
Call Trace:<br />
rq_qos_wait+0xb4/0x150<br />
wbt_wait+0xa9/0x100<br />
__rq_qos_throttle+0x24/0x40<br />
blk_mq_submit_bio+0x672/0x7b0<br />
...<br />
<br />
Esto se soluciona mediante:<br />
<br />
1. Dividiendo wbt_enable_default() en:<br />
- __wbt_enable_default(): Devuelve verdadero si se debe llamar a wbt_init()<br />
- wbt_enable_default(): Envoltorio para las funciones que ya lo llaman (sin inicialización)<br />
- wbt_init_enable_default(): Nueva función que verifica e inicializa WBT<br />
<br />
2. Usando wbt_init_enable_default() en blk_register_queue() para asegurar una inicialización adecuada durante el registro de la cola<br />
<br />
3. Moviendo wbt_init() fuera de wbt_enable_default(), que es solo para habilitar wbt deshabilitado de bfq e iocost, y wbt_init() no es necesario. Así se puede evitar la advertencia de bloqueo original.<br />
<br />
4. Eliminando la bandera ELEVATOR_FLAG_ENABLE_WBT_ON_EXIT y su código de manejo, ya que ya no es necesario<br />
<br />
Esto asegura que WBT se inicialice correctamente antes de que se pueda enviar cualquier E/S, evitando que el contador se vuelva negativo.



