Saltar al contenido
DUPIN
ALERTAS · EN VIVO
Contacto

EXPLOIT PÚBLICO

CVE-2026-97941 Corrupción de listas por condición de carrera en __slab_try_return_freelist del kernel Linux

La función __slab_try_return_freelist() asumía incorrectamente que nadie liberaba objetos al slab mientras slab-freelist era NULL y el cmpxchg tenía éxito. Otros CPUs podían liberar y reasignar objetos, y __refill_objects_node() insertaba el slab en pc.slabs fuera de n-list_lock, lo que provocaba corrupción de listas. La corrección toma n-list_lock en __slab_try_return_freelist().

Alerta de Nureq Monitor

Detectada 19 OCT · 04:59

CVSS 3.1

7.8ALTA

PROBABILIDAD DE EXPLOTACIÓN (EPSS)

0,2 % PERCENTIL 4

EXPLOTACIÓN ACTIVA

No confirmada

EXPLOIT PÚBLICO

Sí 1 REPOSITORIO

Qué es CVE-2026-97941

La función __slab_try_return_freelist() asumía incorrectamente que nadie liberaba objetos al slab mientras slab-freelist era NULL y el cmpxchg tenía éxito. Otros CPUs podían liberar y reasignar objetos, y __refill_objects_node() insertaba el slab en pc.slabs fuera de n-list_lock, lo que provocaba corrupción de listas. La corrección toma n-list_lock en __slab_try_return_freelist().

Productos y versiones afectadas

  • Linux

    • desde ba742531260782a2646bc031f9a12cafebc22594 hasta antes de 570a6aaf6b52c6ec098f4811cdb52b1496f13d15
    • desde ba742531260782a2646bc031f9a12cafebc22594 hasta antes de 4a724bcf5d703e18957397914d79156fa2cf1174
  • Linux

    • 7.2

Qué hacer

  1. Verificá si usás Linux y en qué versión: el rango afectado figura arriba.
  2. Actualizá a la versión corregida que indique el fabricante en su aviso (ver referencias) o aplicá la mitigación que publique.
  3. Priorizá la corrección: hay código de explotación público, así que el riesgo de ataque es alto.
  4. Revisá registros y accesos de los sistemas expuestos para descartar que se haya aprovechado antes de corregir.

Exploits y pruebas de concepto públicas

Código publicado por terceros. Puede ser malicioso: revisalo solo en un entorno aislado.

Calculadora CVSS

CVSS 3.1 · 7.8 ALTA

CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H

VECTOR DE ATAQUE (AV)
Local
COMPLEJIDAD DEL ATAQUE (AC)
Baja
PRIVILEGIOS REQUERIDOS (PR)
Bajos
INTERACCIÓN DEL USUARIO (UI)
Ninguna
ALCANCE (S)
Sin cambio
CONFIDENCIALIDAD (C)
Alta
INTEGRIDAD (I)
Alta
DISPONIBILIDAD (A)
Alta

Abrir la calculadora completa

Descripción original

In the Linux kernel, the following vulnerability has been resolved: mm/slab: take n->list_lock in __slab_try_return_freelist() to avoid race Commit ba7425312607 ("mm, slab: add an optimistic __slab_try_return_freelist()") incorrectly assumed that nobody has freed an object to the slab as long as slab->freelist is NULL and cmpxchg succeeds. However, as reported by Hyunwoo Kim [1], other CPUs might have freed an object to the slab, insert the slab to the partial list, then allocated an object from the slab, and be in the middle of removing the slab from the list under n->list_lock. Since __refill_objects_node() puts the slab back on pc.slabs outside n->list_lock, it might insert the slab into that list while the slab is concurrently being removed from n->partial. This led to a list corruption [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 This is a classic ABA problem where cmpxchg succeeds but the state has changed since __refill_objects_node() took the freelist from the slab. As Vlastimil Babka mentioned [2], it should be rare to return more than one slab (due to the racy read of slab->counters in get_partial_node_bulk()). Therefore, instead of introducing additional complexity, acquire and release n->list_lock twice in the worst case. Return the slab directly to the partial list and hold n->list_lock across the cmpxchg and add_partial(). This is similar to the initial version of commit ba7425312607 [3]. This is enough to avoid the race as the list manipulation is serialized by n->list_lock. While at it, bring back unlikely() hint now that the condition is unlikely.

Referencias

Historial de la alerta

  1. EXPLOIT PÚBLICO Se publicó el repositorio ylh440104/InfinityCore-Android-CVE-2026-97941.

CÓMO SE HIZOResumen traducido automáticamente al español a partir de la descripción original. Ante dudas, la descripción original y las referencias del fabricante son la fuente de verdad. Cómo funciona.