
Reproduit l'élévation de privilèges (LPE) sans fichier CVE‑2026‑31431 (“Copy Fail”) sur Kali Linux, puis a construit des détections auditd, Sigma et YARA pour détecter cette exploitation furtive du noyau qui ne laisse aucune trace sur le disque.
Ce dépôt documente la reproduction de bout en bout, l'ingénierie de détection et la réponse aux incidents pour CVE-2026-31431 (« Copy Fail »), une vulnérabilité critique d'élévation de privilèges locale dans le noyau Linux affectant les noyaux 4.14 à 7.0-rc.
Copy Fail est un défaut de logique, et non une corruption de mémoire. Il est déterministe, affecte pratiquement toutes les distributions Linux publiées depuis 2017, et est totalement sans fichier — la surveillance traditionnelle de l'intégrité des fichiers (AIDE, Tripwire) ne peut pas le détecter. Une preuve de concept fonctionnelle tient en seulement 732 octets de Python.
| Composant | Détails |
|---|---|
| Hyperviseur | VirtualBox |
| VM cible | Kali Linux 2026.1 |
| Noyau | 6.18.12+kali-amd64 |
| PoC d'exploit | theori-io/copy-fail-CVE-2026-31431 |
| Détection | auditd, Sigma, YARA |
Le laboratoire commence par confirmer que la cible exécute un noyau vulnérable.
Détails de la version et du noyau de Kali Linux 2026.1.
Sortie de uname -r montrant le noyau vulnérable 6.18.12+kali-amd64.
L'exploit nécessite le module noyau algif_aead et le modèle cryptographique authencesn.
Module chargé
lsmod et modinfo confirment que algif_aead est disponible ; /proc/crypto montre le modèle vulnérable authencesn.
Le PoC utilise os.splice, qui nécessite Python 3.10+. Nous vérifions l'interpréteur.
Version de Python Python 3.12 est installé et prêt.
Avant d'exécuter l'exploit complet, un vérificateur sûr confirme que le système est vulnérable.
Le vérificateur signale « potentiellement vulnérable », ouvrant la voie à l'exploitation.
Un compte testuser non privilégié est créé pour simuler un attaquant sans droits particuliers.
id affiche l'UID 1001, confirmant un accès non root.
Le PoC officiel de Theori est cloné et exécuté depuis le compte non privilégié.
Le dépôt de l'exploit a été cloné avec succès.
Exécution de l'exploit
L'exploit Python écrase le cache de pages et déclenche le binaire /usr/bin/su corrompu.
Les sorties de whoami et id prouvent une élévation complète vers root.
L'exploit ne corrompt que le cache de pages en mémoire. Le fichier /usr/bin/su sur le disque conserve sa somme de contrôle d'origine.
Correspondance SHA256
Le sha256sum correspond au hachage d'origine du paquet même après l'exploitation, confirmant l'absence de modification du disque.
Copy Fail ne peut pas être détecté par la surveillance de l'intégrité des fichiers. Nous nous concentrons plutôt sur les primitives au niveau des appels système qu'il utilise.
Nous déployons des règles auditd personnalisées qui se déclenchent sur :
AF_ALG (famille 38)splice()
Toutes les règles personnalisées sont actives, vérifiées avec auditctl -l.
Après avoir exécuté l'exploit une seconde fois, nous voyons des alertes pour les appels système exacts utilisés :
ausearch affiche un événement de création de socket AF_ALG provenant du processus testuser.
ausearch affiche un événement splice() provenant du même PID, une forte corrélation.
Une règle Sigma traduit les résultats d'auditd dans un format SIEM neutre vis-à-vis des fournisseurs.
Règle YAML Sigma détectant la création de sockets AF_ALG et les appels splice().
Une règle YARA aide à identifier le code de l'exploit Copy Fail sur le disque.
Règle YARA correspondant à la chaîne authencesn, aux constantes de socket et aux références splice() trouvées dans les PoC.
| Couche | Ce qu'elle voit | Statut |
|---|---|---|
| auditd | Socket AF_ALG + appels système splice | ✅ Déployé |
| Sigma | Motifs d'appels système via SIEM | ✅ Règle prête |
| YARA | Code PoC sur le disque | ✅ Règle prête |
| FIM (AIDE/Tripwire) | Modifications de fichiers | ❌ Aveugle – aucune écriture disque ne se produit |
Un rapport complet de réponse aux incidents est disponible dans reports/incident-copy-fail.md. Il comprend :
Atténuation immédiate (aucun redémarrage requis) :
echo "install algif_aead /bin/false" | sudo tee /etc/modprobe.d/disable-algif.conf
sudo rmmod algif_aead