
Exploit Linux d’élévation de privilèges locaux pour CVE-2026-31431, fournissant un PoC fiable en un seul passage avec plusieurs implémentations en langages, un scanner de vulnérabilités et un script d’atténuation.
Une élévation de privilèges locale Linux fiable à 100 % affectant toutes les distributions grand public depuis 2017.
Un bug logique dans
authencesn, enchaîné viaAF_ALGetsplice()en une écriture de 4 octets dans le cache de pages — exploitable silencieusement pendant près d'une décennie.
Tout le code et toute la documentation de ce dépôt sont fournis exclusivement à des fins de recherche en sécurité autorisée et à des fins pédagogiques.
Exécuter du code d'exploitation contre des systèmes que vous ne possédez pas ou pour lesquels vous n'avez pas d'autorisation écrite explicite de test est illégal. En utilisant ce dépôt, vous acceptez l'entière responsabilité de vos actions.
.
├── README.md ← Vous êtes ici
├── LICENSE ← MIT
├── .gitignore
├── docs/
│ ├── analysis-report.md ← Analyse de sécurité complète
│ ├── analysis-report.html ← Version HTML stylisée
│ ├── exploit-walkthrough.md ← Analyse du PoC ligne par ligne
│ └── exploit-walkthrough.html ← Version HTML stylisée
└── poc/
├── README.md ← Guide d'utilisation du PoC
├── copy_fail_exp.py ← PoC officiel (732 octets, obfusqué)
├── copy_fail_exp_readable.py ← Version désobfusquée + annotée
├── copy_fail_exp_compat.py ← Compatibilité Python 3.6+ (ctypes splice)
├── copy_fail_exp_alpine.py ← Variante Alpine Linux
├── copy_fail_exp.c ← Implémentation C (zéro dépendance)
├── copy_fail_exp.go ← Implémentation Go (zéro dépendance)
├── copy_fail_rust/ ← Implémentation Rust
│ ├── Cargo.toml
│ └── src/main.rs
├── check_vulnerable.py ← Scanner de vulnérabilité
└── mitigate.sh ← Script d'atténuation en un clic
# Depuis GitHub Releases — binaires précompilés (Linux amd64/arm64) + tous les scripts Python
wget https://github.com/nisec-eric/cve-2026-31431/releases/latest/download/copy-fail-go-linux.tar.gz
wget https://github.com/nisec-eric/cve-2026-31431/releases/latest/download/copy-fail-c-linux.tar.gz
wget https://github.com/nisec-eric/cve-2026-31431/releases/latest/download/copy-fail-python.tar.gz
tar xzf copy-fail-go-linux.tar.gz
tar xzf copy-fail-c-linux.tar.gz
tar xzf copy-fail-python.tar.gz
# Binaire statique Go (pas besoin de Python)
chmod +x copy-fail-exp-amd64
./copy-fail-exp-amd64
# Binaire statique C
chmod +x copy-fail-exp-c-amd64
./copy-fail-exp-c-amd64
# Ou utilisez directement les scripts Python
python3 check_vulnerable.py
📦 Les versions sont automatiquement compilées via GitHub Actions à chaque push de tag
v*. Les binaires Go et C sont compilés pour linux/amd64 et linux/arm64 en tant que binaires statiques.
python3 poc/check_vulnerable.py
sudo bash poc/mitigate.sh
Cela met sur liste noire le module noyau algif_aead — ne casse rien pour 99 % des systèmes.
# Debian/Ubuntu
sudo apt update && sudo apt upgrade linux-image-*
# RHEL/CentOS/Fedora
sudo dnf update kernel
# Redémarrer sur le noyau corrigé
sudo reboot
python3 poc/check_vulnerable.py
# Code de sortie 1 = protégé ✓
AVERTISSEMENT : À exécuter uniquement sur des systèmes que vous possédez ou pour lesquels vous êtes autorisé à tester.
# C
gcc -static -o exp ./poc/copy_fail_exp.c && ./exp
# Python
python3 poc/copy_fail_exp.py
python3 poc/copy_fail_exp_compat.py # Python < 3.10
# Go
go build -o exp ./poc/copy_fail_exp.go && ./exp
# Rust
cd poc/copy_fail_rust && cargo run --release
Toutes les versions acceptent un argument optionnel pour cibler un binaire SUID différent :
python3 poc/copy_fail_exp.py /usr/bin/passwd
./exp /usr/bin/sudo
Évaluation complète de la vulnérabilité couvrant :
authencesn)Analyse du PoC ligne par ligne couvrant :
AF_ALG, livraison splice() dans le cache de pages, mécanique sg_chain()authencesn qui franchit les limites des scatterlist/etc/passwd, ciblage de bibliothèques partagées, évasion de conteneurLes contributions sont les bienvenues :
Veuillez ouvrir une issue ou une pull request.
MIT — À utiliser de manière responsable.
| Champ | Détail |
|---|
| CVE | CVE-2026-31431 |
| Alias | Copy Fail |
| Type | Élévation de privilèges locale du noyau Linux (LPE) / écriture arbitraire dans le cache de pages |
| CVSS v3.1 | 7.8 ÉLEVÉE — AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H |
| CWE | CWE-669 (Transfert incorrect de ressources entre sphères) |
| Composant | crypto/algif_aead — modèle cryptographique authencesn |
| Introduit | 2017 (commit 72548b093ee3) |
| Corrigé | Commit principal a664bf3d603d (2026-04-01) |
| Noyau corrigé | v6.18.22+, v6.19.12+, v7.0+ |
| Découvreur | Xint / Theori (Taeyang Lee + audit assisté par IA Xint Code) |
| Divulgation | 2026-04-29 — copy.fail |
| LPE Linux typique | Copy Fail |
|---|
| Condition de course | Requise | Aucune |
| Décalages par distribution | Requis | Aucun |
| Fiabilité | 30–80 % | 100 %, en un seul essai |
| Fenêtre d'impact | Étroite | 2017 → 2026 (9 ans) |
| Modification sur disque | Possible | Aucune (furtif) |
| Trans-conteneur | Non | Oui |
| Fichier | Langage | Prérequis | Notes |
|---|
copy_fail_exp.py | Python 3.10+ | stdlib uniquement | PoC officiel de 732 octets |
copy_fail_exp_compat.py | Python 3.6+ | stdlib + ctypes | Fonctionne sur CentOS 7, AL2, etc. |
copy_fail_exp_alpine.py | Python 3.10+ | stdlib uniquement | Cible /bin/ping sur Alpine |
copy_fail_exp.c | C | gcc + en-têtes Linux | Binaire statique, zéro dépendance |
copy_fail_exp.go | Go 1.21+ | stdlib uniquement | Binaire statique, zéro dépendance |
copy_fail_rust/ | Rust 1.70+ | crates libc + flate2 | Binaire statique |
| Environnement | Risque | Pourquoi |
|---|
| Hôtes Linux multi-locataires | 🔴 Élevé | Tout utilisateur → root |
| Kubernetes / conteneurs | 🔴 Élevé | Cache de pages partagé → évasion de conteneur |
| Runners CI (auto-hébergés) | 🔴 Élevé | PR malveillante → root du runner |
| SaaS cloud (code utilisateur) | 🔴 Élevé | Locataire → root de l'hôte |
| Serveurs standard | 🟡 Moyen | S'enchaîne avec RCE web / identifiants volés |
| Ordinateurs portables mono-utilisateur | 🟢 Faible | Déjà le seul utilisateur |