
Análisis exhaustivo de CVE-2026-31431, una vulnerabilidad de escalada de privilegios locales (LPE) en el kernel de Linux, que incluye metodología de explotación, scripts de detección, reglas YARA, configuraciones de auditd y Falco, y orientación para la remediación.
algif_aeadCISA KEV | CVSS 7.8 ALTO | Afecta a kernels de Linux 4.14 – principios de 2026 (~9 años)
CVE-2026-31431, apodado "Copy Fail", es una vulnerabilidad de escalada de privilegios local (LPE) de alta severidad en el subsistema criptográfico del kernel de Linux. Un usuario local con privilegios bajos puede escalar a root en segundos en cualquier sistema sin parchear.
| Atributo | Valor |
|---|---|
| CVE | CVE-2026-31431 |
| Apodo | Copy Fail |
| CVSS v3.1 | 7.8 ALTO |
| Vector de Ataque | Local |
| Privilegios Requeridos | Bajos |
| Interacción del Usuario | Ninguna |
| Componente | crypto/algif_aead.c — plantilla authencesn |
| Introducido | 2017 (commit 72548b093ee3) |
| Divulgado | 2026 |
| Años en Silencio | ~9 años |
| CISA KEV | Sí |
| PoC Público | Sí (script Python independiente de 732 bytes) |
detection/check_vulnerable.sh antes y después de la remediación.CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H
| Métrica | Valor | Justificación |
|--------|-------|-----------|
| Vector de ataque | **Local** | Requiere acceso a shell (SSH, exec de contenedor, físico) |
| Complejidad del ataque | **Baja** | Fiable, totalmente automatizado — no requiere condición de carrera |
| Privilegios requeridos | **Bajos** | Cualquier cuenta de usuario sin privilegios |
| Interacción del usuario | **Ninguna** | No se necesita interacción de la víctima |
| Confidencialidad | **Alta** | Compromiso total del sistema |
| Integridad | **Alta** | Compromiso total del sistema |
| Disponibilidad | **Alta** | Compromiso total del sistema |
### Panorama de amenazas
| Factor | Evaluación |
|--------|-----------|
| Disponibilidad de PoC | Pública, armada, Python independiente de 732 bytes |
| Fiabilidad del exploit | Alta — funciona en las distros probadas sin modificación |
| Dificultad de detección | Alta — sin escrituras en disco, sin páginas sucias |
| Habilidad requerida del atacante | Baja — script kiddie con PoC público |
| CISA KEV | Añadido en 2026 — monitorizado activamente |
| Microsoft Defender | Marcado como bajo investigación activa |
### Entornos afectados
| Entorno | Riesgo |
|-------------|------|
| Servidores Linux en bare-metal | Crítico |
| VMs Linux (nube o locales) | Crítico |
| Nodos Kubernetes | Crítico (también permite escape de contenedor) |
| Hosts Docker | Crítico |
| Hosting compartido / multiinquilino | Crítico |
| WSL2 / Linux en Windows | Evaluar según la versión del kernel |
---
## 3. Inmersión técnica profunda
### 3.1 Antecedentes: AF_ALG y AEAD
El kernel de Linux expone operaciones criptográficas al espacio de usuario mediante **sockets AF_ALG** (`AF_ALG = 38`). Esta interfaz (`algif_aead`) permite que aplicaciones sin privilegios invoquen aceleradores criptográficos de hardware del kernel sin necesidad de código en modo kernel.
Los algoritmos **AEAD** (Autenticación Encriptada con Datos Asociados) como AES-GCM y ChaCha20-Poly1305 se usan ampliamente para TLS, cifrado de disco y protocolos VPN. La plantilla vulnerable es `authencesn` — una composición AEAD que usa `hmac(sha256)` + `cbc(aes)` con soporte de Número de Secuencia Extendido (ESN), comúnmente utilizada en IPsec.
### 3.2 Causa raíz
En 2017, el commit `72548b093ee3` introdujo la **operación AEAD in-place** en `algif_aead` como una optimización de rendimiento — permitiendo que el motor criptográfico leyera y escribiera en el mismo búfer. Esto era defectuoso:```
The bug chain:
1. Caller binds AF_ALG socket to:
authencesn(hmac(sha256),cbc(aes))
2. Caller sends a decryption request via sendmsg() with specific flags
3. Caller uses splice() to feed PAGE CACHE PAGES from an open file
descriptor directly into the socket's scatterlist
4. The authencesn template, during ESN header processing, uses the
OUTPUT BUFFER as scratch space — writing 4 bytes past the
expected output boundary
5. Because the scatterlist contains page cache pages (not private
copies), this scratch write lands DIRECTLY IN THE PAGE CACHE
6. Page cache is shared kernel-wide — all processes reading the
same file now see the modified bytes
Key insight: splice() is zero-copy — it hands page cache references
to the socket. The in-place "optimization" then writes INTO those
pages. No dirty bit is set because the write goes through the crypto
engine, not the normal write path.
La vulnerabilidad proporciona una escritura controlada de 4 bytes en la caché de páginas de cualquier archivo que el atacante pueda abrir para lectura:
| Propiedad | Valor |
|---|---|
| Tamaño de escritura | 4 bytes |
| Control de desplazamiento | Sí — controlado por el atacante mediante el desplazamiento de splice |
| Objetivo | Caché de páginas de cualquier archivo legible |
| Marcado de página sucia | Ninguno |
| Modificación en disco | Ninguna |
| Actualización de marca de tiempo | Ninguna |
| Entrada en el registro del kernel | Ninguna (a menos que auditd esté configurado) |
La escritura es repetible: el exploit repite la escritura de 4 bytes para parchear secuencias de código más grandes.
[1] Open /usr/bin/su (or any setuid-root binary) for reading ↓ [2] Map a copy to find target instruction bytes (e.g., UID check, execve path, security gate) ↓ [3] Compute exact page cache offset of target bytes ↓ [4] Set up AF_ALG socket → authencesn(hmac(sha256),cbc(aes)) ↓ [5] splice() the target binary's page cache into the socket ↓ [6] Trigger decryption → authencesn scratch write patches the target bytes in page cache (4 bytes per iteration) ↓ [7] Repeat for each 4-byte patch needed ↓ [8] Execute /usr/bin/su → runs root-owned setuid binary but now with attacker-controlled code in page cache ↓ [9] Root shell
### 3.5 Por Qué Fallan las Defensas Estándar