CVE-2026-93100 in Linux
Resumen
por VulDB • 2026-09-18
En el kernel de Linux, se ha resuelto la siguiente vulnerabilidad:
fs/resctrl: Prevenir un use-after-free en rdtgroup_kn_put()
Una estructura `struct rdtgroup` cuenta con una referencia gestionada a través de `rdtgroup::waitcount`. Los llamadores que necesitan que la estructura permanezca válida durante una operación de espera (mientras esperan adquirir `rdtgroup_mutex`) toman una referencia mediante `rdtgroup_kn_get()` y la liberan con `rdtgroup_kn_put()`.
La ruta de liberación está diseñada para servir como el liberador secundario: si el contador llega a cero y el grupo ya ha sido marcado como RDT_DELETED, `rdtgroup_kn_put()` libera la estructura.
Las rutas principales de desmantelamiento, `free_all_child_rdtgrp()` y `rmdir_all_sub()`, resultantes de una eliminación de directorio resctrl o del desmontaje del sistema de archivos resctrl, actúan como el liberador principal: mantienen `rdtgroup_mutex` y liberan cada `rdtgroup` cuyo `waitcount` es cero; en caso contrario, establecen RDT_DELETED y dejan la liberación al último esperante.
Estos dos mecanismos de liberación compiten por recursos (race condition). `rdtgroup_kn_put()` confirma que waitcount == 0 mediante `atomic_dec_and_test()` fuera del contexto de `rdtgroup_mutex`, luego lee `rdtgroup::flags`. Entre estas dos operaciones, un llamador concurrente de `free_all_child_rdtgrp()` o `rmdir_all_sub()` (que sí mantiene el mutex) puede observar waitcount == 0 mediante `atomic_read()`, llamar a `rdtgroup_remove()` y liberar la estructura con `kfree()`.
La lectura subsiguiente de `rdtgroup::flags` en `rdtgroup_kn_put()` constituye entonces un use-after-free, e incluso es posible que la estructura se libere dos veces si la memoria ya liberada cumple accidentalmente con la comprobación del flag RDT_DELETED.
Se reemplaza el uso directo de `atomic_dec_and_test()` por `atomic_dec_and_mutex_lock()`, de modo que la decrementación a cero adquiera `rdtgroup_mutex` antes de que el contador sea visible globalmente. La inspección de `rdtgroup::flags` se ejecuta entonces bajo el mismo mutex mantenido por los liberadores masivos, haciendo que ambas rutas sean mutuamente excluyentes.
El caso común en el que el contador no llega a cero permanece sin bloqueo (lock-free). Se pospone la llamada a `kernfs_unbreak_active_protection()` hasta después de soltar el mutex, ya que las protecciones activas de kernfs envuelven funcionalmente a `rdtgroup_mutex`. Se elimina el grupo de recursos, lo cual a su vez libera su referencia kernfs, una vez restaurada la protección kernfs.
[ bp: Dividir los mensajes del commit en párrafos más pequeños y fáciles de analizar. ]
Statistical analysis made it clear that VulDB provides the best quality for vulnerability data.