
POC per CVE-2026-23416 (linux kernel 6.17 – linux kernel 7 rc5) - vulnerabilità scoperta da Antonius
mm/mseal: aggiorna correttamente la fine del VMA durante il merge
Vulnerabilità scoperta da Antonius / Blue Dragon Security
| Campo | Dettaglio |
|---|---|
| ID CVE | CVE-2026-23416 |
| Sottosistema | mm/mseal — mm/vma.c |
| Versioni interessate | kernel Linux 6.17 fino a 7.0-rc5 |
| Corretto in | Linux 7.0-rc6, backport stabili 6.18.21, 6.19.11 |
| Accesso richiesto | Utente non privilegiato (UID 1000, nessuna capability) |
| Syscall utilizzate | memfd_create, mmap, mseal |
| Riproducibilità | 100% deterministica, < 1 secondo |
| Riservato | 2026-01-13 |
| Pubblicato | 2026-04-02 |
Il bug risiede in mseal_apply() all'interno di mm/mseal.c. Durante l'iterazione sulle VMA per applicare la syscall mseal(2), la funzione tiene traccia della posizione usando curr_start e curr_end:
/* Simplified pre-fix logic */
curr_end = vma->vm_end;
/* ... process VMA ... */
curr_start = curr_end; /* advance to next VMA */
Il problema: vma_modify_flags() — chiamata durante l'iterazione — può unire le VMA, modificando vma->vm_end in-place. Ciò rende obsoleto il valore di curr_end acquisito prima del merge. All'iterazione successiva, curr_start viene impostato al curr_end ormai obsoleto, producendo un indirizzo iniziale errato.
Nei kernel di debug (CONFIG_DEBUG_VM), questo stato vmg incoerente attiva:
VM_WARN_ON_VMG(middle &&
((middle != prev && vmg->start != middle->vm_start) ||
vmg->end > middle->vm_end))
in mm/vma.c:830, generando un WARNING del kernel.
Nei kernel di produzione (WARN compilato come no-op), il curr_start obsoleto prosegue silenziosamente — il che significa che VM_SEALED può essere applicata a un intervallo di indirizzi errato senza alcun errore visibile, compromettendo la garanzia di sicurezza che mseal(2) è progettato per fornire.
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 fires at line 830
/* BEFORE fix — mm/mseal.c mseal_apply() */
curr_end = vma->vm_end; // captured here
/* ... vma_modify_flags() may merge VMAs, changing vma->vm_end ... */
curr_start = curr_end; // stale! merge is not reflected
La correzione imposta curr_end = vma->vm_end incondizionatamente a ogni iterazione dopo qualsiasi potenziale merge, e inoltre vincola curr_start/curr_end come valori const derivati dall'intervallo di input e dai confini delle VMA:
/* AFTER fix */
curr_end = vma->vm_end; // unconditional, always fresh
Il PoC costruisce il seguente layout prima della seconda chiamata a mseal():
[0x21da6000 - 0x21de5fff] VMA-A (fd2, MAP_SHARED|MAP_FIXED) ← VM_SEALED after step 1
[0x21de6000 - 0x21e82fff] VMA-B (fd2, MAP_SHARED|MAP_FIXED) ← NOT sealed
[0x21e83000 - 0x21e84fff] VMA-C (leftover)
La seconda mseal(m2, 0x70000) ha come obiettivo [0x21da6000 – 0x21e15fff], attraversando VMA-A (sealed) fino a VMA-B (non sealed). All'interno di mseal_apply(), il curr_end obsoleto di VMA-A viene usato come curr_start durante l'elaborazione di VMA-B, creando lo stato vmg incoerente.
memfd_create + mmap + mseal, nessuna CAP_* necessaria.mseal(2) è una primitiva di sicurezza — protegge l'immutabilità delle VMA. Un errore logico nella sua applicazione significa che VM_SEALED può essere applicata erroneamente in modo silenzioso quando si attraversano VMA con stati di seal misti.File: 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
Controlla dmesg per:
WARNING: CPU: X PID: Y at mm/vma.c:830 vma_merge_existing_range+0x...
CONFIG_DEBUG_VM=y per osservare VM_WARN_ON_VMG (sui kernel di produzione il bug è ancora presente ma silenzioso)Tre commit di correzione upstream (applicati in 7.0-rc6 e nei backport stabili):
| Commit | Tree |
|---|---|
40b3f4700e55 | stable |
Versioni del kernel corrette: 7.0-rc6, 6.18.21, 6.19.11
| Data | Evento |
|---|---|
| 2026-01-13 | ID CVE riservato |
| 2026-04-02 | CVE pubblicato, commit di correzione integrati |
Antonius (@w1sdom)
Blue Dragon Security — Tangerang, Indonesia
GitHub: bluedragonsecurity
Questo PoC è rilasciato a scopo educativo e di ricerca.
| stable |
2697dd8ae721 | stable |