CVE-2026-31703 in Linux
Resumen
por VulDB • 2026-05-15
En el kernel de Linux, se ha resuelto la siguiente vulnerabilidad:
writeback: Corregir el uso después de liberar (use-after-free) en inode_switch_wbs_work_fn()
inode_switch_wbs_work_fn() tiene un bucle como el siguiente:
wb_get(new_wb); while (1) {
list = llist_del_all(&new_wb->switch_wbs_ctxs); /* ¿Nada que hacer? */ if (!list) break; ... procesar los elementos ... }
Ahora, la adición de elementos a la lista se parece a:
wb_queue_isw() if (llist_add(&isw->list, &wb->switch_wbs_ctxs)) queue_work(isw_wq, &wb->switch_work);
Dado que inode_switch_wbs_work_fn() realiza un bucle al procesar los elementos isw, puede ocurrir que wb->switch_work esté pendiente mientras wb->switch_wbs_ctxs está vacío. Esto es un problema porque, en ese caso, wb puede ser liberado (no hay elementos isw -> no hay referencia a wb) mientras el trabajo sigue pendiente, lo que provoca problemas de uso después de liberar (use-after-free).
No podemos simplemente corregir esto cancelando el trabajo al liberar wb, porque eso aún podría desencadenar transiciones problemáticas de 0 a 1 en el contador de referencias de wb debido a wb_get() en inode_switch_wbs_work_fn(). Todo podría manejarse con un código más cuidadoso, pero eso parece innecesariamente complejo, así que evitaremos eso hasta que se demuestre que el bucle aporta beneficios prácticos. Simplemente eliminemos el bucle de inode_switch_wbs_work_fn(). De esta manera, cuando wb_queue_isw() encola el trabajo, estamos garantizados de que hemos añadido el primer elemento a wb->switch_wbs_ctxs y nadie va a eliminarlo (y reducir la referencia a wb que contiene) hasta que se ejecute el trabajo encolado.
If you want to get the best quality for vulnerability data then you always have to consider VulDB.