
Exploit et détecteur pour une élévation de privilèges locale du noyau Linux (CVE-2026-31431) qui corrompt le cache de pages pour obtenir les droits root, avec des recommandations d'atténuation.
Une faille critique de 9 ans dans le noyau Linux permettant d'obtenir un accès root en quelques secondes
| Attribut | Détails |
|---|---|
| CVE | CVE-2026-31431 |
| Surnom | Copy Fail |
| Type | Élévation de privilèges locale (LPE) |
| CVSS | 7.8 (High) |
| Découvert par | Theori (Xint Code) |
| Divulgation | 29 avril 2026 |
| Composant | Sous-système algif_aead du noyau Linux |
Défaut dans l'optimisation de l'« opération sur place » (in-place) introduite en 2017 (commit 72548b093ee3). Elle permet à un utilisateur local d'effectuer une écriture contrôlée de 4 octets directement dans le cache de pages du noyau.
AF_ALG pour accéder aux algorithmes cryptographiques du noyau/usr/bin/su) ou des fichiers sensibles (/etc/passwd)C'est un bug logique de conception, pas un débordement de mémoire. Il nécessitait une analyse approfondie du sous-système cryptographique pour être détecté.
# Ubuntu/Debian
sudo apt update
sudo apt upgrade
sudo reboot
# RHEL/AlmaLinux/Rocky
sudo dnf update kernel
sudo reboot
# Vérifier la version du noyau
uname -r
⚠️ Le redémarrage est obligatoire pour activer le nouveau noyau.
# Désactiver le chargement du module vulnérable
echo "install algif_aead /bin/false" | sudo tee /etc/modprobe.d/copyfail_mitigation.conf
# Décharger le module s'il est déjà en cours d'utilisation
sudo rmmod algif_aead
# Le module est généralement intégré au noyau
# Ajouter un paramètre de démarrage pour le désactiver
sudo grubby --update-kernel=ALL --args="initcall_blacklist=algif_aead_init"
# Redémarrer pour appliquer les changements
sudo reboot
# Purger le cache de pages à chaud
sudo sysctl -w vm.drop_caches=3
⚠️ Remarque : Cela ne remplace pas le correctif. C'est seulement une mesure complémentaire.
| Date | Événement |
|---|---|
| 29 avril | Divulgation publique par Theori |
| 1er mai |
# Obtenir la version du noyau
uname -r
# Vulnérable si :
# - v4.14 à v7.0-rc (publié entre 2017 et avril 2026)
# - Contient le commit 72548b093ee3
# Vérifier si le module algif_aead est chargé
lsmod | grep algif_aead
# S'il apparaît dans la liste, votre système est vulnérable
Une IA a identifié cette faille qui est passée inaperçue aux développeurs pendant 9 ans. Cela marque un avant et un après :
# 1. Detect
python3 prueba.py
# exit 0 = not vulnerable, 2 = vulnerable, 1 = test error
# 2. Exploit (interactive — su will prompt for your own password)
python3 exploit.py --shell
python3 prueba.py
Ce qu'il fait :
Confirme que AF_ALG et l'algorithme authencesn(hmac(sha256),cbc(aes))
sont accessibles depuis un processus sans privilèges.
Crée un fichier sentinelle de 4 Kio dans un répertoire temporaire et remplit le cache de pages.
Envoie 8 octets d'AAD en ligne via sendmsg+cmsg avec seqno_lo défini sur
le marqueur PWND, puis copie 32 octets de la page du cache de pages de la sentinelle dans le socket d'opération AF_ALG via os.splice().
Appelle recv() pour initier le déchiffrement. La vérification d'authentification échoue avec
EBADMSG ; l'écriture temporaire s'exécute quand même.
Relit le fichier (cache de pages, pas le disque) et recherche le marqueur.
Classes de sortie :
Condición previa no cumplida : AF_ALG ou authencesn indisponibles. Sortie 0.VULNERABLE a CVE-2026-31431 : le marqueur PWND a été inséré dans la page modifiée.Sortie 2.
Caché de página MODIFICADA mediante una ruta de inserción AEAD in situ : écriture dans la page,
mais le marqueur n'a pas été inséré à la position attendue.
À traiter comme vulnérable. Sortie 2.Caché de página intacta : patché. Sortie 0.Le détecteur ne modifie jamais /usr/bin/su, /etc/passwd ni aucun autre fichier hors du répertoire temporaire qu'il crée, et ce fichier est supprimé à la fin.
Sortie. ## Utilisation du LPE
python3 exploit_cve_2026_31431.py # Patch uniquement, imprime les étapes suivantes
python3 exploit_cve_2026_31431.py --shell # Patch et exécute `su <usuario>`
Fonction :
/etc/passwd et trouve ledécalage d'octets du champ UID de 4 caractères.
write4 sur ce décalage, en remplaçant l'UID par0000.
pwd.getpwnam(usuario) pour confirmer que libc signale désormais l'UID 0.--shell, exécute execvp("su", ["su", usuario]). Saisissez votre propre
mot de passe. PAM valide contre /etc/shadow (non modifié), puissetuid(getpwnam(user).pw_uid) est défini sur 0.
nécessitent des écritures multi-tirs ; étendez write4 en conséquence.
Aucun démon de cache NSS (nscd, sssd, systemd-userdbd) ne masque
les lectures de /etc/passwd. Si getpwnam renvoie toujours l'UID réel après
l'application du patch, redémarrez ou ignorez le cache, ou sélectionnez un utilisateur différent.
La page /etc/passwd doit rester dans le cache entre l'application du patch et
l'exécution de su. En pratique, c'est fiable sur tout système avec une pression mémoire normale.
Le fichier /etc/passwd sur disque reste inchangé.
L'exécution à sec (exploit_cve_2026_31431.py sans --shell) supprime automatiquement
la page corrompue à la sortie via POSIX_FADV_DONTNEED, donc les recherches UID → nom
reviennent à la normale immédiatement.
Après avoir utilisé --shell**, la page reste corrompue jusqu'à ce qu'elle soit effacée.
Tant qu'elle est corrompue, toute opération qui résout UID 1000 → nom (par exemple, ls,
gestionnaires de fichiers, vérifications de propriété scp/sftp) échouera ou affichera des identifiants numériques. Pour l'effacer :
# Sans privilèges : demande la suppression du cache de pages de /etc/passwd :
python3 -c "import os; fd=os.open('/etc/passwd', os.O_RDONLY); \
os.posix_fadvise(fd, 0, 0, os.POSIX_FADV_DONTNEED); os.close(fd)"
# Depuis la console root :
echo 3 > /proc/sys/vm/drop_caches
Un redémarrage l'efface également.
write4sendmsg([AAD de 8 octets], cmsg=[ALG_SET_OP=DECRYPT, ALG_SET_IV, ALG_SET_AEAD_ASSOCLEN=8],
flags=MSG_MORE)
splice(target_fd, pipe_w, 32, offset_src=file_offset)
splice(pipe_r, op_fd, 32)
recv(op_fd) # EBADMSG ; l'écriture temporaire a déjà été effectuée
Les 4 octets des positions 4 à 7 de l'AAD (seqno_lo) sont écrits par
authencesn dans la liste de dispersion de destination, qui dans ce chemin de code
est la page du cache de pages que nous avons extraite de target_fd. Le décalage d'atterrissage
dans la page correspond au offset_src que nous avons passé à splice().
Jusqu'à ce que le noyau patché arrive sur votre distribution :
sudo tee /etc/modprobe.d/disable-algif-aead.conf <<<'install algif_aead /bin/false'
sudo rmmod algif_aead 2>/dev/null
Après application du patch, test_cve_2026_31431.py devrait afficher le message « Precondición
no cumplida » et se terminer avec le code 0.
La correction originale ramène les opérations AEAD sur place à des opérations hors place, en maintenant les pages du cache de pages hors des listes de dispersion modifiables.
algif_aeadalgif_aead dans les journaux d'auditDernière mise à jour : 3 mai 2026
Statut : 🔴 CRITIQUE - Action immédiate requise
| Premières tentatives d'exploitation active détectées |
| 2 mai | CISA ordonne aux agences fédérales américaines de patcher avant le 15 mai |
| 3 mai | Correctifs disponibles sur Ubuntu, RHEL, AlmaLinux, Debian |
| Distribution | État | Référence |
|---|
| Ubuntu | ✅ Patché | USN-8226-1 (20.04, 22.04, 24.04) |
| RHEL/AlmaLinux/Rocky | ✅ Disponible | Depuis le 1er mai |
| Debian | ✅ Dans les dépôts de sécurité | Mise à jour disponible |
| Android | ⏳ Prochainement | Bulletin de sécurité de juin 2026 |