
POC für CVE-2026-23416 (Linux-Kernel 6.17 – Linux-Kernel 7 rc5) - Schwachstelle entdeckt von Antonius
mm/mseal: VMA-Ende bei Zusammenführung korrekt aktualisieren
Schwachstelle entdeckt von Antonius / Blue Dragon Security
| Feld | Detail |
|---|
| CVE-ID | CVE-2026-23416 |
| Subsystem | mm/mseal — mm/vma.c |
| Betroffen | Linux-Kernel 6.17 bis 7.0-rc5 |
| Behoben in | Linux 7.0-rc6, stabile Backports 6.18.21, 6.19.11 |
| Erforderlicher Zugriff | Unprivilegierter Benutzer (UID 1000, keine Capabilities) |
| Verwendete Syscalls | memfd_create, mmap, mseal |
| Reproduzierbarkeit | 100 % deterministisch, < 1 Sekunde |
| Reserviert | 2026-01-13 |
| Veröffentlicht | 2026-04-02 |
Der Fehler liegt in mseal_apply() in mm/mseal.c. Beim Iterieren über VMAs, um den Syscall mseal(2) anzuwenden, verfolgt die Funktion die Position mit curr_start und curr_end:
/* Simplified pre-fix logic */
curr_end = vma->vm_end;
/* ... process VMA ... */
curr_start = curr_end; /* advance to next VMA */
Das Problem: vma_modify_flags() — während der Iteration aufgerufen — kann VMAs zusammenführen und dabei vma->vm_end direkt ändern. Dadurch wird der curr_end-Wert, der vor der Zusammenführung erfasst wurde, veraltet. Bei der nächsten Iteration wird curr_start auf das nun veraltete curr_end gesetzt, was zu einer falschen Startadresse führt.
In Debug-Kerneln (CONFIG_DEBUG_VM) löst dieser inkonsistente vmg-Zustand Folgendes aus:
VM_WARN_ON_VMG(middle &&
((middle != prev && vmg->start != middle->vm_start) ||
vmg->end > middle->vm_end))
bei mm/vma.c:830 und erzeugt eine Kernel-WARNING.
In Produktionskerneln (WARN als No-Op kompiliert) wird das veraltete curr_start stillschweigend verwendet – das bedeutet, dass VM_SEALED auf einen falschen Adressbereich angewendet werden kann, ohne sichtbaren Fehler, was die Sicherheitsgarantie untergräbt, die mseal(2) bieten soll.
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
Der Fix setzt curr_end = vma->vm_end bedingungslos bei jeder Iteration nach einer möglichen Zusammenführung und beschränkt zusätzlich curr_start/curr_end als const-Werte, die aus dem Eingabebereich und den VMA-Grenzen abgeleitet werden:
/* AFTER fix */
curr_end = vma->vm_end; // unconditional, always fresh
Das PoC erstellt vor dem zweiten mseal()-Aufruf das folgende Layout:
[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)
Der zweite mseal(m2, 0x70000)-Aufruf zielt auf [0x21da6000 – 0x21e15fff] und erstreckt sich von VMA-A (versiegelt) in VMA-B (nicht versiegelt). Innerhalb von mseal_apply() wird das veraltete curr_end von VMA-A als curr_start verwendet, wenn VMA-B verarbeitet wird, was den inkonsistenten vmg-Zustand erzeugt.
memfd_create + mmap + mseal, keine CAP_* erforderlich.mseal(2) ist ein Sicherheits-Primitiv – es schützt die Unveränderlichkeit von VMAs. Ein Logikfehler in seiner Anwendung bedeutet, dass VM_SEALED stillschweigend falsch angewendet werden kann, wenn VMAs mit gemischten Siegelungszuständen überspannt werden.Datei: 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
Überprüfen Sie dmesg auf:
WARNING: CPU: X PID: Y at mm/vma.c:830 vma_merge_existing_range+0x...
CONFIG_DEBUG_VM=y, um die VM_WARN_ON_VMG zu beobachten (auf Produktionskerneln ist der Fehler immer noch vorhanden, aber still)Drei Upstream-Fix-Commits (angewendet in 7.0-rc6 und stabilen Backports):
| Commit | Tree |
|---|---|
40b3f4700e55 | stable |
83737e34b83a | stable |
2697dd8ae721 | stable |
Behobene Kernel-Versionen: 7.0-rc6, 6.18.21, 6.19.11
| Datum | Ereignis |
|---|---|
| 2026-01-13 | CVE-ID reserviert |
| 2026-04-02 | CVE veröffentlicht, Fix-Commits zusammengeführt |
Antonius (@w1sdom)
Blue Dragon Security — Tangerang, Indonesia
GitHub: bluedragonsecurity
Dieses PoC wird nur zu Bildungs- und Forschungszwecken veröffentlicht.