
Script para detectar la exposición a CVE-2026-31431 (Copy Fail) y sus mitigaciones en sistemas Linux: verificación del kernel, estado del módulo, parámetros de arranque, accesibilidad de AF_ALG y estado del parche de la distribución.
Scripts de shell para detectar vulnerabilidades del kernel de Linux, verificar el estado de mitigación y guiar la remediación — diseñados para ejecutarse localmente o en flotas mediante SSH, Ansible o pssh.
Copy Fail es una vulnerabilidad de escalada de privilegios local (LPE) de alta severidad en el módulo criptográfico algif_aead del kernel de Linux. Un fallo lógico introducido en 2017 permite que cualquier usuario local sin privilegios escriba 4 bytes controlados en la caché de páginas de cualquier archivo legible — suficiente para sobrescribir un binario setuid y obtener acceso root. Existe una prueba de concepto funcional de 732 bytes en Python disponible públicamente.
| CVE | CVE-2026-31431 |
| CVSS | 7.8 (Alta) |
| Divulgado | 29 de abril de 2026 |
| Afectados | Kernels de Linux 4.13 – 6.x (2017–2026) |
| Distribuciones | Ubuntu, RHEL, SUSE, Debian, Amazon Linux y la mayoría de las demás |
| Explotable remotamente | No — se requiere acceso local |
| Parche disponible | Parcial — consulte los avisos de su distribución |
| Comprobación | ¿Requiere root? |
|---|---|
| Versión del kernel — si está en el rango afectado (≥ 4.13) | No |
Módulo algif_aead — cargado, presente en disco o en lista negra | No |
Parámetros de arranque — presencia de initcall_blacklist=algif_aead_init | No |
| Accesibilidad de sockets AF_ALG — si la ruta de explotación está abierta | No |
| Estado de SELinux | No |
| Estado de AppArmor | Sí — solo salida parcial sin root |
| Estado del parche de la distribución — CVE listado en el changelog del kernel | No |
No se requiere root para ejecutar el script — todas las comprobaciones excepto el estado de AppArmor funcionan como usuario normal. Se recomienda ejecutarlo con
sudopara obtener resultados completos, y es la opción más segura al canalizar desdecurl.
El script está diseñado para funcionar en todas las principales distribuciones de Linux:
| Familia de distribución | Comprobación del gestor de paquetes | Ruta del módulo |
|---|---|---|
| Debian, Ubuntu | dpkg + changelog del kernel | /lib/modules/ |
| RHEL, CentOS, Amazon Linux | rpm (kernel, kernel-rt) | /lib/modules/ |
| SUSE, openSUSE | rpm (kernel-default) | /lib/modules/ |
| Arch Linux | pacman + enlace de aviso | /usr/lib/modules/ |
| Fedora | rpm + respaldo de /usr/lib/modules/ | /usr/lib/modules/ |
Requiere
bash— el script utiliza sintaxis específica de bash y no funcionará bajosh,ashodash. En Alpine Linux (que usa busybox ash por defecto), instale bash primero:apk add bash
Sin root — la mayoría de las comprobaciones funcionan:
curl -fsSL https://raw.githubusercontent.com/codesource/copyfail-check/main/check_copyfail.sh | bash
Con root — resultados completos incluido el estado de AppArmor:
curl -fsSL https://raw.githubusercontent.com/codesource/copyfail-check/main/check_copyfail.sh | sudo bash
Consejo: Fije un SHA de commit específico en producción para que el script no pueda cambiar sin su conocimiento:
curl -fsSL https://raw.githubusercontent.com/codesource/copyfail-check/COMMIT_SHA/check_copyfail.sh | sudo bash
curl -fsSL https://raw.githubusercontent.com/codesource/copyfail-check/main/check_copyfail.sh -o check_copyfail.sh
less check_copyfail.sh
bash check_copyfail.sh # sin root
sudo bash check_copyfail.sh # resultados completos
Bucle SSH
for HOST in server1 server2 server3; do
echo "=== $HOST ==="
ssh "$HOST" "curl -fsSL https://raw.githubusercontent.com/codesource/copyfail-check/main/check_copyfail.sh | sudo bash"
done
Ansible
- name: Check Copy Fail vulnerability
hosts: all
tasks:
- name: Run check script
script: check_copyfail.sh
become: yes
SSH paralelo
pssh -h hosts.txt -i \
"curl -fsSL https://raw.githubusercontent.com/codesource/copyfail-check/main/check_copyfail.sh | sudo bash"
============================================================
Copy Fail CVE-2026-31431 – Vulnerability Check
============================================================
>>> Kernel Version
[INFO] Running kernel: 5.15.0-107-generic
[WARN] Kernel 5.15.0-107-generic is in the affected range (4.13 – 6.x).
>>> algif_aead Module Status
[WARN] algif_aead module is currently LOADED — system is exploitable.
[WARN] Module file found at: /lib/modules/5.15.0-107-generic/kernel/crypto/algif_aead.ko
[WARN] algif_aead is NOT blacklisted — it can be loaded on demand.
>>> Kernel Boot Parameter Mitigation
[WARN] initcall_blacklist=algif_aead_init is NOT set in boot parameters.
>>> AF_ALG Socket Reachability
[WARN] AF_ALG sockets are reachable by this user — exploit path is open.
>>> Mandatory Access Control (SELinux / AppArmor)
[WARN] Neither SELinux nor AppArmor tools detected — no MAC layer present.
>>> Distribution Patch Status
[WARN] Could not confirm CVE-2026-31431 is listed as fixed in running kernel's changelog.
============================================================
SUMMARY
============================================================
!! LIKELY VULNERABLE — No confirmed mitigation detected.
Recommended actions (in order of preference):
1. Apply your distro's kernel update as soon as available.
2. Add to /etc/modprobe.d/copyfail.conf:
blacklist algif_aead
install algif_aead /bin/true
Then run: sudo depmod -a && sudo update-initramfs -u
3. Add to kernel boot parameters (grub):
initcall_blacklist=algif_aead_init
4. Immediately unload the module if loaded:
sudo rmmod algif_aead
============================================================
Aplíquelas en orden de preferencia:
1. Parchee su kernel (mejor solución)
# Debian / Ubuntu
sudo apt update && sudo apt upgrade linux-image-$(uname -r)
# RHEL / CentOS / Amazon Linux
sudo yum update kernel
# SUSE
sudo zypper update kernel-default
2. Ponga el módulo en lista negra (inmediato, persistente)
sudo tee /etc/modprobe.d/copyfail.conf << 'EOF'
blacklist algif_aead
install algif_aead /bin/true
EOF
sudo depmod -a
# Debian/Ubuntu
sudo update-initramfs -u
# RHEL/Fedora
sudo dracut -f
3. Descargue el módulo ahora (inmediato, no persistente entre reinicios)
sudo rmmod algif_aead
4. Parámetro de arranque del kernel (alternativa a la lista negra)
Añada initcall_blacklist=algif_aead_init a su configuración de GRUB y reinicie.
MIT — uso libre, sin garantía implícita. Revise siempre los scripts antes de ejecutarlos como root.