Todas las notas

Copy Fail (CVE-2026-31431): 732 bytes bastan para hacerse root en Linux

Un script Python de 732 bytes da acceso root en cualquier Linux desde 2017. Sin carreras de condición, sin huella en disco, sin dependencias. Acá te explicamos cómo funciona y qué hacer.

Copy Fail (CVE-2026-31431): 732 bytes bastan para hacerse root en Linux

Hace una semana, el equipo de Xint publicó algo que dejó a medio mundo de sysadmins mirando la pantalla: un script Python de 732 bytes que le da acceso root a cualquier usuario sin privilegios en prácticamente cualquier servidor Linux del planeta. Sin carreras de condición. Sin compilar nada. Sin depender de la versión exacta del kernel.

Le pusieron Copy Fail. El CVE es el CVE-2026-31431.


Qué pasó exactamente

El bug vive en el subsistema criptográfico del kernel Linux, específicamente en la intersección de tres componentes:

  • algif_aead — la interfaz de usuario para operaciones AEAD vía sockets AF_ALG
  • authencesn — un wrapper AEAD usado en IPsec con soporte de número de secuencia extendido
  • splice() — la llamada al sistema que transfiere datos entre descriptores de archivo sin copiarlos al espacio de usuario

La historia es así: en 2011 se introdujo authencesn, que usa el buffer de destino como espacio de scratch para reorganizar bytes del número de secuencia. En 2015 el AF_ALG ganó soporte para AEAD y splice(). Y en 2017 alguien añadió una optimización de in-place para las operaciones AEAD y conectó los tres sin darse cuenta de lo que pasaba.

El resultado: cuando el exploit llama a sendmsg() + splice() con la configuración correcta, authencesn acaba escribiendo 4 bytes controlados directamente en el page cache de cualquier archivo legible del sistema. Incluidos los binarios setuid como /usr/bin/su.


Por qué es tan peligroso

Lo que hace especial a Copy Fail no es solo que funcione. Es cómo funciona.

Sin carreras de condición. La mayoría de los exploits de escalada de privilegios dependen de ganar alguna ventana de tiempo. Copy Fail no. La escritura es determinista al 100%.

Sin huella en disco. El page cache se modifica en memoria. El archivo en disco no cambia. Los checksums SHA256 siguen siendo los mismos. Un IDS que verifique integridad de binarios no detecta nada.

Sin dependencias. El exploit usa únicamente os, socket y zlib — bibliotecas estándar de Python 3.10+. Nada que instalar, nada que compilar.

Funciona en todos lados. Ubuntu, Amazon Linux, RHEL, Debian, SUSE, AlmaLinux. El mismo script, sin modificaciones. Kernels entre 4.14 y 6.19.12, es decir, cualquier distribución lanzada desde 2017.

Y el detalle más incómodo para entornos cloud y Kubernetes: el page cache es compartido. Un contenedor comprometido puede afectar a otros contenedores en el mismo host.


Cómo funciona el exploit

El flujo tiene cuatro pasos:

  1. Abrir un socket AF_ALG y vincularlo a authencesn(hmac(sha256),cbc(aes)).
  2. Construir el payload: para cada bloque de 4 bytes que se quiera escribir, crear pares sendmsg() + splice() donde los bytes AAD 4–7 contienen el valor objetivo y splice() entrega páginas del page cache del binario target (/usr/bin/su por defecto).
  3. Disparar la escritura: recvmsg() inicia la desencriptación AEAD, y authencesn escribe los bytes controlados en el page cache del archivo.
  4. Ejecutar: execve("/usr/bin/su") carga el binario corrompido desde el page cache. Shell root.

El patch que cierra el bug (a664bf3d603d) es simple: revertir algif_aead.c a operación out-of-place, separando el scatterlist de origen del de destino. Fin del problema.


Línea de tiempo

Fecha Evento
23 marzo 2026 Xint reporta al equipo de seguridad del kernel Linux
25 marzo 2026 Parches propuestos y revisados
1 abril 2026 Commit a664bf3d603d integrado en mainline
22 abril 2026 CVE-2026-31431 asignado
29 abril 2026 Divulgación pública

Qué hacer ahora

Si podés parchear, parcheá. Todas las distribuciones principales ya tienen kernels actualizados:

# Ubuntu/Debian
sudo apt update && sudo apt install --only-upgrade linux-image-generic
sudo reboot

# AlmaLinux/RHEL/Amazon Linux
sudo dnf clean metadata && sudo dnf upgrade kernel
sudo reboot

Si no podés reiniciar todavía, deshabilitá el módulo afectado:

echo "install algif_aead /bin/false" > /etc/modprobe.d/disable-algif-aead.conf
rmmod algif_aead 2>/dev/null

Esto no rompe dm-crypt, LUKS, kTLS, IPsec, ni las builds estándar de OpenSSL o GnuTLS. Solo afecta a aplicaciones que usen explícitamente el engine afalg de OpenSSL — algo inusual.

Para workloads en contenedores, CERT-EU recomienda bloquear la creación de sockets AF_ALG mediante políticas seccomp. El exploit requiere ese socket como primer paso — bloquearlo lo detiene completamente incluso en kernels sin parchear.


Un detalle que vale la pena mencionar

Xint dice que encontraron la vulnerabilidad con su herramienta de IA en aproximadamente una hora, guiada por contexto sobre la entrega de páginas del page cache vía splice() al subsistema cripto. También mencionan que el mismo escaneo descubrió otros bugs de alta severidad que todavía están bajo divulgación coordinada.

Eso dice algo sobre el estado actual del análisis de seguridad asistido por IA. Bugs que llevan nueve años en el kernel, encontrados en una hora.


Conclusión

Copy Fail es fiable, silencioso y universal. La buena noticia: el parche ya existe, lleva más de un mes en mainline, y todas las distros principales lo tienen disponible. Actualizá, o al menos deshabilitá algif_aead mientras podés.

No hay mucho más que pensar.


Fuentes: