
Analyse CVE-2026-31431, une vulnérabilité AF_ALG AEAD du noyau Linux, fournissant un détecteur sûr, un exploit LPE en laboratoire et un laboratoire de noyaux A/B basé sur QEMU pour vérification.
algif_aead du noyau Linux : analyseRecherche en sécurité sur CVE-2026-31431 (CVSS 3.1 7.8 ÉLEVÉ,
AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H) : trois défauts de conception
composables dans la chaîne AEAD d'AF_ALG aboutissent à une écriture
déterministe et sans course de 4 octets dans le cache de pages à n'importe quel décalage de n'importe quel fichier lisible — la copie disque reste propre, donc les sommes de contrôle sur disque ne voient rien.
L'exploit public (« Copy Fail », Theori/Xint) le transforme en
root local (LPE) avec 732 octets de Python ; le bug est resté dans chaque noyau
de 2017 à 2026.
72548b093ee3 (2017) a fait décrypter _aead_recvmsg en place,
enchaînant les pages de balises de la requête dans le SGL de destination inscriptible.splice(fichier → pipe → socket) alimente ces emplacements de balises avec les
pages du cache de pages de n'importe quel fichier lisible (zéro copie).authencesn écrit son espace de travail ESN de 4 octets — la valeur réside dans
de la charge utile sendmsg — exactement à
, c'est-à-dire le premier octet de balise : le décalage
de fichier de votre choix. Cela se déclenche la vérification des balises, donc même une
requête effectue l'écriture.AAD[4..8)dst[assoclen + cryptlen]-EBADMSG| Affirmation | Preuve |
|---|---|
| Cause racine dérivée des commits de correctif et des sources du noyau, pas de blogs | finding-sheet |
| Décodage du PoC public vérifié de bout en bout par rapport à la séquence d'appels système | finding-sheet |
| Noyaux A/B de laboratoire avec delta = exactement le commit de correctif, les deux démarrent | lab/scripts/build.sh + lab/out/ab-diffstat.txt |
Le noyau vulnérable exécute le décryptage AEAD authencesn via AF_ALG (smoke) | lab/scripts/run.sh vuln → SMOKE=ok |
Revert sans compagnon panique dans crypto_authenc_esn_decrypt (constatation originale) | lab/scripts/run.sh patched → déréférence NULL, reproductible |
| Détecteur sûr : VULNÉRABLE sur vuln (l'écriture se déclenche malgré EBADMSG, le disque reste PROPRE), NON-DÉTECTÉ sur correctif complet | poc/detector.c dans le lab → lignes DETECTOR-RESULT |
| Clôture LPE en laboratoire : uid 1000 corrige 4 octets du cache de pages d'un binaire SUID et lit le drapeau root-only ; copie disque prouvée intacte via lecture debugfs au niveau bloc | poc/lpe.c + lab/rootfs/tools/secretgate.c → LPE-RESULT: ROOT-FLAG-CAPTURED, DISKCLEAN=ok |
| Reproduire l'écriture publique dans le cache de pages dans un lab épinglé, avec attribution | sortie du détecteur ci-dessus + lab README |
| Stress SGL : 5 formes sur les deux noyaux — aucun crash, aucun blocage du noyau (négatif honnête) + deux bizarreries documentées du contrat AF_ALG | poc/sgl-stress.c dans le lab → lignes SGL-STRESS |
# construire les trois noyaux + outils + disque de sonde dans Docker (~15 min au premier lancement)
lab/scripts/build.sh
# démarrer l'oracle A/B/C (QEMU dans Docker, KVM si disponible)
lab/scripts/run.sh vuln # DETECTOR VULNERABLE + LPE ROOT-FLAG-CAPTURED + DISKCLEAN=ok
lab/scripts/run.sh patchedfull # DETECTOR NOT-DETECTED + LPE NOT-VULNERABLE
lab/scripts/run.sh patched # déréférence NULL authencesn (lacune du correctif compagnon)
La chaîne complète d'écriture dans le cache de pages suit l'approche publiée de
Theori / Xint Code (« Copy Fail », les rapporteurs crédités) avec
attribution — voir la section travaux antérieurs du finding-sheet. Travail original dans ce dépôt : la carte des mécanismes ancrée sur les commits de correctif,
la constatation de la série de correctifs incomplète (la panique authencesn
de revert sans compagnon et sa fenêtre de version stable), le
détecteur différentiel sûr cache-de-pages-vs-disque qui ne touche jamais aux fichiers que nous ne
possédons pas, la clôture LPE en laboratoire contre une cible SUID conçue à cet effet
(secretgate — aucun binaire du monde réel n'est jamais ciblé), l'exploration
des cas limites SGL (résultat négatif honnête plus deux bizarreries documentées du
contrat AF_ALG), et l'attribution de branche vérifiée des huit commits
de correctif.
| Doc | Ce que c'est |
|---|---|
| docs/finding-sheet.md | Fiche technique d'une page : versions, CVSS, cause racine, commits de correctif, surface d'attaque |
| docs/report-ptes.md | Rapport structuré PTES (7 phases) avec preuves de laboratoire |
| docs/research-writeup.md | Le récit de l'enquête — méthodologie, impasses, leçons portables, comparaison avec les travaux antérieurs |
docs/ fiche technique · rapport PTES · récit de recherche
poc/ detector.c (oracle sûr) · lpe.c (LPE en laboratoire) · sgl-stress.c (exploration SGL)
lab/ laboratoire de noyau QEMU : 5.15.203 ± correctif (A/B) + post-compagnon 5.15.y (C)
lab/rootfs/ secretgate.c — cible SUID conçue à cet effet (la seule chose jamais attaquée)
72548b093ee3 « crypto: algif_aead - copy AAD from src to dst » (2017)a664bf3d603d « crypto: algif_aead - Revert to operating out-of-place »
(+ 8 rétroportages stables — voir finding-sheet)Artéfact de recherche pédagogique. À exécuter uniquement contre des systèmes que vous possédez ou pour lesquels vous êtes explicitement autorisé à tester. La vulnérabilité est corrigée — exécutez un noyau à jour des branches stables 2026 ou ultérieures.