
# Exploit de escalada de privilegios local en el kernel de Linux para CVE-2026-31431, que proporciona un PoC fiable de un solo disparo con múltiples implementaciones en varios lenguajes, escáner de vulnerabilidades y script de mitigación.
Una escalada de privilegios local en Linux 100% fiable que afecta a todas las distribuciones principales desde 2017.
Un único error lógico en
authencesn, encadenado a través deAF_ALGysplice()en una escritura de 4 bytes en la caché de páginas — explotable silenciosamente durante casi una década.
Todo el código y la documentación de este repositorio se proporcionan exclusivamente para investigación de seguridad autorizada y fines educativos.
Ejecutar código de exploit contra sistemas que no posees o para los que no tienes autorización escrita explícita para probar es ilegal. Al usar este repositorio, aceptas toda la responsabilidad por tus acciones.
.
├── README.md ← Estás aquí
├── LICENSE ← MIT
├── .gitignore
├── docs/
│ ├── analysis-report.md ← Análisis de seguridad exhaustivo
│ ├── analysis-report.html ← Versión HTML con estilos
│ ├── exploit-walkthrough.md ← Análisis del PoC línea por línea
│ └── exploit-walkthrough.html ← Versión HTML con estilos
└── poc/
├── README.md ← Guía de uso del PoC
├── copy_fail_exp.py ← PoC oficial (732 bytes, ofuscado)
├── copy_fail_exp_readable.py ← Versión desofuscada + anotada
├── copy_fail_exp_compat.py ← Compatible con Python 3.6+ (splice con ctypes)
├── copy_fail_exp_alpine.py ← Variante para Alpine Linux
├── copy_fail_exp.c ← Implementación en C (cero dependencias)
├── copy_fail_exp.go ← Implementación en Go (cero dependencias)
├── copy_fail_rust/ ← Implementación en Rust
│ ├── Cargo.toml
│ └── src/main.rs
├── check_vulnerable.py ← Escáner de vulnerabilidad
└── mitigate.sh ← Script de mitigación con un clic
# Desde GitHub Releases — binarios precompilados (Linux amd64/arm64) + todos los scripts de Python
wget https://github.com/nisec-eric/cve-2026-31431/releases/latest/download/copy-fail-go-linux.tar.gz
wget https://github.com/nisec-eric/cve-2026-31431/releases/latest/download/copy-fail-c-linux.tar.gz
wget https://github.com/nisec-eric/cve-2026-31431/releases/latest/download/copy-fail-python.tar.gz
tar xzf copy-fail-go-linux.tar.gz
tar xzf copy-fail-c-linux.tar.gz
tar xzf copy-fail-python.tar.gz
# Binario estático en Go (no necesita Python)
chmod +x copy-fail-exp-amd64
./copy-fail-exp-amd64
# Binario estático en C
chmod +x copy-fail-exp-c-amd64
./copy-fail-exp-c-amd64
# O usa los scripts de Python directamente
python3 check_vulnerable.py
📦 Las versiones se compilan automáticamente mediante GitHub Actions en cada push de etiqueta
v*. Los binarios de Go y C se compilan para linux/amd64 y linux/arm64 como binarios estáticos.
python3 poc/check_vulnerable.py
sudo bash poc/mitigate.sh
Esto bloquea el módulo del kernel algif_aead — no rompe nada en el 99% de los sistemas.
# Debian/Ubuntu
sudo apt update && sudo apt upgrade linux-image-*
# RHEL/CentOS/Fedora
sudo dnf update kernel
# Reinicia con el kernel parcheado
sudo reboot
python3 poc/check_vulnerable.py
# Código de salida 1 = protegido ✓
ADVERTENCIA: Ejecuta solo en sistemas que poseas o para los que tengas autorización para probar.
# C
gcc -static -o exp ./poc/copy_fail_exp.c && ./exp
# Python
python3 poc/copy_fail_exp.py
python3 poc/copy_fail_exp_compat.py # Python < 3.10
# Go
go build -o exp ./poc/copy_fail_exp.go && ./exp
# Rust
cd poc/copy_fail_rust && cargo run --release
Todas las versiones aceptan un argumento opcional para apuntar a un binario SUID diferente:
python3 poc/copy_fail_exp.py /usr/bin/passwd
./exp /usr/bin/sudo
Evaluación completa de la vulnerabilidad que cubre:
authencesn)Análisis del PoC línea por línea que cubre:
AF_ALG, entrega a caché de páginas con splice(), mecánica de sg_chain()authencesn que cruza los límites del scatterlist/etc/passwd, apuntado a bibliotecas compartidas, escape de contenedoresLas contribuciones son bienvenidas:
Abre un issue o una pull request.
MIT — Úsalo con responsabilidad.
| Campo | Detalle |
|---|
| CVE | CVE-2026-31431 |
| Alias | Copy Fail |
| Tipo | Escalada de privilegios local en el kernel de Linux (LPE) / escritura arbitraria en caché de páginas |
| CVSS v3.1 | 7.8 ALTO — AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H |
| CWE | CWE-669 (Transferencia incorrecta de recursos entre esferas) |
| Componente | crypto/algif_aead — plantilla criptográfica authencesn |
| Introducido | 2017 (commit 72548b093ee3) |
| Corregido | Commit principal a664bf3d603d (2026-04-01) |
| Kernel parcheado | v6.18.22+, v6.19.12+, v7.0+ |
| Descubridor | Xint / Theori (Taeyang Lee + auditoría asistida por IA Xint Code) |
| Divulgación | 2026-04-29 — copy.fail |
| LPE típico en Linux | Copy Fail |
|---|
| Condición de carrera | Requerida | Ninguna |
| Offset por distribución | Requeridos | Ninguno |
| Fiabilidad | 30–80% | 100%, un solo intento |
| Ventana afectada | Estrecha | 2017 → 2026 (9 años) |
| Modificación en disco | Posible | Ninguna (sigiloso) |
| Cruce de contenedores | No | Sí |
| Archivo | Lenguaje | Requisitos | Notas |
|---|
copy_fail_exp.py | Python 3.10+ | solo stdlib | PoC oficial de 732 bytes |
copy_fail_exp_compat.py | Python 3.6+ | stdlib + ctypes | Funciona en CentOS 7, AL2, etc. |
copy_fail_exp_alpine.py | Python 3.10+ | solo stdlib | Apunta a /bin/ping en Alpine |
copy_fail_exp.c | C | gcc + cabeceras de Linux | Binario estático, cero dependencias |
copy_fail_exp.go | Go 1.21+ | solo stdlib | Binario estático, cero dependencias |
copy_fail_rust/ | Rust 1.70+ | crates libc + flate2 | Binario estático |
| Entorno | Riesgo | Por qué |
|---|
| Hosts Linux multiinquilino | 🔴 Alto | Cualquier usuario → root |
| Kubernetes / contenedores | 🔴 Alto | Caché de páginas compartida → escape de contenedor |
| Ejecutores CI (autoalojados) | 🔴 Alto | PR malicioso → root del ejecutor |
| SaaS en la nube (código de usuario) | 🔴 Alto | Inquilino → root del host |
| Servidores estándar | 🟡 Medio | Se encadena con RCE web / credenciales robadas |
| Portátiles de un solo usuario | 🟢 Bajo | Ya es el único usuario |