
POC pour CVE-2026-23416 (linux kernel 6.17 – linux kernel 7 rc5) - vulnérabilité découverte par Antonius
mm/mseal: mettre à jour correctement la fin de la VMA lors de la fusion
Vulnérabilité découverte par Antonius / Blue Dragon Security
| Champ | Détail |
|---|
| ID CVE | CVE-2026-23416 |
| Sous-système | mm/mseal — mm/vma.c |
| Affecte | Noyau Linux 6.17 à 7.0-rc5 |
| Corrigé dans | Linux 7.0-rc6, rétroportages stables 6.18.21, 6.19.11 |
| Accès requis | Utilisateur non privilégié (UID 1000, aucune capacité) |
| Appels système utilisés | memfd_create, mmap, mseal |
| Reproductibilité | 100 % déterministe, < 1 seconde |
| Réservé | 2026-01-13 |
| Publié | 2026-04-02 |
Le bogue se trouve dans mseal_apply() dans mm/mseal.c. Lors de l'itération sur les VMA pour appliquer l'appel système mseal(2), la fonction suit la position à l'aide de curr_start et curr_end :
/* Simplified pre-fix logic */
curr_end = vma->vm_end;
/* ... process VMA ... */
curr_start = curr_end; /* advance to next VMA */
Le problème : vma_modify_flags() — appelée pendant l'itération — peut fusionner des VMA, modifiant vma->vm_end sur place. Cela rend la valeur curr_end capturée avant la fusion obsolète. Lors de l'itération suivante, curr_start est défini sur le curr_end désormais obsolète, produisant une adresse de départ incorrecte.
Dans les noyaux de débogage (CONFIG_DEBUG_VM), cet état vmg incohérent déclenche :
VM_WARN_ON_VMG(middle &&
((middle != prev && vmg->start != middle->vm_start) ||
vmg->end > middle->vm_end))
à mm/vma.c:830, produisant un WARNING du noyau.
Dans les noyaux de production (WARN compilé en no-op), le curr_start obsolète continue silencieusement — ce qui signifie que VM_SEALED peut être appliqué à une plage d'adresses incorrecte sans aucune erreur visible, compromettant la garantie de sécurité que mseal(2) est conçu pour fournir.
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 déclenché à la ligne 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
Le correctif définit curr_end = vma->vm_end de manière inconditionnelle à chaque itération après toute fusion potentielle, et fixe également curr_start/curr_end comme valeurs const dérivées de la plage d'entrée et des limites de la VMA :
/* AFTER fix */
curr_end = vma->vm_end; // unconditional, always fresh
Le PoC construit la disposition suivante avant le deuxième appel à mseal() :
[0x21da6000 - 0x21de5fff] VMA-A (fd2, MAP_SHARED|MAP_FIXED) ← VM_SEALED après l'étape 1
[0x21de6000 - 0x21e82fff] VMA-B (fd2, MAP_SHARED|MAP_FIXED) ← NON scellé
[0x21e83000 - 0x21e84fff] VMA-C (restant)
Le deuxième mseal(m2, 0x70000) cible [0x21da6000 – 0x21e15fff], couvrant VMA-A (scellée) jusqu'à VMA-B (non scellée). Dans mseal_apply(), le curr_end obsolète de VMA-A est utilisé comme curr_start lors du traitement de VMA-B, créant l'état vmg incohérent.
memfd_create + mmap + mseal, pas de CAP_* requis.mseal(2) est une primitive de sécurité — elle protège l'immutabilité des VMA. Une erreur de logique dans son application signifie que VM_SEALED peut être silencieusement mal appliqué lors du chevauchement de VMA avec des états de scellement mixtes.Fichier : 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
Consultez dmesg pour :
WARNING: CPU: X PID: Y at mm/vma.c:830 vma_merge_existing_range+0x...
CONFIG_DEBUG_VM=y pour observer le VM_WARN_ON_VMG (sur les noyaux de production, le bogue est toujours présent mais silencieux)Trois correctifs en amont (appliqués dans 7.0-rc6 et les rétroportages stables) :
| Commit | Arbre |
|---|---|
40b3f4700e55 | stable |
83737e34b83a | stable |
2697dd8ae721 | stable |
Versions du noyau corrigées : 7.0-rc6, 6.18.21, 6.19.11
| Date | Événement |
|---|---|
| 2026-01-13 | ID CVE réservé |
| 2026-04-02 | CVE publiée, correctifs fusionnés |
Antonius (@w1sdom)
Blue Dragon Security — Tangerang, Indonésie
GitHub : bluedragonsecurity
Ce PoC est publié à des fins éducatives et de recherche.