CVE-2026-97941
mm/slab: tomar n->list_lock en __slab_try_return_freelist() para evitar la condición de carrera
- Publicado
- 25 sept 2026
- Actualizado
- 19 oct 2026
- Asignación de CNA
- Linux
- Evidencia observada
- 4 nov 2026
CVSS primario
nvd · CVSS 3.1
CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:HBajo · próximos 30 días
- Percentil
- 6,8 %
- Fecha del modelo
- 4 nov 2026
EPSS es una estimación estadística, no una certeza o una medida de impacto. Combínelo con CVSS, estado KEV, exposición y su entorno.
Resumen
En el kernel de Linux, se ha resuelto la siguiente vulnerabilidad: mm/slab: tomar n->list_lock en __slab_try_return_freelist() para evitar una condición de carrera. El commit ba7425312607 ("mm, slab: add an optimistic __slab_try_return_freelist()") asumió incorrectamente que nadie ha liberado un objeto al slab siempre que slab->freelist sea NULL y el cmpxchg tenga éxito. Sin embargo, como informó Hyunwoo Kim [1], otras CPU podrían haber liberado un objeto al slab, insertado el slab en la lista parcial, luego asignado un objeto desde el slab y estar en medio de la eliminación del slab de la lista bajo n->list_lock. Dado que __refill_objects_node() vuelve a colocar el slab en pc.slabs fuera de n->list_lock, podría insertar el slab en esa lista mientras el slab se está eliminando simultáneamente de n->partial. Esto provocó una corrupción de lista [1]: list_add corruption. next->prev should be prev (ffff888100000248), but was dead000000000122. (next=ffffea000416e410). kernel BUG at lib/list_debug.c:29! Oops: invalid opcode: 0000 [#1] SMP NOPTI CPU: 1 UID: 65534 PID: 144 Comm: poc Not tainted 7.2.0-16172-gcf72cbb39da8-dirty #1 PREEMPT(lazy) RIP: 0010:__list_add_valid_or_report+0x80/0xd0 ... Call Trace: alloc_from_new_slab+0x183/0x300 ___slab_alloc+0x31c/0x890 __kmalloc_noprof+0x3d4/0x800 lsm_blob_alloc+0x2d/0x50 security_msg_msg_alloc+0x26/0x90 load_msg+0x1aa/0x210 do_msgsnd+0x91/0x800 do_syscall_64+0x109/0x5d0 entry_SYSCALL_64_after_hwframe+0x77/0x7f ... Kernel panic - not syncing: Fatal exception. Este es un problema ABA clásico en el que el cmpxchg tiene éxito pero el estado ha cambiado desde que __refill_objects_node() tomó la freelist del slab. Como mencionó Vlastimil Babka [2], debería ser raro devolver más de un slab (debido a la lectura con condición de carrera de slab->counters en get_partial_node_bulk()). Por lo tanto, en lugar de introducir complejidad adicional, adquirir y liberar n->list_lock dos veces en el peor de los casos. Devolver el slab directamente a la lista parcial y mantener n->list_lock durante el cmpxchg y add_partial(). Esto es similar a la versión inicial del commit ba7425312607 [3]. Esto es suficiente para evitar la condición de carrera, ya que la manipulación de la lista está serializada por n->list_lock. Aprovechando la ocasión, restaurar la sugerencia unlikely() ahora que la condición es improbable.
Fuentes
Uso responsable
Utilice información sobre vulnerabilidades solo en sistemas de su propiedad o que esté autorizado a probar. Kitploit enlaza con metadatos de investigación pública y no almacena código de explotación ni cargas útiles maliciosas.