
Análisis - POC - Mitigación
Educational purposes only. Do NOT use on systems without explicit authorization.
| Campo | Valor |
|---|---|
| CVE | CVE-2026-31431 |
| Alias | Copy Fail |
| CVSS | 7.8 (High) |
| Tipo | Local Privilege Escalation (LPE) |
| Kernel afectado | 2017 – 2026 (commit 72548b093ee3 en adelante) |
| Fix upstream | commit a664bf3d603d (revert del 2017) |
| Divulgación | 29 de abril de 2026 (Theori / Xint Code) |
Copy Fail es un bug lógico determinístico (no requiere race conditions) en el subsistema criptográfico del kernel Linux. Permite a un usuario sin privilegios escribir 4 bytes controlados en el page cache de cualquier archivo legible del sistema, incluyendo binarios setuid como su o sudo.
A diferencia de vulnerabilidades previas similares:
Linux kernel — crypto/authencesn.c
└── algif_aead (módulo AF_ALG)
└── in-place optimization (commit 72548b093ee3, 2017)
└── AEAD scratch write → cruza boundary del scatterlist
└── escribe 4 bytes en page cache de archivo externo
Distribuciones afectadas: Ubuntu, Debian, RHEL, Amazon Linux, SUSE, Fedora, Arch, AlmaLinux — cualquier distro con kernel ≥ 2017.
En 2017 se introdujo una optimización que hace que req->src y req->dst apunten al mismo scatterlist combinado. Esto causa que las páginas del page cache (provenientes de splice()) queden encadenadas directamente en el scatterlist de destino escribible.
1. Abrir AF_ALG socket con algoritmo authencesn
2. Usar splice() para alimentar páginas del page cache del binario objetivo
hacia el socket AF_ALG (ej: /usr/bin/sudo)
3. Ejecutar operación de decryptación AEAD
4. authencesn usa el buffer de destino como scratch pad →
escribe seqno_hi (4 bytes controlados) FUERA del output legítimo,
cruzando el boundary del scatterlist
5. Los 4 bytes aterrizan en la página del page cache del binario objetivo
6. El archivo en disco NO cambia → los integrity checks no detectan nada
7. El binario modificado en memoria ejecuta payload → root
La escritura bypasses el VFS write path normal. El archivo en disco permanece intacto. Herramientas como sha256sum, aide, tripwire, o inotify no detectan el cambio porque operan sobre el archivo en disco o sobre el inode, no sobre el page cache en memoria.
El lab usa un kernel vulnerable para demostrar la corrupción del page cache. En entornos Docker, la escalada de privilegios completa depende de la configuración del host (shared kernel).
# Clonar el repo
cd cve-2026-31431
# Construir la imagen vulnerable
docker build -t copyfail-lab -f docker/Dockerfile.vulnerable .
# Ejecutar el lab
docker run --rm -it \
--cap-add=NET_ADMIN \
--security-opt seccomp=unconfined \
copyfail-lab bash
# Dentro del contenedor:
cd /lab
python3 exploit/poc.py
os.splice)Ver exploit/poc.py y exploit/README.md.
El PoC demuestra:
Ver mitigation/README.md para instrucciones detalladas.
TL;DR — Mitigación inmediata (sin reinicio):
# Deshabilitar el módulo afectado
echo "install algif_aead /bin/false" | sudo tee /etc/modprobe.d/disable-algif.conf
sudo modprobe -r algif_aead 2>/dev/null || true
Fix definitivo: Actualizar el kernel a una versión parcheada (post a664bf3d603d).
cve-2026-31431/
├── README.md ← este archivo
├── docs/
│ ├── technical-analysis.md ← análisis técnico profundo
│ └── affected-kernels.md ← tabla de versiones afectadas/parcheadas
├── exploit/
│ ├── README.md ← documentación del PoC
│ └── poc.py ← proof of concept (Python 3.10+)
├── mitigation/
│ ├── README.md ← guía de mitigación
│ ├── disable-algif.conf ← modprobe config
│ └── check-vulnerable.sh ← script de detección
├── docker/
│ ├── Dockerfile.vulnerable ← lab vulnerable
│ └── Dockerfile.patched ← lab con mitigación aplicada
└── scripts/
└── setup-lab.sh ← automatización del lab
a664bf3d603d| Vuln | Tipo | Requiere race? | Portable? | Tamaño exploit |
|---|
| Dirty Cow (CVE-2016-5195) | CoW race | Sí | Parcial | ~KB |
| Dirty Pipe (CVE-2022-0847) | pipe buffer | No | Limitado | ~KB |
| Copy Fail (CVE-2026-31431) | Lógico | No | Total | 732 bytes |
| Fecha | Evento |
|---|
| 2017 | Commit 72548b093ee3 introduce el bug en el kernel |
| ~2025 | Theori/Xint Code comienza análisis del subsistema crypto |
| Abr 28, 2026 | Coordinación con distribuidores |
| Abr 29, 2026 | Divulgación pública + PoC publicado |
| May 1, 2026 | Kernels parcheados disponibles en repos de producción |
| May 1, 2026 | Agregado al catálogo CISA KEV |