
Verificador Bash de solo lectura para la vulnerabilidad Copy Fail del kernel de Linux (CVE-2026-31431)
Un pequeño script Bash con pocas dependencias que te indica si tu sistema Linux está expuesto a la vulnerabilidad de escalada de privilegios local Copy Fail (CVE-2026-31431).
El script es de solo lectura: nunca explota el fallo, nunca carga módulos del kernel y nunca modifica el sistema.
Copy Fail es un error de lógica en la plantilla criptográfica AEAD authencesn del kernel de Linux, accesible desde el espacio de usuario a través de la interfaz de socket AF_ALG (algif_aead).
| Campo | Valor |
|---|---|
| CVE | CVE-2026-31431 |
| Divulgado | 2026-04-29 |
| CVSS v3.1 | 7.8 (Alto) |
| Clase | Escalada de Privilegios Local |
| Componente afectado | crypto/authencesn + crypto/algif_aead |
| Introducido en | 2017 (optimización AEAD in-place en algif_aead.c) |
| Corrección principal | commit a664bf3d603d, fusionado 2026-04-01 |
Un usuario local sin privilegios puede desencadenar una escritura controlada y determinista de 4 bytes en la caché de página de cualquier archivo que pueda leer. Una prueba de concepto pública (732 bytes de Python) utiliza esta primitiva para sobrescribir un binario setuid y obtener acceso root en prácticamente todas las distribuciones principales lanzadas desde 2017.
Toda distribución de Linux que incluya un kernel compilado desde 2017 con algif_aead habilitado. Las familias confirmadas afectadas incluyen:
# Download the script
curl -fsSLO https://raw.githubusercontent.com/samanzamani/copy-fail-checker/main/check-copy-fail.sh
# Make it executable
chmod +x check-copy-fail.sh
# Run it
./check-copy-fail.sh
O clonar el repositorio:
git clone https://github.com/samanzamani/copy-fail-checker.git
cd copy-fail-checker
./check-copy-fail.sh
El script no requiere root. Ejecutarlo como usuario normal proporciona la visión más realista de la superficie de ataque, porque ese es exactamente el contexto que tendría un atacante.
El script ejecuta tres comprobaciones independientes y las combina en un único veredicto.
Lee /etc/os-release y uname -r, luego compara tu kernel en ejecución con la versión oficial corregida publicada por el equipo de seguridad de tu distribución. La tabla de versiones actualmente cubre:
Si tu distribución no está en la tabla, el script recurre a las comprobaciones de tiempo de ejecución a continuación.
algif_aeadEl script inspecciona cuatro cosas sin modificar nada:
lsmod)modinfo)/etc/modprobe.d, /usr/lib/modprobe.d o /run/modprobe.d/boot/config-<uname> o /proc/config.gzUn módulo en lista negra, no cargado y no incluido en el kernel cierra la superficie de ataque incluso en un kernel sin parchear.
AF_ALGLa señal más fiable es lo que un atacante vería realmente. El script utiliza una pequeña sonda Python (socket.socket(AF_ALG, SOCK_SEQPACKET, 0) seguido de bind() a la plantilla AEAD authencesn(hmac(sha256),cbc(aes))) para determinar si los sockets AF_ALG pueden crearse y enlazarse desde un contexto sin privilegios. La sonda crea, enlaza y cierra inmediatamente el socket sin dejar nada explotable.
Si python3 no está instalado, la sonda se omite y el veredicto se basa en las comprobaciones 1 y 2.
Para pipelines, gestión de configuración o escaneo de flotas, pase --json:
./check-copy-fail.sh --json
Ejemplo de salida:
{
"verdict": "vulnerable",
"distro_id": "ubuntu",
"distro_version_id": "24.04",
"kernel": "6.8.0-31-generic",
"patched_version": "",
"kernel_status": "unknown",
"module_loaded": 0,
"module_builtin": 0,
"module_available": 1,
"module_blacklisted": 0,
"af_alg_status": "reachable"
}
Esta es la única solución completa. Después de actualizar, reinicia para que el nuevo kernel esté realmente en ejecución.
# Debian / Ubuntu
sudo apt update && sudo apt full-upgrade && sudo reboot
# RHEL / AlmaLinux / Rocky / CentOS Stream
sudo dnf clean metadata && sudo dnf upgrade && sudo reboot
# openSUSE / SLES
sudo zypper refresh && sudo zypper update && sudo reboot
# Amazon Linux 2023
sudo dnf upgrade --releasever=latest && sudo reboot
algif_aeadSi no puedes reiniciar ahora mismo en un kernel parcheado, pon en lista negra el módulo vulnerable. Esto rompe cualquier aplicación que use legítimamente cifrados AEAD de AF_ALG (raro en la mayoría de servidores — verifica primero en un entorno de pruebas).
# Persist the blacklist across reboots
echo "install algif_aead /bin/false" | sudo tee /etc/modprobe.d/disable-algif-aead.conf
# Unload it from the running kernel right now
sudo rmmod algif_aead 2>/dev/null || true
Si el módulo está incluido en el kernel, la lista negra no funcionará, pero es posible deshabilitar la initcall. Es necesario reiniciar.
sudo grubby --update-kernel=ALL --args="initcall_blacklist=algif_aead_init"
sudo reboot
Para cargas de trabajo contenerizadas, bloquea también la familia de sockets AF_ALG desde tu perfil seccomp para que un contenedor comprometido no pueda alcanzar la superficie del kernel.
== System information ==
[INFO] Distribution : Ubuntu 24.04.2 LTS (ubuntu 24.04)
[INFO] Kernel : 6.8.0-31-generic
== Check 1 / 3 — Kernel version ==
[WARN] No vendor-fixed kernel version is recorded for ubuntu 24.04.
[WARN] Falling back to runtime mitigation checks below.
== Check 2 / 3 — algif_aead kernel module ==
[WARN] algif_aead is not loaded but can be autoloaded on demand (no blacklist found).
== Check 3 / 3 — AF_ALG socket reachability ==
[VULN] AF_ALG sockets are reachable from this unprivileged context.
== Verdict ==
[VULN] This system appears to be VULNERABLE to CVE-2026-31431.
[VULN] Apply the vendor kernel update or blacklist algif_aead as a temporary mitigation.
uname -r. Si estás ejecutando un kernel fuera del árbol o recompilado, la comparación de versiones puede no reflejar si la corrección fue realmente retroportada.blocked_permission para AF_ALG simplemente porque seccomp está activo — el kernel del host mismo puede seguir siendo vulnerable.MIT — usa, modifica y distribuye libremente. Sin garantía.
| Distribución | Kernel corregido (≥) |
|---|
| AlmaLinux / RHEL / Rocky / CentOS 8 | 4.18.0-553.121.1.el8_10 |
| AlmaLinux / RHEL / Rocky / CentOS 9 | 5.14.0-611.49.2.el9_7 |
| AlmaLinux / RHEL / Rocky / CentOS 10 | 6.12.0-124.52.2.el10_1 |
| Ubuntu 26.04+ ("Resolute") | no afectado |
| Ubuntu 18.04 – 25.10 | continuo, consulte apt |
| Debian (todos los conjuntos) | continuo, consulte DSA |
| Veredicto | Código de salida | Significado |
|---|
parcheado | 0 | El kernel en ejecución está en o por encima de la versión corregida del proveedor. |
mitigado | 0 | AF_ALG está bloqueado y el módulo no está cargado. |
probablemente_mitigado | 0 | El módulo está en lista negra y no cargado; no fue posible una sonda en vivo. |
vulnerable | 1 | El kernel no tiene parche y algif_aead / AF_ALG es accesible. |
desconocido | 2 | No hay suficiente información para decidir. Tratar como potencialmente vulnerable. |
no_aplicable | 3 | No se ejecuta en Linux. |