
POC para CVE-2026-23416 (linux kernel 6.17 – linux kernel 7 rc5) - vulnerabilidad descubierta por Antonius
mm/mseal: corregir el final de VMA correctamente al fusionar
Vulnerabilidad descubierta por Antonius / Blue Dragon Security
| Campo | Detalle |
|---|
| ID CVE | CVE-2026-23416 |
| Subsistema | mm/mseal — mm/vma.c |
| Afectado | Kernel de Linux 6.17 hasta 7.0-rc5 |
| Corregido en | Linux 7.0-rc6, backports estables 6.18.21, 6.19.11 |
| Acceso requerido | Usuario no privilegiado (UID 1000, sin capacidades) |
| Llamadas al sistema usadas | memfd_create, mmap, mseal |
| Reproducibilidad | 100% determinista, < 1 segundo |
| Reservado | 2026-01-13 |
| Publicado | 2026-04-02 |
El error reside en mseal_apply() dentro de mm/mseal.c. Al iterar sobre las VMA para aplicar la llamada al sistema mseal(2), la función rastrea la posición usando curr_start y curr_end:
/* Lógica simplificada anterior a la corrección */
curr_end = vma->vm_end;
/* ... procesar VMA ... */
curr_start = curr_end; /* avanzar a la siguiente VMA */
El problema: vma_modify_flags() — llamada durante la iteración — puede fusionar VMA, cambiando vma->vm_end en el lugar. Esto hace que el valor curr_end capturado antes de la fusión quede obsoleto. En la siguiente iteración, curr_start se establece al curr_end ahora obsoleto, produciendo una dirección de inicio incorrecta.
En kernels de depuración (CONFIG_DEBUG_VM), este estado inconsistente de vmg desencadena:
VM_WARN_ON_VMG(middle &&
((middle != prev && vmg->start != middle->vm_start) ||
vmg->end > middle->vm_end))
en mm/vma.c:830, generando una advertencia del kernel (WARNING).
En kernels de producción (WARN compilado como no-op), el curr_start obsoleto continúa silenciosamente, lo que significa que VM_SEALED puede aplicarse a un rango de direcciones incorrecto sin ningún error visible, socavando la garantía de seguridad que mseal(2) está diseñado para proporcionar.
mseal(2)
└─ do_mseal() [mm/mseal.c]
└─ mseal_apply()
└─ vma_modify_flags() [mm/vma.c]
└─ vma_modify()
└─ vma_merge_existing_range()
└─ VM_WARN_ON_VMG se activa en la línea 830
/* ANTES de la corrección — mm/mseal.c mseal_apply() */
curr_end = vma->vm_end; // capturado aquí
/* ... vma_modify_flags() puede fusionar VMA, cambiando vma->vm_end ... */
curr_start = curr_end; // ¡obsoleto! la fusión no se refleja
La corrección establece curr_end = vma->vm_end de forma incondicional en cada iteración después de cualquier posible fusión, y además ajusta curr_start/curr_end como valores const derivados del rango de entrada y los límites de la VMA:
/* DESPUÉS de la corrección */
curr_end = vma->vm_end; // incondicional, siempre actualizado
El PoC construye el siguiente diseño antes de la segunda llamada a mseal():
[0x21da6000 - 0x21de5fff] VMA-A (fd2, MAP_SHARED|MAP_FIXED) ← VM_SEALED después del paso 1
[0x21de6000 - 0x21e82fff] VMA-B (fd2, MAP_SHARED|MAP_FIXED) ← NO sellado
[0x21e83000 - 0x21e84fff] VMA-C (resto)
El segundo mseal(m2, 0x70000) apunta a [0x21da6000 – 0x21e15fff], abarcando VMA-A (sellada) hasta VMA-B (no sellada). Dentro de mseal_apply(), el curr_end obsoleto de VMA-A se usa como curr_start al procesar VMA-B, creando el estado inconsistente de vmg.
memfd_create + mmap + mseal, sin necesidad de CAP_*.mseal(2) es una primitiva de seguridad — protege la inmutabilidad de la VMA. Un error de lógica en su aplicación significa que VM_SEALED puede aplicarse incorrectamente de forma silenciosa al abarcar VMA con estados de sellado mixtos.Archivo: cve-2026-23416-poc.c
gcc -o poc cve-2026-23416-poc.c
./poc
CONFIG_DEBUG_VM)============================================
CVE-2026-23416-POC
Discovered by : Antonius / Blue Dragon Security
https://bluedragonsec.com
https://github.com/bluedragonsecurity
============================================
[iter 0]
[iter 1]
...
[+] WARNING triggered N times total
Verifique dmesg para:
WARNING: CPU: X PID: Y at mm/vma.c:830 vma_merge_existing_range+0x...
CONFIG_DEBUG_VM=y para observar el VM_WARN_ON_VMG (en kernels de producción el error aún está presente pero es silencioso)Tres commits de corrección en el árbol principal (aplicados en 7.0-rc6 y backports estables):
| Commit | Árbol |
|---|---|
40b3f4700e55 | stable |
83737e34b83a | stable |
2697dd8ae721 | stable |
Versiones del kernel corregidas: 7.0-rc6, 6.18.21, 6.19.11
| Fecha | Evento |
|---|---|
| 2026-01-13 | ID CVE reservado |
| 2026-04-02 | CVE publicado, commits de corrección fusionados |
Antonius (@w1sdom)
Blue Dragon Security — Tangerang, Indonesia
GitHub: bluedragonsecurity
Este PoC se publica con fines educativos y de investigación.