
Detectar y mitigar CVE-2026-31431 (Copy Fail) en sistemas Linux.
Una CLI de Python sin dependencias que comprueba si un host Linux parece expuesto a CVE-2026-31431 ("Copy Fail") sin ejecutar un exploit. También puede aplicar una mitigación temporal conservadora cuando el componente afectado se puede cargar como módulo del kernel. Compatible con Debian/Ubuntu, RHEL/Rocky/AlmaLinux, Fedora y SUSE.
pip install copyfail-guard
copyfail-guard
CVE-2026-31431 es un error lógico en la interfaz del kernel algif_aead (socket AF_ALG AEAD)
que permite a un usuario local sin privilegios realizar una escritura controlada de 4 bytes
en la caché de páginas de cualquier archivo legible, lo que conduce a una escalada de privilegios a root.
CVSS 7.8, presente desde el kernel 4.14, corregido en las versiones estables a partir de abril de 2026.
Existe un exploit público y la vulnerabilidad está listada en CISA KEV.
Algunas comprobaciones de vulnerabilidades se reducen a "ejecutar el exploit y ver si funciona". Eso no es algo recomendable en hosts de producción. copyfail-guard adopta un enfoque sin exploit. No intenta desencadenar el error, modificar binarios setuid ni demostrar la explotabilidad. En su lugar, inspecciona el estado del host (versión del kernel, estado de carga del módulo, configuración de modprobe) e informa si la máquina parece expuesta.
| Subcomando | Acción |
|---|---|
detect | Combina cinco señales (versión del kernel, /proc/modules, modules.builtin, modules.dep, configuración de modprobe) en uno de seis veredictos |
fix | Escribe atómicamente una regla de modprobe install algif_aead /bin/false e intenta descargar algif_aead |
reset | Elimina la regla de modprobe instalada por fix (ejecutar después de actualizar a un kernel parcheado) |
fix es intencionalmente mínimo — no llama a tu gestor de paquetes.
La remediación permanente requiere actualizar el kernel mediante el mecanismo de
actualización normal de tu distribución.
pip install copyfail-guard
O ejecutar directamente desde un checkout sin instalar:
PYTHONPATH=src python3 -m copyfail_guard detect
copyfail-guard [--json] [--dry-run] [--quiet] [detect | fix | reset]
$ copyfail-guard
[copyfail-guard] CVE-2026-31431 (Copy Fail) — VULNERABLE
Distribución: Ubuntu 24.04.1 LTS (familia debian)
Kernel: 6.8.0-50-generic (rama 6.12, corregido en 6.12.85)
Módulo: algif_aead — cargado como .ko
Mitigación: ninguna
Acciones recomendadas:
1. Aplicar la mitigación ahora:
sudo copyfail-guard fix
2. Actualizar el kernel para una corrección permanente:
Actualiza el kernel de este sistema a 6.12.85 o posterior (lo que
distribuya tu distribución una vez que haya integrado la corrección de CVE-2026-31431), y reinicia.
Siempre previsualiza con --dry-run antes de aplicar:
$ sudo copyfail-guard --dry-run fix
[copyfail-guard] fix (dry-run) — OK
[ ok ] Comprobaciones previas (Linux, host, root)
[skip] Escribiría la lista negra de modprobe [/etc/modprobe.d/cve-2026-31431-copyfail-guard.conf]
[skip] Intentaría descargar algif_aead (no cargado actualmente) [algif_aead]
[skip] Añadiría registro de auditoría [/var/log/copyfail-guard.log]
$ sudo copyfail-guard fix
[copyfail-guard] fix — OK
[ ok ] Comprobaciones previas (Linux, host, root)
[ ok ] Lista negra de modprobe escrita [/etc/modprobe.d/cve-2026-31431-copyfail-guard.conf]
[ ok ] algif_aead descargado [algif_aead]
[ ok ] Registro de auditoría añadido [/var/log/copyfail-guard.log]
Siguiente paso para una corrección permanente:
Actualiza el kernel a una versión parcheada de CVE-2026-31431 usando el
mecanismo de actualización normal de tu distribución y reinicia.
Si el módulo está actualmente en uso, el paso de descarga puede fallar. En ese caso, la regla persistente de modprobe aún puede instalarse correctamente, y copyfail-guard informará del fallo de descarga como un registro de acción de tipo advertencia en lugar de fingir que el módulo fue eliminado.
--json emite un documento estructurado en stdout, adecuado para pipelines de jq, Ansible o SOAR:
$ copyfail-guard --json | jq .verdict
"vulnerable"
$ copyfail-guard --json | jq '{verdict, kernel: .kernel.patched_threshold}'
{
"verdict": "vulnerable",
"kernel": "6.12.85"
}
| Código | Significado |
|---|---|
0 | Seguro — el veredicto es patched, mitigated o not_applicable; o el paso de corrección persistente se completó correctamente |
1 | Vulnerable — el veredicto es vulnerable o unmitigable_builtin |
2 | Error — no se pudo determinar el estado, se rechazó una condición previa o falló el paso de corrección persistente |
| Veredicto | Descripción |
|---|---|
patched | El kernel en ejecución está en o más allá de la versión corregida |
mitigated | El kernel es vulnerable pero algif_aead está bloqueado por la configuración de modprobe |
not_applicable | El kernel es vulnerable pero algif_aead no está presente en este sistema |
vulnerable | El kernel es vulnerable, el módulo es cargable, no hay mitigación implementada |
unmitigable_builtin | algif_aead está compilado en la imagen del kernel — la mitigación de modprobe no tiene efecto; se requiere actualización del kernel |
unknown | No se pudo analizar la versión del kernel o está fuera del rango evaluado |
Después de actualizar a un kernel parcheado, usa el subcomando reset para eliminar la
regla de modprobe instalada por fix:
$ sudo copyfail-guard --dry-run reset
[copyfail-guard] reset (dry-run) — OK
[skip] Eliminaría /etc/modprobe.d/cve-2026-31431-copyfail-guard.conf
$ sudo copyfail-guard reset
[copyfail-guard] reset — OK
[ ok ] Eliminado /etc/modprobe.d/cve-2026-31431-copyfail-guard.conf
Reinicia para permitir que algif_aead se cargue nuevamente si es necesario.
reset es idempotente — si el archivo ya está ausente, sale con 0 y un
mensaje de "nada que hacer". Luego reinicia.
Contenedores. fix se niega a ejecutarse dentro de un contenedor porque /proc/modules
refleja el kernel del host pero el contenedor no tiene autoridad para cargar o descargar
módulos. Ejecuta copyfail-guard directamente en el host.
algif_aead integrado. Algunos kernels compilan algif_aead directamente en la
imagen (CONFIG_CRYPTO_USER_API_AEAD=y). La mitigación de modprobe no tiene efecto en
esta configuración; la única remediación es una actualización del kernel. detect informa
unmitigable_builtin en este caso. Ejecutar fix aún instalará la regla de modprobe
(que evita que cualquier copia cargable coexistente se cargue) pero la instancia integrada
no se ve afectada — la actualización del kernel y el reinicio son el único remedio real.
blacklist vs install … /bin/false. Ambas directivas bloquean la carga automática
ordinaria, pero install algif_aead /bin/false es más fuerte porque también bloquea
las invocaciones explícitas ordinarias de modprobe algif_aead. Un administrador con
privilegios suficientes aún puede eludir la política de modprobe, por ejemplo usando
herramientas de carga de módulos de bajo nivel o banderas especiales de modprobe. copyfail-guard siempre
instala la forma más fuerte. Si tu sistema ya tiene una directiva blacklist simple,
la herramienta informa mitigated pero emite una nota recomendando la actualización.
SELinux/AppArmor. Las escrituras en /etc/modprobe.d/ en RHEL normalmente heredan
system_u:object_r:modules_conf_t:s0 del directorio padre, por lo que normalmente no se
necesita un reetiquetado manual para el archivo que escribe copyfail-guard.
initramfs. algif_aead normalmente no se incluye en la imagen de arranque en las
principales distribuciones, por lo que copyfail-guard no ejecuta update-initramfs -u ni
dracut -f después de instalar la regla de modprobe. Si tu distribución o compilación
local incluye algif_aead en initramfs, sigue las pautas de kernel/módulos de tu
distribución.
Apache 2.0 — consulta LICENSE.