
Herramientas de detección y mitigación para CVE-2026-31431 (Copy Fail) en kernels Linux. Incluye scripts de Phalanx-CCS y Silent4Labs, además de un playbook de Ansible para aplicar mitigación temporal (bloquear el módulo algif_aead o parámetro de arranque) en servidores.
Este paquete proporciona una solución automatizada para detectar y mitigar la vulnerabilidad CVE-2026-31431 (conocida como Copy Fail) en sistemas Linux con kernel afectado (versiones 4.14 a 6.12.84, 6.13 a 6.18.21, etc.).
La herramienta consta de:
mitigate_copyfail.sh) que:
CONFIG_CRYPTO_USER_API_AEAD=m|y).=m): crea /etc/modprobe.d/disable-algif-aead.conf con install algif_aead /bin/false y descarga el módulo ().rmmod=y): añade el parámetro de arranque initcall_blacklist=algif_aead_init (requiere reinicio).mitigation.yml) que:
Nota importante: La mitigación es temporal. La solución definitiva es actualizar el kernel a una versión que incluya el parche
a664bf3d603d(≥6.18.22, ≥6.19.12 o ≥7.0).
become: yes)sudo (para aplicar la mitigación)Los scripts de detección (Phalanx-CCS y Silent4Labs) son seguros y no explotan la vulnerabilidad; solo verifican la superficie de ataque.
cve-2026-31431-mitigation/
├── README.md
├── scripts/
│ ├── mitigate_copyfail.sh # Script unificado (detección + mitigación)
│ ├── check_copyfail.py # Phalanx-CCS (reachability checker)
│ └── check-copyfail.sh # Silent4Labs (risk assessment)
├── ansible/
│ ├── ansible.cfg # (opcional) Configuración de Ansible
│ ├── inventory.ini # Inventario de servidores
│ └── mitigation.yml # Playbook principal
└── resultados_cve/ # Carpeta generada automáticamente con los logs
git clone https://github.com/tu-usuario/cve-2026-31431-mitigation.git
cd cve-2026-31431-mitigation/ansible
inventory.ini)Ejemplo para un servidor remoto:
[servidores]
server1 ansible_host=192.168.1.10 ansible_user=root
[localhost]
localhost ansible_connection=local
[all:vars]
ansible_become=yes
# ansible_become_password=mi_clave # si no se usa sudo sin contraseña
En mitigation.yml, la tarea Copiar scripts al remoto utiliza src: "../scripts/{{ item }}". Asegúrate de que la ruta relativa es correcta o modifícala según tu estructura.
Desde el directorio ansible/:
ansible-playbook -i inventory.ini mitigation.yml -k -K
-k solicita la contraseña SSH.-K solicita la contraseña de become (sudo).Si se usa localhost con ansible_connection=local, no se necesita SSH.
El playbook muestra un resumen en texto plano similar a:
==========================================
RESULTADOS POST-MITIGACIÓN
==========================================
Host: server1
------------------------------------------
- Estado: SISTEMA SEGURO
- Código: (no aplica)
------------------------------------------
- Puntuación final: 40 / 100
- Nivel de riesgo: MEDIUM
==========================================
Además, se genera un archivo de log en resultados_cve/<hostname>_mitigation.log con la salida completa del script (fecha, versión del kernel, mensajes de detección, etc.).
Si los valores extraídos aparecen como ? o No detectado, activa las tareas de depuración en mitigation.yml:
when: true en las tres tareas de DEPURACIÓN (o pon when: true para ver clean_stdout y la salida de los regex).Edita las tareas Crear directorio local para resultados y Guardar salida completa en archivo local:
path: /ruta/absoluta/resultados_cve
dest: "/ruta/absoluta/resultados_cve/{{ inventory_hostname }}_mitigation.log"
Comenta las tareas de copiado y ajusta la ruta en Ejecutar script de mitigación para que apunte a la ubicación existente.
Cambia when: false por when: true en la última tarea (Limpiar scripts remotos).
initcall_blacklist) requiere un reinicio para ser efectiva. El playbook no reinicia automáticamente; se debe planificar una ventana de mantenimiento.CONFIG_CRYPTO_USER_API_AEAD=y (kernel built‑in), el módulo no puede descargarse con rmmod; la única vía es el parámetro de arranque./proc/crypto y /boot/config-*; se ejecutan con become: yes.Este proyecto se distribuye bajo licencia MIT. Los scripts de terceros (Phalanx-CCS, Silent4Labs) conservan sus respectivas licencias.
Si esta herramienta te ha sido útil, ¡dale una estrella en GitHub!