
Análisis detallado de la vulnerabilidad Copy Fail (CVE-2026-31431) en el kernel de Linux, incluyendo el mecanismo de corrupción de memoria, el flujo de escalada de privilegios y el impacto en la seguridad.
Análisis educativo de la vulnerabilidad Copy Fail en el kernel de Linux.
Cubre el mecanismo de corrupción de memoria, el flujo de escalada de privilegios, el escape de contenedores y las contramedidas defensivas.
Este repositorio es solo para fines educativos y de investigación.
No utilice esta información en sistemas que no le pertenezcan o para los que no tenga permiso explícito por escrito para realizar pruebas.
Todos los fragmentos de código y comandos se proporcionan estrictamente para ayudar a comprender los internals del kernel de Linux.
CVE-2026-31431, también conocida como Copy Fail, es una vulnerabilidad del kernel de Linux en la que un usuario local sin privilegios puede escalar a root sin necesidad de permisos especiales.
El ataque opera enteramente en RAM. El archivo en disco nunca se toca, lo que significa que los hashes de archivos permanecen limpios, las marcas de tiempo no cambian y los registros de auditoría no registran nada. Cuando el sistema se reinicia, toda la evidencia desaparece.
Usuario normal → explota el fallo algif_aead → sobrescribe la caché de páginas → root
Propiedades clave:
| Campo | Valor |
|---|---|
| ID CVE | CVE-2026-31431 |
| Nombre Común | Copy Fail / Corrupción de Caché de Páginas algif_aead |
| Puntuación CVSS v3.1 | 7.8 — CRÍTICA |
| Tipo de Ataque | Escalada Local de Privilegios (LPE) |
| Versiones de Kernel Afectadas | Linux 5.10 a 6.8 (aprox.) |
| Componente Vulnerable | crypto/algif_aead.c — interfaz de socket AF_ALG |
| Fiabilidad de Explotación | ALTA — No requiere condición de carrera |
| Evidencia en Disco | NINGUNA — Modificación solo en RAM |
| Impacto en Contenedores | SÍ — Escape del host mediante caché de páginas compartida |
| Estado del Parche | Disponible (parche del kernel upstream publicado) |
/usr/bin/su — El Binario Objetivosu (Switch User) permite a un usuario cambiar a otra cuenta, normalmente root. Es un binario SetUID:
ls -l /usr/bin/su
# -rwsr-xr-x 1 root root 68208 Jan 1 2026 /usr/bin/su
# ^-- 's' = indicador SetUID
El indicador s significa que cuando cualquier usuario ejecuta este binario, se ejecuta con los permisos de root. Esto lo convierte en un objetivo de alto valor.
Su lógica interna (simplificada):
if (password_correct()) {
give_root_access();
} else {
deny_access();
}
El objetivo del ataque: omitir por completo la comprobación password_correct().
Cuando Linux lee un archivo del disco, guarda una copia en RAM llamada caché de páginas.
| Componente | Descripción |
|---|---|
| Disco | Archivo original en disco (el estante de la biblioteca) |
| Caché de Páginas | Copia del archivo en RAM (la fotocopia en su escritorio) |
| CPU | Lee y ejecuta desde la caché de páginas — rápido |
| Atacante | Modifica la copia en RAM; el disco permanece intacto |
cat /proc/meminfo | grep Cached
# Cached: 1234567 kB ← esta es la caché de páginas
| Tipo | Seguridad |
|---|---|
| Buffer Seguro — asignado por el kernel, tamaño y límites controlados | ✅ OK |
| Caché de Páginas — copia en RAM respaldada por archivo, compartida, ejecutable | ⚠️ PELIGROSO si se escribe en ella |
| Puntero Incorrecto — dirección causada por el fallo que apunta a cualquier lugar | 🔴 CRÍTICO |
AF_ALG (Algorithm Family) es una interfaz de socket de Linux que permite a los programas de espacio de usuario usar funciones criptográficas del kernel (AES, SHA, AEAD).
socket(AF_ALG, SOCK_SEQPACKET, 0); // abrir un socket criptográfico
algif_aead es el módulo del kernel que maneja el cifrado AEAD (por ejemplo, AES-GCM) a través de AF_ALG. La vulnerabilidad reside en su paso de copia de datos.
AF_ALG → algif_aead → motor AES-GCM → buffer de salida
↑
EL FALLO ESTÁ AQUÍ
El fallo no está en la lógica de cifrado. Está en el manejo de memoria — se selecciona la región de memoria incorrecta durante una copia de datos.
destination = safe_output_buffer; // ubicación correcta
memcpy(destination, user_data, size); // datos escritos de forma segura
destination = buffer + WRONG_OFFSET; // FALLO: ¡puntero incorrecto!
memcpy(destination, user_data, size); // los datos caen en la caché de páginas
Se suponía que el kernel escribiría en el buffer de salida seguro. Debido a un offset mal calculado, escribe en la caché de páginas — que contiene la copia en RAM de /usr/bin/su.
El binario contiene código máquina x86-64. El atacante apunta al salto condicional que activa el fallo de autenticación:
Antes del ataque:
cmp eax, 0 ; comprobar valor de retorno
jne 0x1234 ; si falla → saltar a denegar
call give_root ; conceder root
Después del ataque (2 bytes cambiados en RAM):
cmp eax, 0 ; igual
90 90 ; NOP NOP ← salto reemplazado, ¡comprobación omitida!
call give_root ; la CPU llega aquí directamente
NOP = No Operation. La CPU no hace nada y avanza — omitiendo por completo la comprobación de autenticación.
"Solo necesito una cuenta de usuario normal. El kernel cometerá el error por sí mismo.
El disco permanece limpio. Sin registros. Funciona siempre."
whoami && id
# uid=1000(user) gid=1000(user) ← usuario normal
uname -r
# 6.1.0-generic ← dentro del rango vulnerable
ls -la /usr/bin/su
# -rwsr-xr-x root root ← SetUID confirmado
python3 -c "import socket; s = socket.socket(socket.AF_ALG); print('AF_ALG disponible')"
cat /usr/bin/su > /dev/null
# /usr/bin/su ahora está cargado en la caché de páginas ✓
xxd /usr/bin/su | head -50
objdump -d /usr/bin/su | grep -A 20 'check\|auth\|pass'
readelf -h /usr/bin/su
Buscando: la dirección de la función de autenticación, el salto condicional jne/jnz y su offset de bytes exacto.
import socket, struct