Script de detección para CVE-2026-31431 (Copy Fail) que verifica la versión del kernel, la presencia de parches, las configuraciones del kernel, la disponibilidad de sockets AF_ALG, binarios setuid y mitigaciones para determinar el estado de vulnerabilidad en sistemas Linux.
Solo detección. Ya existe un PoC funcional en copy.fail/#exploit. Este script está pensado para administradores de sistemas y equipos de seguridad que necesitan determinar dónde son vulnerables — o si siguen siendo vulnerables tras aplicar el parche.
El 29 de abril de 2026, el Xint Code Research Team reveló públicamente una vulnerabilidad llamada Copy Fail (CVE-2026-31431). Es un bug lógico que ha estado presente silenciosamente en el kernel de Linux desde aproximadamente 2017 — casi una década — y permite que cualquier usuario local sin privilegios obtenga acceso root.
No es "obtener root bajo condiciones específicas con algo de suerte y buen viento de cola." Simplemente... obtener root. De forma fiable. En prácticamente todas las distribuciones principales de Linux.
Afecta a Ubuntu, Amazon Linux, RHEL, SUSE y cualquier otro sistema que ejecute un kernel convencional de los últimos ~8 años. Mismo script, sin recompilación, sin ajustes por distribución.
Sí, es tan grave como parece.
El kernel de Linux tiene un subsistema criptográfico accesible para usuarios sin privilegios mediante sockets AF_ALG. Existe un mecanismo llamado splice() que puede alimentar datos de archivos directamente a ese subsistema sin copiarlos — lo que significa que la copia en caché en memoria del kernel de un archivo (la "page cache") termina dentro de una operación criptográfica.
Un algoritmo específico — authencesn, utilizado para los Números de Secuencia Extendidos de IPsec — tiene una peculiaridad: usa el buffer de salida como espacio de trabajo y escribe 4 bytes ligeramente más allá de donde debería. Normalmente es inofensivo. Pero cuando las páginas de la page cache de un binario setuid como /usr/bin/su terminan encadenadas en ese buffer de salida (gracias a una "optimización" de 2017 en algif_aead.c), esos 4 bytes aterrizan directamente en la copia en caché del kernel del binario.
La operación falla con un error. El kernel nunca marca esa página como sucia. El archivo en disco no se toca. Las herramientas de integridad de archivos que verifican sumas de verificación en disco no detectan nada.
Pero la page cache es lo que se ejecuta. Y su es setuid root.
El informe técnico completo está en xint.io y realmente merece la pena leerlo.
Siete de la versión original más seis nuevas comprobaciones añadidas para cerrar las lagunas de detección:
| # | Comprobación | Qué busca |
|---|---|---|
| 1 | Versión del kernel | ¿Está este kernel en el rango afectado (4.10–6.14)? |
| 2 | Presencia del parche | ¿Está el commit de corrección realmente en tu kernel en ejecución? |
| 3 | Módulo algif_aead | ¿Está cargado o es cargable el módulo vulnerable? |
| 4 | CONFIG_CRYPTO_AUTHENC (nuevo) | ¿Está CONFIG_CRYPTO_AUTHENC compilado como integrado (=y) o como módulo (=m)? Esta única opción compila tanto authenc como authencesn. Integrado significa que la mitigación de lista negra de modprobe no hace nada. |
| 5 | CONFIG_CRYPTO_USER_API_AEAD (nuevo) | ¿Está siquiera compilada la interfaz de usuario AEAD de AF_ALG? Si no, toda la ruta de explotación está cerrada en tiempo de compilación. |
| 6 | Socket AF_ALG | ¿Puede un usuario sin privilegios abrir uno ahora mismo? |
| 7 | Python os.splice | ¿Está disponible la ruta de explotación en Python puro? |
| 8 | Binarios setuid | Lista ampliada de objetivos setuid-root legibles presentes en el sistema. |
| 9 | Mitigaciones | AppArmor, SELinux, seccomp — ¿qué hay implementado? |
| 10 | Namespaces de usuario (nuevo) | ¿Están habilitados los namespaces de usuario sin privilegios? (No bloquea Copy Fail directamente, pero afecta a la superficie general de escalada de privilegios local.) |
| 11 | Transparent hugepages (nuevo) | Estado de THP — puede afectar a la alineación de la page cache y a la fiabilidad de la explotación. |
| 12 | Detección de entorno (nuevo) | Contexto Docker/contenedor/VM — los contenedores comparten el kernel del host; el host es lo que necesita el parche. |
| 13 | Advertencia de usuario root (nuevo) | Advierte si se ejecuta como root, ya que varias comprobaciones dan falsos positivos para root independientemente de las restricciones sin privilegios. |
El script de Bash cubre la misma lógica de detección principal pero omite tres elementos específicos de Python:
| # | Comprobación | Notas |
|---|---|---|
| 1 | Versión del kernel | |
| 2 | Presencia del parche | |
| 3 | Módulo algif_aead | |
| 4 | Socket AF_ALG | Usa Python como ayuda si está disponible; si no, recurre a la inferencia de configuración del kernel |
| 5 | Binarios setuid | Lista ampliada, igual que la versión de Python |
| 6 | Mitigaciones | AppArmor, SELinux, seccomp |
| 7 | CONFIG_CRYPTO_AUTHENC | |
| 8 | Namespaces de usuario | |
| 9 | Transparent hugepages | |
| 10 | Detección de entorno |
No presentes en el script de shell (frente a Python):
| Comprobación ausente | Motivo |
|---|---|
| CONFIG_CRYPTO_USER_API_AEAD | Aún no implementado — planificado |
| Disponibilidad de Python os.splice | No aplicable a un script de shell |
| Advertencia de usuario root | Aún no implementado — planificado |
Ninguno de los dos scripts arreglará ni explotará nada. Te dicen la verdad sobre tu sistema para que puedas actuar en consecuencia.
# Clona o descarga el script y luego:
python3 cve-2026-31431-detect.py
Eso es todo. Informe codificado por colores con un resumen al final.
El script sale con un código distinto de cero ante hallazgos de vulnerabilidad, lo que lo hace adecuado para su uso en pipelines:
| Código | Significado |
|---|---|
0 | No se encontraron condiciones vulnerables |
1 | Se encontraron una o más condiciones vulnerables |
# Ejemplo: fallar un paso de CI si el host es vulnerable
python3 cve-2026-31431-detect.py
rc=$?
if [ $rc -eq 1 ]; then
echo "VULNERABLE — bloquear despliegue"
elif [ $rc -ne 0 ]; then
echo "ERROR — el script no completó (salida $rc)"
fi
CVE-2026-31431 'Copy Fail' — Detección de vulnerabilidades
Corrupción de page cache de authencesn / escalada de privilegios local
Ejecutando como uid=1001, euid=1001
=== Versión del kernel ===
[VULNERABLE] Versión del kernel
Motivo : El kernel está en el rango vulnerable (4.10 – 6.14)
Detalle : Release: 6.12.0-124.45.1.el10_1 — debe confirmarse el estado del parche
=== CONFIG_CRYPTO_AUTHENC (Configuración del kernel) ===
[VULNERABLE] CONFIG_CRYPTO_AUTHENC
Motivo : Compilado como módulo (=m): se auto-carga en bind() de AF_ALG; la lista negra de modprobe es la mitigación correcta
=== CONFIG_CRYPTO_USER_API_AEAD (Configuración del kernel) ===
[VULNERABLE] CONFIG_CRYPTO_USER_API_AEAD
Motivo : La interfaz AEAD de AF_ALG es un módulo cargable — los usuarios sin privilegios pueden acceder al subsistema criptográfico mediante sockets AF_ALG
...
EL SISTEMA ES PROBABLEMENTE VULNERABLE A CVE-2026-31431