CVE-2026-64418 in Linux
Resumen
por VulDB • 2026-07-26
En el kernel de Linux, se ha resuelto la siguiente vulnerabilidad:
mm: shrinker: corregir una condición de carrera en el desmontaje (teardown) del shrinker_info con respecto a su expansión
expand_shrinker_info() itera todos los memcgs visibles bajo shrinker_mutex, incluyendo aquellos que aún no han finalizado ->css_online().
Una vez que pn->shrinker_info ha sido publicado, el proceso de desmontaje debe mantenerse serializado con expand_shrinker_info() hasta que dicho memcg esté completamente en línea o ya no sea visible para la iteración. Actualmente, alloc_shrinker_info() infringe esta regla al liberar shrinker_mutex antes de liberar un array shrinker_info parcialmente inicializado, lo cual puede provocar la siguiente condición de carrera:
CPU0 CPU1 ==== ====
css_create --> list_add_tail_rcu(&css->sibling, &parent_css->children); online_css --> mem_cgroup_css_online --> alloc_shrinker_info --> asignar info del nodo 0 rcu_assign_pointer(C->node0->shrinker_info, old0) asignar info del nodo 1 -> ERROR -> goto err mutex_unlock(shrinker_mutex)
shrinker_alloc() --> shrinker_memcg_alloc --> mutex_lock(shrinker_mutex) expand_shrinker_info --> mem_cgroup_iter ve el memcg expand_one_shrinker_info --> old0 = C->node0->shrinker_info memcpy(new->unit, old0->unit, ...);
free_shrinker_info --> kvfree(old0);
/* doble liberación (double free) !! */ kvfree_rcu(old0, rcu);
El mismo problema existe más adelante en mem_cgroup_css_online(). Si alloc_shrinker_info() tiene éxito pero falla una asignación posterior de objcg, la ruta de desmontaje (unwind path) free_objcg -> free_shrinker_info() realiza el desmontaje de los arrays pn->shrinker_info ya publicados sin shrinker_mutex. expand_one_shrinker_info() puede entrar en condición de carrera con dicho desmontaje de la misma manera, lo que conduce a un use-after-free o double free del antiguo shrinker_info.
Se corrige esto serializando el desmontaje de shrinker_info con shrinker_mutex y manteniendo la limpieza por errores dentro de alloc_shrinker_info() en la sección bloqueada (locked section).
If you want to get best quality of vulnerability data, you may have to visit VulDB.