
# Reescritura en Golang del exploit de escalada de privilegios locales Copy Fail (CVE-2026-31431), que corrompe la caché de páginas para obtener root en sistemas Linux.
732 Bytes para Root en Todas las Principales Distribuciones de Linux
CVE-2026-31431 (Copy Fail) es un error lógico en la plantilla criptográfica authencesn del kernel de Linux. Permite que un usuario local sin privilegios active una escritura determinista y controlada de 4 bytes en la caché de páginas de cualquier archivo legible del sistema.
CONFIG_CRYPTO_AUTHENC (prácticamente todas las principales distribuciones desde 2017)El error encadena dos comportamientos:
AF_ALG + splice: splice() transfiere páginas de la caché de páginas por referencia al scatterlist de un socket AF_ALG. Para el modo de descifrado AEAD in-place, las páginas de etiqueta (de la caché de páginas del archivo objetivo) permanecen encadenadas al scatterlist de salida mediante sg_chain().
Escritura temporal en authencesn: crypto_authenc_esn_decrypt() usa dst[assoclen + cryptlen] (más allá de la etiqueta, dentro de las páginas de la caché de páginas) como espacio temporal para la reorganización del número de secuencia ESN, escribiendo 4 bytes controlados por el atacante y nunca restaurándolos.
La página corrupta nunca se marca como sucia, por lo que el archivo en disco permanece sin cambios. Pero la caché de páginas en memoria es lo que realmente se lee, lo que hace que la corrupción sea inmediatamente visible en todo el sistema.
El exploit corrompe la caché de páginas de /usr/bin/su (o cualquier binario setuid) con un pequeño payload de shellcode, 4 bytes a la vez. Después de todas las iteraciones, ejecutar su ejecuta el payload y otorga una shell de root.
python3 exp.py
go run exp.go
go build -ldflags "-w -s" -trimpath -o exp exp.go
tinygo build -o exp exp.go
| Capacidad | Detalles |
|---|---|
Este repositorio se publica únicamente con fines educativos y de investigación defensiva. No use este código en sistemas que no sean de su propiedad o para los que no tenga permiso explícito de prueba.
| Portátil |
| El mismo script funciona en Ubuntu, Amazon Linux, RHEL, SUSE y más — sin offsets específicos por distribución |
| Diminuto | El exploit en Python tiene ~732 bytes |
| Sigiloso | Evita la ruta de escritura VFS; la página nunca se marca como sucia; las sumas de verificación en disco no cambian |
| Entre contenedores | La caché de páginas se comparte entre contenedores — vector de escape de contenedor (ver Parte 2) |