🔍 Contexte
Publié le 29 avril 2026 sur le blog de Xint (xint.io), cet article est une divulgation publique coordonnée de CVE-2026-31431, surnommé « Copy Fail », découvert par le chercheur Taeyang Lee (Theori) avec l’assistance de l’outil d’analyse automatisée Xint Code. La vulnérabilité a été signalée à l’équipe de sécurité du noyau Linux le 23 mars 2026 et corrigée en mainline le 1er avril 2026.
🐛 Nature de la vulnérabilité
Copy Fail est un bug logique dans le template AEAD authencesn du noyau Linux, combiné à deux mécanismes :
- AF_ALG (socket exposant le sous-système crypto à l’espace utilisateur non privilégié)
- splice() (transfert de pages du page cache par référence, sans copie)
Lorsqu’un utilisateur non privilégié splice un fichier dans un socket AF_ALG lié à authencesn, les pages du page cache du fichier cible se retrouvent dans la scatterlist de destination (writable). authencesn écrit 4 octets hors des limites légitimes (dst[assoclen + cryptlen]) comme espace de travail temporaire pour le réarrangement des numéros de séquence ESN IPsec. Cette écriture atteint les pages du page cache chaînées, corrompant le fichier en mémoire uniquement (le fichier sur disque reste intact).
⚙️ Mécanisme d’exploitation
L’attaquant contrôle :
- Quel fichier : tout fichier lisible par l’utilisateur courant
- Quel offset : déterminé par les paramètres
assoclen, offset et longueur du splice - Quelle valeur : les 4 octets écrits proviennent des octets 4–7 de l’AAD construit par l’attaquant via
sendmsg()
Le PoC cible /usr/bin/su (binaire setuid-root), injecte un shellcode dans son image en mémoire, puis exécute execve("/usr/bin/su"). Le kernel charge la version corrompue depuis le page cache → shell root.
📊 Caractéristiques notables
- Déterministe : aucune race condition, aucun retry, aucune fenêtre de timing
- Portable : même script Python (732 octets, stdlib uniquement, Python 3.10+) sur toutes les distributions testées
- Furtif : le page cache corrompu n’est jamais marqué dirty → les outils d’intégrité comparant les checksums sur disque ne détectent rien
- Cross-container : le page cache est partagé entre tous les processus, y compris au-delà des frontières de conteneurs (escape Kubernetes annoncé en partie 2)
🖥️ Distributions et kernels affectés (testés)
| Distribution | Kernel |
|---|---|
| Ubuntu 24.04 LTS | 6.17.0-1007-aws |
| Amazon Linux 2023 | 6.18.8-9.213.amzn2023 |
| RHEL 10.1 | 6.12.0-124.45.1.el10_1 |
| SUSE 16 | 6.12.0-160000.9-default |
Toutes les distributions Linux depuis 2017 sont potentiellement affectées (introduction de l’optimisation in-place dans algif_aead.c, commit 72548b093ee3).
🔧 Correctif
Le patch (a664bf3d603d) revient à une opération out-of-place dans algif_aead.c, supprimant l’optimisation in-place de 2017. req->src pointe désormais vers la TX SGL (pouvant contenir des pages du page cache), req->dst vers la RX SGL (buffer utilisateur). Le mécanisme sg_chain() liant les pages du page cache dans la scatterlist de destination est supprimé.
Mitigation immédiate : bloquer la création de sockets AF_ALG via seccomp ou désactiver le module algif_aead.
📰 Type d’article
Il s’agit d’une publication de recherche combinant analyse technique approfondie et divulgation coordonnée, visant à documenter la chaîne de vulnérabilité, le PoC et le correctif pour la communauté de sécurité.
🧠 TTPs et IOCs détectés
TTP
- T1068 — Exploitation for Privilege Escalation (Privilege Escalation)
- T1203 — Exploitation for Client Execution (Execution)
- T1611 — Escape to Host (Privilege Escalation)
- T1222.002 — File and Directory Permissions Modification: Linux and Mac File and Directory Permissions Modification (Defense Evasion)
- T1036 — Masquerading (Defense Evasion)
IOC
- CVEs :
CVE-2026-31431— NVD · CIRCL - CVEs :
CVE-2016-5195— NVD · CIRCL - CVEs :
CVE-2022-0847— NVD · CIRCL - Chemins :
/usr/bin/su - Chemins :
/etc/modprobe.d/disable-algif
Malware / Outils
- Xint Code (tool)
🟡 Indice de vérification factuelle : 50/100 (moyenne)
- ⬜ xint.io — source non référencée (0pts)
- ✅ 16742 chars — texte complet (fulltext extrait) (15pts)
- ✅ 5 IOCs (IPs/domaines/CVEs) (10pts)
- ⬜ pas d’IOC vérifié (0pts)
- ✅ 5 TTPs MITRE identifiées (15pts)
- ✅ date extraite du HTML source (10pts)
- ⬜ aucun acteur de menace nommé (0pts)
- ⬜ 0/3 CVE(s) confirmée(s) (0pts)
🔗 Source originale : https://xint.io/blog/copy-fail-linux-distributions