
Analyse - POC - Atténuation
Uniquement à des fins pédagogiques. Ne pas utiliser sur des systèmes sans autorisation explicite.
| Champ | Valeur |
|---|---|
| CVE | CVE-2026-31431 |
| Alias | Copy Fail |
| CVSS | 7,8 (Élevé) |
| Type | Élévation de privilèges locale (LPE) |
| Noyau concerné | 2017 – 2026 (commit 72548b093ee3 et suivants) |
| Correctif upstream | commit a664bf3d603d (annulation de 2017) |
| Divulgation | 29 avril 2026 (Theori / Xint Code) |
Copy Fail est un bug logique déterministe (ne nécessite pas de race conditions) dans le sous-système cryptographique du noyau Linux. Il permet à un utilisateur sans privilèges d'écrire 4 octets contrôlés dans le page cache de n'importe quel fichier lisible du système, y compris des binaires setuid comme su ou sudo.
Contrairement aux vulnérabilités précédentes similaires :
Linux kernel — crypto/authencesn.c
└── algif_aead (module AF_ALG)
└── optimisation en place (commit 72548b093ee3, 2017)
└── écriture scratch AEAD → franchit la limite du scatterlist
└── écrit 4 octets dans le page cache d'un fichier externe
Distributions concernées : Ubuntu, Debian, RHEL, Amazon Linux, SUSE, Fedora, Arch, AlmaLinux — toute distribution avec un noyau ≥ 2017.
En 2017, une optimisation a été introduite qui fait pointer req->src et req->dst vers le même scatterlist combiné. Cela entraîne que les pages du page cache (provenant de splice()) sont chaînées directement dans le scatterlist de destination inscriptible.
1. Ouvrir un socket AF_ALG avec l'algorithme authencesn
2. Utiliser splice() pour alimenter les pages du page cache du binaire cible
vers le socket AF_ALG (ex : /usr/bin/sudo)
3. Exécuter une opération de décryptage AEAD
4. authencesn utilise le buffer de destination comme zone de scratch →
écrit seqno_hi (4 octets contrôlés) HORS de la sortie légitime,
franchissant la limite du scatterlist
5. Les 4 octets atterrissent dans la page du page cache du binaire cible
6. Le fichier sur disque ne change PAS → les contrôles d'intégrité ne détectent rien
7. Le binaire modifié en mémoire exécute le payload → root
L'écriture contourne le chemin d'écriture VFS normal. Le fichier sur disque reste intact. Des outils comme sha256sum, aide, tripwire ou inotify ne détectent pas le changement car ils opèrent sur le fichier sur disque ou sur l'inode, pas sur le page cache en mémoire.
Le lab utilise un noyau vulnérable pour démontrer la corruption du page cache. Dans les environnements Docker, l'élévation de privilèges complète dépend de la configuration de l'hôte (noyau partagé).
# Cloner le dépôt
cd cve-2026-31431
# Construire l'image vulnérable
docker build -t copyfail-lab -f docker/Dockerfile.vulnerable .
# Exécuter le lab
docker run --rm -it \
--cap-add=NET_ADMIN \
--security-opt seccomp=unconfined \
copyfail-lab bash
# Dans le conteneur :
cd /lab
python3 exploit/poc.py
os.splice)Voir exploit/poc.py et exploit/README.md.
Le PoC démontre :
Voir mitigation/README.md pour des instructions détaillées.
TL;DR — Mitigation immédiate (sans redémarrage) :
# Désactiver le module concerné
echo "install algif_aead /bin/false" | sudo tee /etc/modprobe.d/disable-algif.conf
sudo modprobe -r algif_aead 2>/dev/null || true
Correctif définitif : Mettre à jour le noyau vers une version corrigée (postérieure à a664bf3d603d).
cve-2026-31431/
├── README.md ← ce fichier
├── docs/
│ ├── technical-analysis.md ← analyse technique approfondie
│ └── affected-kernels.md ← tableau des versions concernées/corrigées
├── exploit/
│ ├── README.md ← documentation du PoC
│ └── poc.py ← proof of concept (Python 3.10+)
├── mitigation/
│ ├── README.md ← guide de mitigation
│ ├── disable-algif.conf ← config modprobe
│ └── check-vulnerable.sh ← script de détection
├── docker/
│ ├── Dockerfile.vulnerable ← lab vulnérable
│ └── Dockerfile.patched ← lab avec mitigation appliquée
└── scripts/
└── setup-lab.sh ← automatisation du lab
a664bf3d603d| Vuln | Type | Nécessite une race ? | Portable ? | Taille de l'exploit |
|---|
| Dirty Cow (CVE-2016-5195) | Course CoW | Oui | Partielle | ~Ko |
| Dirty Pipe (CVE-2022-0847) | pipe buffer | Non | Limitée | ~Ko |
| Copy Fail (CVE-2026-31431) | Logique | Non | Totale | 732 octets |
| Date | Événement |
|---|
| 2017 | Le commit 72548b093ee3 introduit le bug dans le noyau |
| ~2025 | Theori/Xint Code commence l'analyse du sous-système crypto |
| 28 avr. 2026 | Coordination avec les distributeurs |
| 29 avr. 2026 | Divulgation publique + PoC publié |
| 1er mai 2026 | Noyaux corrigés disponibles dans les dépôts de production |
| 1er mai 2026 | Ajout au catalogue CISA KEV |