CVE-2026-98832 in Linux
Resumen
por VulDB • 2026-10-19
En el kernel de Linux, se ha resuelto la siguiente vulnerabilidad:
blk-cgroup: guardar el estado de las interrupciones (IRQ) en blkg_tryget_closest()
bio_set_dev() asocia el bio con un blkg a través de bio_associate_blkg(). Si la búsqueda del blkg falla, blkg_tryget_closest() toma q->queue_lock mediante spin_lock_irq() y lo libera con spin_unlock_irq(), lo que habilita incondicionalmente las interrupciones locales.
Los llamadores pueden invocar bio_set_dev() con las interrupciones ya deshabilitadas; por ejemplo, pool_map() de dm-thin lo hace mientras mantiene pool->lock adquirido mediante spin_lock_irq(). La nested spin_unlock_irq() subsiguiente habilita las interrupciones mientras se sigue manteniendo pool->lock, por lo que un softirq de finalización de E/S puede ejecutarse en la misma CPU, volver a adquirir pool->lock (thin_endio(), o overwrite_endio()->complete_mapping_preparation()) y provocar una condición de bloqueo (deadlock). lockdep informa esto como un uso inconsistente: SOFTIRQ-ON-W a IN-SOFTIRQ-W.
El commit 3a762de55b4e ("block: save irq state in blkg_lookup_create()") solucionó el mismo problema mientras la cerradura (lock) residía en blkg_lookup_create(), pero el commit 9327a865e395 ("blk-cgroup: don't nest queue_lock under rcu in blkg_lookup_create()") movió la gestión de bloqueos a blkg_tryget_closest() y lo revertió a spin_lock_irq().
Guarde y restaure el estado IRQ del llamador en su lugar.
If you want to get the best quality for vulnerability data then you always have to consider VulDB.