
Prueba de concepto del exploit para CVE-2026-31431 (Copy-Fail), una vulnerabilidad del kernel de Linux en AF_ALG y splice() que permite el envenenamiento de la caché de páginas y la escalada local de privilegios. Incluye análisis, resultados de laboratorio y script de detección.
Este repositorio contiene un análisis en profundidad, una Prueba de Concepto (PoC) y los resultados de pruebas de laboratorio para la vulnerabilidad CVE-2026-31431, conocida popularmente como "Copy-Fail".
Copy-Fail explota una falla lógica en la API de Criptografía del Kernel de Linux (AF_ALG) combinada con la llamada al sistema splice(). Permite a un atacante local sin privilegios realizar un Envenenamiento de la Caché de Páginas (Page Cache Poisoning), lo que conduce a una Escalada de Privilegios Local (LPE).
A diferencia de los exploits tradicionales que modifican archivos en el disco, Copy-Fail apunta directamente a la Caché de Páginas (RAM). Cuando se lee un archivo, el kernel almacena una copia en la RAM para mejorar el rendimiento. Debido a un error de gestión de memoria en el algoritmo authenc en versiones específicas del kernel, un atacante puede engañar al kernel para que sobrescriba estas páginas de memoria "de solo lectura".
Al envenenar las páginas de memoria de binarios SETUID como /usr/bin/su, es posible omitir la autenticación y generar una shell de root.
Se realizaron pruebas en múltiples distribuciones de Ubuntu, examinando específicamente el impacto del backporting del kernel y la gestión de parches.
| Distribución | Versión del Kernel | Fecha del Parche | Resultado | Observación |
|---|---|---|---|---|
| Ubuntu 24.04 | 6.8.0-87-generic | Oct 2025 | ❌ Fallido | Actualizaciones de seguridad activas |
| Ubuntu 22.04 | 5.15.0-125-generic | Sep 2024 | ✅ ÉXITO | Vulnerable (Sin parche) |
| Ubuntu 18.04 | 4.15.0-197-generic | Nov 2022 | ✅ ÉXITO | Vulnerable (Sin parche) |
Los números de versión del kernel pueden ser engañosos. Mientras que los kernels "más nuevos" como el 6.8 están protegidos mediante parches de seguridad, los kernels más antiguos o EOL (Fin de Vida) como el 4.15 y el 5.15 permanecieron completamente vulnerables debido a la falta de correcciones backporteadas.
Durante la investigación, se obtuvo un resultado sorprendente al probar dos sistemas Ubuntu 22.04 diferentes que compartían la misma versión principal del kernel:
| Versión del Kernel |
|---|
Esta prueba demuestra que la seguridad del sistema no puede medirse únicamente por el número de versión principal. Un servidor que ejecuta 5.15.0-125 puede ser comprometido en segundos, mientras que 5.15.0-170 bloquea completamente el ataque.
Salida de Explotación Exitosa (Kernel 5.15.0-125):
$ python3 ubuntu_22.04_copy_fail_exploit.py
[*] Envenenando /usr/bin/su (Ubuntu 22.04 / Kernel 5.15)...
[+] Exploit completado. Activando Root...
# id
uid=0(root) gid=1004(jastin) groups=1004(jastin)
# whoami
root
# export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
# /bin/bash -i
root@ovh-net-dream01:/tmp#
La PoC se desarrolló utilizando ctypes para garantizar la compatibilidad entre diferentes versiones de Python (específicamente para versiones que carecen de soporte nativo para os.splice).
sudo modprobe af_alg algif_aead authenc echainiv
python3 final_exploit.py
$ python3 ubuntu_18.04_copy_fail_exploit.py
[*] Envenenando /bin/su (Kernel 4.15)...
[+] ¡Memoria envenenada! Activando Root...
# id
uid=0(root) gid=1004(jastin) groups=1004(jastin)
# whoami
root
# export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
# /bin/bash -i
root@ovh-net-dream02:/tmp#
sync; echo 3 | sudo tee /proc/sys/vm/drop_caches
# 1. Verificar la versión del kernel
# uname -r
# 2. Verificar módulos cargados (Seguro si no hay salida)
# lsmod | grep -E "algif_aead|authencesn"
# 3. Prueba Crítica — enlace authencesn
python3 -c "
import socket
try:
s = socket.socket(38, 5, 0)
s.bind(('aead', 'authencesn(hmac(sha256),cbc(aes))'))
print('[!] CRÍTICO — ¡Sistema Vulnerable!')
s.close()
except:
print('[+] Seguro — authencesn inaccesible')
"
# 4. Hash de binarios setuid (referencia)
sha256sum /usr/bin/su /usr/bin/sudo /usr/bin/passwd
Tabla de Evaluación:
| Resultado | Significado |
|---|---|
| Sin salida de lsmod + error de enlace | ✅ Seguro |
| Salida de lsmod existe O enlace exitoso | ⚠️ Vulnerable, aplicar parches inmediatamente |
Aviso Legal: Esta investigación y la PoC son solo para fines educativos y de pruebas de seguridad autorizadas. El uso en sistemas no autorizados puede tener consecuencias legales.
| Fecha del Parche |
|---|
| Resultado |
|---|
| Estado |
|---|
| 5.15.0-125 | Sep 2024 | ✅ ÉXITO | Vulnerable (Exploit Ejecutado) |
| 5.15.0-170 | Ene 2026 | ❌ FALLIDO | Seguro (Parcheado) |