
Escáner automatizado y asistente de parcheo para CVE-2026-31431, que detecta hosts Linux vulnerables a través de SSH, verifica versiones del kernel y aplica actualizaciones del kernel o mitigaciones temporales en múltiples distribuciones.
Copy Fail es un escáner de seguridad automático y asistente de parche para detectar y corregir la vulnerabilidad CVE-2026-31431 (Escalada de Privilegios Local en el Kernel de Linux algif_aead) en su infraestructura Linux.
CVE-2026-31431 es una vulnerabilidad de Escalada de Privilegios Local (LPE) en el módulo del kernel de Linux algif_aead (Interfaz de Cifrado Asíncrono para AEAD). Esta vulnerabilidad permite a un usuario local alcanzar una escalada de privilegios a nivel de root.
Esta herramienta ayuda a:
Nota: Esta herramienta es solo para fines de auditoría y parcheo interno por parte de administradores de sistemas. Úsela únicamente en sistemas que posea o para los que tenga autorización.

algif_aead (cargado/no cargado)Actualización automática del kernel en hosts vulnerables a través del gestor de paquetes:
Opción: Reinicio automático después del parcheo
algif_aead mediante la configuración modprobe.dBase de datos de versiones de kernel ya parcheadas para:
paramiko>=3.0.0 # Biblioteca SSH
rich>=13.0.0 # Interfaz de terminal atractiva
git clone https://github.com/gagaltotal/cve-2026-31431-copy-fail.git
cd cve-2026-31431-copy-fail
python3 -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt
o instalar manualmente:
pip install paramiko>=3.0.0 rich>=13.0.0
python3 copyfail_scanner.py --help
# Escanear subred con clave SSH
python3 copyfail_scanner.py --subnet <CIDR> --user <USERNAME> --key <PATH_TO_KEY>
# Escanear varios hosts específicos
python3 copyfail_scanner.py --hosts <IP1>,<IP2>,<IP3> --user <USERNAME> [--password <PASSWORD>]
# Escanear + parcheo automático
python3 copyfail_scanner.py --subnet <CIDR> --user <USERNAME> --key <PATH> --patch
# Escanear + mitigación temporal
python3 copyfail_scanner.py --subnet <CIDR> --user <USERNAME> --key <PATH> --mitigate
| Opción | Descripción | Ejemplo |
|---|---|---|
--subnet | Subred CIDR objetivo (mutuamente excluyente con --hosts) | --subnet 192.168.1.0/24 |
--hosts | Lista de IPs separadas por comas (mutuamente excluyente con --subnet) | --hosts 192.168.1.10,192.168.1.20 |
--user | Nombre de usuario SSH (obligatorio) | --user root |
--password | Contraseña SSH (opcional, usar si no hay clave) | --password secret123 |
--key | Ruta de la clave privada SSH | --key ~/.ssh/id_rsa |
--port | Puerto SSH (predeterminado: 22) | --port 2222 |
--threads | Número de hilos paralelos (predeterminado: 30) | --threads 50 |
--patch | Actualización automática del kernel en hosts vulnerables | --patch |
--reboot | Reinicio automático después del parcheo (usar con --patch) | --patch --reboot |
--mitigate | Aplicar mitigación temporal (desactivar algif_aead) | --mitigate |
--output | Exportar resultados del escaneo a un archivo JSON | --output resultados.json |
--yes | Omitir la solicitud de confirmación antes de parchear/mitigar | --yes |
python3 copyfail_scanner.py \
--subnet 192.168.1.0/24 \
--user ubuntu \
--key ~/.ssh/id_rsa
Salida: Muestra la tabla de resultados del escaneo y el resumen
python3 copyfail_scanner.py \
--hosts 10.0.1.5,10.0.1.6,10.0.1.7 \
--user admin \
--password my_password123
python3 copyfail_scanner.py \
--subnet 172.16.0.0/16 \
--user root \
--key ~/.ssh/id_rsa \
--mitigate
Acción: Escanea todos los hosts y luego desactiva el módulo algif_aead en los hosts vulnerables (solicita confirmación)
python3 copyfail_scanner.py \
--subnet 192.168.0.0/24 \
--user ubuntu \
--key ~/.ssh/id_rsa \
--patch
Acción: Actualiza el kernel, pero no reinicia automáticamente (requiere reinicio manual)
python3 copyfail_scanner.py \
--subnet 10.10.0.0/24 \
--user root \
--key ~/.ssh/id_rsa \
--patch \
--reboot \
--yes
Acción: Escanea, parchea el kernel, reinicia automáticamente y omite la confirmación
python3 copyfail_scanner.py \
--subnet 192.168.1.0/24 \
--user sysadmin \
--key ~/.ssh/id_rsa \
--output scan_results_$(date +%Y%m%d_%H%M%S).json
Salida: Tabla en la terminal + resultados JSON en el archivo
python3 copyfail_scanner.py \
--subnet 10.0.0.0/25 \
--user ubuntu \
--key ~/.ssh/id_rsa \
--port 2222 \
--threads 50
Ejemplo de salida del escaneo:
┏━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━┳━━━━━━━━━┳━━━━━━━━━┳━━━━━━━━━┳━━━━━━━━━━━┓
┃ IP ┃ Hostname ┃ Distro ┃ Kernel ┃ algif ┃ Status ┃ Action ┃ Notes ┃
┣━━━━━━━━━━━━━━━╋━━━━━━━━━━━━━━━━╋━━━━━━━━━━━━━━━╋━━━━━━━━━━━━━━━╋━━━━━━━━━╋━━━━━━━━━╋━━━━━━━━━╋━━━━━━━━━┫
┃ 192.168.1.10 ┃ web-01 ┃ Ubuntu 22.04 ┃ 6.8.0-60 ┃ LOADED ┃ ✓ SEGURO ┃ - ┃ Parcheado ┃
┃ 192.168.1.11 ┃ web-02 ┃ Ubuntu 20.04 ┃ 5.4.0-200 ┃ NOT_LDD ┃ ✗ VULNER ┃ Parcheado ┃ - ┃
┃ 192.168.1.12 ┃ db-01 ┃ RHEL 8.9 ┃ 5.14.0-560 ┃ LOADED ┃ ? DESCON ┃ - ┃ Distro ┃
┗━━━━━━━━━━━━━━━┻━━━━━━━━━━━━━━━━┻━━━━━━━━━━━━━━━┻━━━━━━━━━━━━━━━┻━━━━━━━━━┻━━━━━━━━━┻━━━━━━━━━┻━━━━━━━━━┛
Resumen:
Total de hosts escaneados: 12
Accesibles (SSH): 11
Sin conexión: 1
VULNERABLES: 2
Ya parcheados: 8
Estado desconocido: 1
hostname -funame -r){
"cve": "CVE-2026-31431",
"scan_time": "2026-05-08T15:30:45.123456",
"results": [
{
"ip": "192.168.1.10",
"ssh_reachable": true,
"auth_ok": true,
"hostname": "web-01",
"distro": "Ubuntu 22.04 LTS",
"os_id": "ubuntu",
"kernel_version": "6.8.0-60-generic",
"algif_loaded": true,
"modprobe_blocked": false,
"patched": true,
"patch_applied": false,
"mitigation_applied": false,
"retry_count": 0,
"error": ""
}
]
}
El escáner admite la detección automática de las siguientes distribuciones:
| Distribución | Gestor de Paquetes | Versiones de Kernel Parcheadas | Notas |
|---|---|---|---|
| Ubuntu | apt | 6.8.0-60, 5.15.0-130, 5.4.0-216 | LTS y actual |
| Debian | apt | 6.1.137, 5.10.235 | Versiones estables |
| RHEL | dnf/yum | 5.14.0-570 | Incluye CentOS Stream |
| AlmaLinux | dnf | 5.14.0-570 | Reemplazo directo de RHEL |
| Rocky | dnf | 5.14.0-570 | Enfocado a empresas |
| Fedora | dnf | 6.14.4, 6.13.12, 6.12.25 | Vanguardia |
| Amazon Linux | dnf | 6.1.134, 5.10.235, 4.14.353 | Compatibilidad AWS |
| SUSE / openSUSE | zypper | 6.4.0-18, 5.14.21-150600.24 | Empresarial y comunitaria |
| Arch Linux | pacman | 6.14.4 | Última versión |
Para distribuciones no detectadas: Verifique la versión del kernel manualmente. Los kernels >= 6.14.4 generalmente son seguros.
Si prefiere el parcheo manual o el parcheo automático falla, siga la guía por distribución:
sudo apt update
sudo apt upgrade linux-image-generic kmod
sudo reboot
sudo dnf clean metadata
sudo dnf upgrade kernel
sudo reboot
sudo dnf upgrade kernel
sudo reboot
sudo dnf upgrade kernel
sudo reboot
sudo zypper update kernel-default
sudo reboot
sudo pacman -Syu linux linux-headers
sudo reboot
Si no puede reiniciar de inmediato para la actualización del kernel, aplique la mitigación:
# Desactivar el módulo algif_aead mediante modprobe.d
echo 'install algif_aead /bin/false' | sudo tee /etc/modprobe.d/disable-algif_aead.conf
# Descargar el módulo si ya está cargado
sudo rmmod algif_aead 2>/dev/null || echo "Module not loaded"
IMPORTANTE:
CONFIG_CRYPTO_USER_API_AEAD=y, el módulo está integrado en el kernel, por lo que modprobe.d no es efectivo → la actualización del kernel es la única soluciónError: Puerto SSH no abierto
Solución:
nc -zv <IP> 22--port si SSH se ejecuta en un puerto personalizadoError: Autenticación SSH fallida
Solución:
chmod 600 ~/.ssh/id_rsassh -i ~/.ssh/id_rsa user@host--password si prefiere la autenticación por contraseñaExit code 1: dpkg: error processing...
Solución:
sudo visudoapt/dnf/yum sin solicitud de contraseñaRetry: 3x | Host temporary unavailable
Solución:
--threads 10Status: ? DESCONOCIDO
Solución:
uname -r y compare con el avisoExit code 1: Failed to lock apt database
Solución:
sudo tail -f /var/log/apt/term.logSolo para Uso Interno — Esta herramienta es solo para fines de auditoría y gestión de parches por parte de administradores de sistemas autorizados.
DESCARGO DE RESPONSABILIDAD:
- Úsela solo en sistemas que posea o para los que tenga autorización explícita de acceso
- El parcheo automático y el reinicio pueden causar tiempo de inactividad
- Pruebe en un entorno de ensayo antes del despliegue en producción
- Asegúrese de tener copias de seguridad antes de parchear
- El desarrollador no es responsable de la pérdida de datos ni de la interrupción del servicio
Autor: GagalTotal
Repositorio: https://github.com/gagaltotal/cve-2026-31431-copy-fail
Contacto: ghostgtr666
Para informes de errores, solicitudes de funciones o preguntas:
Última Actualización: 8 de mayo de 2026
Versión del Escáner: 1.0