
Preuve de concept fonctionnelle pour CVE-2026-31431, une élévation de privilèges locale du noyau Linux via la corruption du cache de pages AEAD AF_ALG, permettant d'obtenir un shell root.
2026-04-29 — Je publie cet exploit un jour après l'avoir partagé sur le forum MyDigitalLife. Il ne nécessite pas Python ; il est écrit en C et compilé à la taille la plus petite possible en utilisant :
musl-gcc -static -Os -o exploit exploit.c -sMenace critique. Le binaire de l'exploit est compilé sans dépendances et peut être utilisé pour tester les vulnérabilités sur n'importe quel système Linux.
CVE-2026-31431 est une vulnérabilité confirmée par le NIST dans le noyau Linux qui permet à un utilisateur local non privilégié d'obtenir un shell
rooten quelques secondes. Compte tenu de l'exploit circulant publiquement pour CVE-2026-31431, j'ai développé une preuve de concept (PoC) binaire pour évaluer l'exposition de notre infrastructure interne. Bien que certains environnements restreignent l'utilisation de su, cette vulnérabilité est particulièrement critique pour les serveurs partagés car elle cible la gestion de la mémoire du noyau sous-jacent. Par conséquent, tout binaire SETUID — y compris sudo, passwd, mount ou newgrp — peut être exploité pour déclencher l'exploit et obtenir un shell root. Une action administrative pour corriger le noyau est requise immédiatement, car les restrictions standard de l'espace utilisateur sont insuffisantes pour atténuer cette menace. Tout système Linux exécutant un noyau non corrigé est à risque.
Mon propre exploit fonctionnel · Noyau Linux · Interface cryptographique AF_ALG (AEAD)
Remplace /usr/bin/su dans le cache de pages du noyau sans toucher au fichier sur disque
Un accès shell local suffit — aucun privilège supplémentaire requis
Affecte les distributions Linux non corrigées

CVE-2026-31431 est un bug dans la gestion des opérations d'E/S scatter-gather et des références au cache de pages dans le sous-système cryptographique du noyau Linux — plus précisément dans l'implémentation des sockets AF_ALG pour les algorithmes AEAD (crypto/af_alg.c, crypto/aead.c).
| Propriété | Valeur |
|---|---|
| Identifiant | CVE-2026-31431 |
| Référence | NIST NVD |
| Type | Élévation de privilèges locale (LPE) |
| Composant | Noyau Linux — AF_ALG / AEAD (authencesn) |
| Accès requis | Utilisateur local non privilégié |
| Impact | Shell root interactif |
| Statut de l'exploit | PoC fonctionnel disponible publiquement sur GitHub |
| Persistance | Aucune — la modification n'existe qu'en RAM ; un redémarrage restaure l'état d'origine |
Le noyau Linux expose une interface cryptographique à l'espace utilisateur via les sockets AF_ALG. La vulnérabilité réside dans le fait que lors d'une opération de déchiffrement AEAD, le noyau mappe incorrectement la sortie du déchiffrement directement sur les pages du cache de pages du fichier source — au lieu d'un tampon temporaire. Un attaquant peut ainsi écraser le contenu en mémoire de n'importe quel fichier sans le modifier sur disque, sans privilèges root, et sans laisser de trace visible dans le système de fichiers.
| Système | Statut |
|---|---|
| Ubuntu 24.04 (machine physique / VM) | ⚠️ Vulnérable sur noyau non corrigé |
| Debian, Fedora, Arch sur noyau non corrigé | ⚠️ Vulnérable |
Distributions avec CONFIG_SECURITY_LOCKDOWN_LSM | ✅ Probablement protégé |
Systèmes avec nosuid ou ProtectSUID (systemd) | ✅ Protégé |
Systèmes avec AppArmor/SELinux bloquant AF_ALG | ✅ Protégé |
| macOS, Windows (natif) | ✅ Non concerné |
L'exploit se compose de deux éléments : un script auxiliaire dans /tmp/x et une boucle de corruption basée sur AF_ALG. Voici un parcours exact basé sur l'analyse du code source :
1. Configuration du script auxiliaire
L'exploit crée /tmp/x avec le contenu suivant :
#!/bin/sh
export TERM=xterm-256color
exec /bin/sh
Il définit les permissions sur 0755. La raison : /usr/bin/su supprime les variables d'environnement (y compris TERM) au lancement. Le script auxiliaire les restaure avant de lancer le vrai shell, garantissant un terminal fonctionnel.
2. Construction de la charge utile ELF
Un binaire ELF x86_64 minimal de 158 octets contenant du shellcode brut est construit en mémoire. La chaîne /bin/sh à l'offset 150 est ensuite remplacée par /tmp/x\0 via memcmp/memcpy. Voir Charge utile ELF pour plus de détails.
3. Ouverture de /usr/bin/su en lecture seule
int su_fd = open("/usr/bin/su", O_RDONLY);
Le fichier est ouvert en lecture seule — l'exploit ne nécessite aucune permission d'écriture.
4. Boucle de corruption — 39 itérations de 4 octets chacune
La charge utile (158 octets) est traitée par blocs de 4 octets (39 blocs complets). Chaque bloc passe par corrupt_binary_chunk(), qui effectue :
AF_ALG (SOCK_SEQPACKET)authencesn(hmac(sha256),cbc(aes)) — un algorithme AEAD composéop_sock)sendmsg avec un tampon de 8 octets (4× 'A' + 4 octets de charge utile) et trois CMSG : ALG_OP_DECRYPT, IV (20 octets), assoclen=8splice : su_fd → pipe → op_sock (zéro-copie à travers le noyau)recv() — c'est ici que le noyau écrase par erreur le cache de pages5. Exécution
execve("/usr/bin/su", args, NULL);
Le noyau charge /usr/bin/su via le cache de pages — qui est maintenant empoisonné. Le bit SUID (chmod u+s) est intact, donc le noyau exécute le fichier en tant que root. Le shellcode exécute setuid(0) → execve("/tmp/x") → shell root interactif.