
CVE-2026-31431 (Copy Fail) exploit novateur : corruption de code en direct via le cache de pages. Écrase le code de libc exit() via le partage de pages MAP_PRIVATE — affecte TOUS les processus en cours d'exécution.
Une technique d'exploitation inédite pour CVE-2026-31431 (« Copy Fail ») qui corrompt le code exécutable des processus en cours d'exécution via le cache de pages du noyau Linux, permettant une élévation de privilèges root.
Tous les exploits publiés pour cette CVE corrompent des fichiers de données — en modifiant /etc/passwd pour changer l'UID de root, ou en patchant des binaires setuid sur disque. Cet exploit fait quelque chose de fondamentalement différent : il corrompt du code exécutable en direct en mémoire via le mécanisme de cache de pages du noyau.
| Exploits publiés | Cet exploit | |
|---|---|---|
| Cible | Fichiers de données (/etc/passwd, /usr/bin/su) | Code exécutable (section .text de libc) |
| Mécanisme | Contenu de fichier analysé par les programmes | Pages de code exécutées directement par le CPU |
| Portée | Fichier unique | TOUS les processus mappant libc |
| Modification disque | Oui (contenu du fichier modifié) | Non (uniquement le cache de pages en mémoire) |
| Détection | Surveillance de l'intégrité des fichiers | Invisible aux vérifications du système de fichiers |
Lorsque Linux mappe une bibliothèque partagée avec MAP_PRIVATE, il ne copie pas immédiatement les pages du fichier. Au lieu de cela, les entrées de table de pages du processus pointent directement vers les pages physiques du cache de pages. La copie n'a lieu qu'à l'écriture (copie sur écriture). Pour les pages de code (.text), les processus n'y écrivent jamais — elles restent donc partagées avec le cache de pages pour toujours.
Processus A (bash) Processus B (su) Cache de pages (libc)
┌──────┐ ┌──────┐ ┌──────────┐
│ PTE │───────────>│ │ │ exit() : │
│ │ │ PTE │───────────>│ endbr64 │
└──────┘ └──────┘ │ push rax │
MAP_PRIVATE MAP_PRIVATE │ ... │
(page propre) (page propre) └──────────┘
↑
Copy Fail écrit ici !
CVE-2026-31431 nous donne une écriture contrôlée de 4 octets dans le cache de pages de n'importe quel fichier lisible. En corrompant les pages de code de libc, nous modifions les instructions que chaque processus exécute.
on_exit() dans le cache de pages de libc — 10 écritures de 4 octets chacuneexit() pour sauter vers notre shellcode — 1 écriture de 4 octetsexit() (pratiquement tous les programmes) exécute notre shellcodeLe shellcode effectue setuid(0) → setgid(0) → execve("/bin/sh"), donnant un shell root.
crypto/algif_aead.c — l'optimisation en place de 2017 (72548b093ee3) permet à splice() d'alimenter les pages du cache de pages dans le déchiffrement AEAD. Le réarrangement ESN de l'algorithme authencesn écrit 4 octets de brouillon dans la liste scatter source, corrompant le cache de pages du fichier épissé.# Compilation
gcc -o exploit exploit.c
# Exécution en tant qu'utilisateur non privilégié
./exploit /lib/x86_64-linux-gnu/libc-2.31.so
# Déclenchement — exécutez n'importe quel programme (il appelle exit())
su -c id
# uid=0(root) gid=0(root) groups=0(root)
process 'id' launched '/bin/sh'exploit.c — Exploit complet avec injection de shellcodecopyfail_test.c — Vérification de la primitive (teste l'écriture de 4 octets)72548b093ee3)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 l'autorisation explicite de tester.
Dirty Frag a divulgué deux autres variantes d'écriture dans le cache de pages de la même classe de bogues :
esp4/esp6) : Même puits authencesn que Copy Fail, atteint via IPsec ESP-in-UDP. Nécessite des espaces de noms utilisateur. Écriture de 4 octets.rxrpc/rxkad) : Déchiffrement en place pcbc(fcrypt) sur page épinglée par splice. Aucun espace de noms nécessaire. Écriture de 8 octets.La technique de corruption de code en direct de ce dépôt fonctionne avec n'importe laquelle de ces primitives d'écriture dans le cache de pages — remplacez simplement la fonction write4() par le déclencheur ESP ou RxRPC. La technique est indépendante de la primitive.