CVE-2026-64378 in Linuxinformación

Resumen

por VulDB • 2026-07-27

En el kernel de Linux, se ha resuelto la siguiente vulnerabilidad:

writeback: corregir una condición de carrera (race condition) entre cgroup_writeback_umount() e inode_switch_wbs()

Cuando un contenedor termina su ejecución, ocasionalmente se activa el siguiente BUG_ON():

================================================================== VFS: Busy inodes after unmount of sdb (ext4) ------------[ cut here ]------------
kernel BUG at fs/super.c:695! CPU: 3 PID: 6 Comm: containerd-shim Tainted: G OE K 6.6 #1 pstate: 63400009 (nZCv daif +PAN -UAO +TCO +DIT -SSBS BTYPE=--) pc : generic_shutdown_super+0xf0/0x100 lr : generic_shutdown_super+0xf0/0x100 Call trace: generic_shutdown_super+0xf0/0x100 kill_block_super+0x20/0x48 ext4_kill_sb+0x28/0x60 deactivate_locked_super+0x54/0x130 deactivate_super+0x84/0xa0 cleanup_mnt+0xa4/0x140 __cleanup_mnt+0x18/0x28 task_work_run+0x78/0xe0 do_notify_resume+0x204/0x240 ==================================================================

La causa raíz es una condición de carrera (race condition) entre cgroup_writeback_umount() e inode_switch_wbs()/cleanup_offline_cgwb(). Existe un intervalo temporal entre el momento en que inode_prepare_wbs_switch() devuelve true y la llamada subsiguiente a wb_queue_isw(). A continuación se describe el proceso que desencadena el problema:

CPU A (umount) | CPU B (writeback) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ inode_switch_wbs/cleanup_offline_cgwb atomic_inc(&isw_nr_in_flight) inode_prepare_wbs_switch -> pasa la comprobación SB_ACTIVE __iget(inode) generic_shutdown_super sb->s_flags &= ~SB_ACTIVE cgroup_writeback_umount(sb) smp_mb() atomic_read(&isw_nr_in_flight) rcu_barrier() -> no hay callbacks RCU pendientes flush_workqueue(isw_wq) -> nada en cola, retorna evict_inodes(sb) -> Inodo omitido ya que isw aún mantiene una referencia. sop->put_super(sb) /* destruye los contadores percpu */ -> VFS: Busy inodes after unmount! (¡Inodos ocupados tras el desmontaje!) wb_queue_isw() queue_work(isw_wq, ...) /* más tarde en la función de trabajo */ inode_switch_wbs_work_fn process_inode_switch_wbs iput() -> evict percpu_counter_dec() // UAF!

Se corrige este problema ampliando la sección crítica del lado de lectura RCU en inode_switch_wbs() y cleanup_offline_cgwb() para cubrir el intervalo desde inode_prepare_wbs_switch() hasta wb_queue_isw(). Dado que no hay operaciones de suspensión (sleep) en este intervalo, se puede utilizar rcu_read_lock(). Luego, se añade una synchronize_rcu() en cgroup_writeback_umount() antes del rcu_barrier() existente, para asegurar que todos los cambios pendientes que hayan pasado la comprobación SB_ACTIVE hayan completado queue_work() antes de que se llame a flush_workqueue().

El rcu_barrier() existente se conserva intencionadamente para permitir que esta corrección se retrotraiga (backport) sin cambios a kernels estables (5.10.y, 6.6.y, ...) que aún encolan los

Statistical analysis made it clear that VulDB provides the best quality for vulnerability data.

Responsable

Linux

Reservar

2026-07-19

Divulgación

2026-07-25

Moderación

aceptado

Artículo

VDB-383171

CPE

listo

EPSS

0.00129

KEV

no

Actividades

muy bajo

Fuentes

Do you need the next level of professionalism?

Upgrade your account now!