
Herramienta de detección y mitigación de vulnerabilidades para los bugs Copy Fail y Dirty Frag (CVE-2026-31431, CVE-2026-43284, CVE-2026-43500)
| CVE | Nombre | Módulos afectados |
|---|
| CVE-2026-31431 | Copy Fail | algif_aead |
| CVE-2026-43284 | Dirty Frag (IPsec) | esp4, esp6, ipcomp4, ipcomp6, xfrm_user |
| CVE-2026-43500 | Dirty Frag (RxRPC) | rxrpc, kafs |
Para cada módulo afectado, vcheck informa si está cargado actualmente, integrado en el kernel en ejecución, si tiene rastros pasados en los registros del kernel, si hay sockets AF_ALG activos (solo Copy Fail) y si ya está en la lista negra en /etc/modprobe.d/.
Con -fix, vcheck informa el estado inicial, escribe un fragmento cve-XXXX-XXXXX-disable.conf para cualquier módulo que aún no esté en la lista negra, luego vuelve a ejecutar las comprobaciones e informa el estado final. Con -fix -unload, vcheck también intenta descargar los módulos afectados que estaban cargados antes de la corrección, luego usa el análisis final para verificar si aún están cargados. Con -fix -rebuild-initramfs, vcheck reconstruye el initramfs para el kernel actualmente en ejecución (solamente) después de escribir un fragmento, de modo que la lista negra quede incorporada en la imagen de arranque siguiente. Las entradas de kernel anteriores conservan su initramfs original como respaldo.
-fix solo después de una ejecución de solo verificaciónEjecute siempre vcheck sin -fix primero. Lea el informe y confirme que los módulos afectados son seguros de deshabilitar en este host antes de volver a ejecutar con -fix. Deshabilitar módulos del kernel de los que dependen cargas de trabajo legítimas puede afectar a los usuarios y romper aplicaciones.
En particular:
-fix como seguro solo cuando ninguno de los módulos afectados esté actualmente cargado, es decir, cada módulo se reporte como mitigado o módulo no en lista negra (sin líneas VULNERABLE o en lista negra pero actualmente cargado). Un módulo cargado casi siempre significa que algo en el host lo está usando activamente; verifique eso antes de ponerlo en la lista negra.esp4, esp6, ipcomp4, ipcomp6, xfrm_user) son necesarios para cualquier implementación de IPsec/strongSwan/WireGuard-over-IPsec/IKE. Los módulos ipcomp4/ipcomp6 implementan la compresión de carga útil IPComp y pueden ser auto-negociados como parte de una SA IPsec incluso cuando no están configurados explícitamente. No ponga en la lista negra ninguno de ellos en una puerta de enlace VPN, un punto final IPsec, o en cualquier lugar donde ip xfrm policy devuelva reglas. Tenga en cuenta que el módulo del framework xfrm_algo está intencionalmente no en esta lista — según la guía de los proveedores (Red Hat, Ubuntu, AWS), bloquear los módulos de protocolo ESP e IPComp más la interfaz de configuración netlink xfrm_user es suficiente, y poner en la lista negra xfrm_algo rompería cualquier otra transformación xfrm sin beneficio adicional.rxrpc, kafs) son necesarios para cualquier host que monte sistemas de archivos AFS. Deshabilitarlos romperá esos montajes en el próximo arranque.algif_aead expone la criptografía del kernel a través de la familia de sockets AF_ALG. Rara vez es usado directamente por código de aplicación, pero verifique listando los sockets activos (ss -p --af-alg) y comprobando los consumidores en espacio de usuario antes de ponerlo en la lista negra.Los fragmentos de lista negra que escribe vcheck solo surten efecto en el momento de carga del módulo (típicamente en el próximo arranque, o modprobe -r <módulo> mientras el sistema está inactivo). Un módulo que ya está cargado seguirá funcionando incluso después de -fix — vcheck reportará esto como en lista negra pero actualmente cargado; ejecute 'modprobe -r' o reinicie. Pasar -unload con -fix le pide a vcheck que ejecute modprobe -r para los módulos afectados cargados después de escribir los fragmentos de lista negra. Úselo solo cuando haya confirmado que los módulos son seguros de eliminar del kernel en ejecución.
Pasar -rebuild-initramfs con -fix regenera el initramfs solo para el kernel actualmente en ejecución (update-initramfs -u -k $(uname -r) en Debian/Ubuntu, dracut -f --kver $(uname -r) en RHEL/Fedora). Otros kernels instalados mantienen su initramfs existente intacto, por lo que si algo sale mal después de reiniciar, puede seleccionar una entrada de kernel anterior desde el menú de arranque y recuperarse. Las futuras instalaciones de kernel reconstruyen su propio initramfs a partir del estado actual de /etc/modprobe.d/, por lo que la lista negra se propaga automáticamente sin necesidad de volver a ejecutar vcheck. Si no está presente ni update-initramfs ni dracut (por ejemplo, Arch, Alpine, imágenes inmutables), vcheck advierte y continúa — reconstruya manualmente con la herramienta de la distribución antes de reiniciar.
La reconstrucción puede tardar varios minutos (especialmente dracut en hosts con muchos controladores), lo que excedería el tiempo de espera de diagnóstico -command-timeout. Se ejecuta bajo su propio -initramfs-timeout (por defecto 10m) para que la reconstrucción tenga el tiempo que necesita mientras que las comprobaciones rápidas mantienen su presupuesto ajustado. Aumente -initramfs-timeout para hardware lento, o pase 0 para deshabilitar el tiempo de espera por completo. Durante los comandos remotos de larga duración, vcheck envía solicitudes de keepalive SSH cada 30s por defecto para evitar que los temporizadores de inactividad NAT/cortafuegos corten la conexión. Ajuste esto con -ssh-keepalive, o pase 0 para deshabilitarlo.
Homebrew (macOS):
brew install --cask krisiasty/tap/vcheck
Binarios precompilados para Linux, macOS y Windows están publicados en la página de versiones.
Desde el código fuente (requiere Go 1.26+):
go install github.com/krisiasty/vcheck@latest
vcheck -host HOST [flags]
| Flag | Por defecto | Descripción |
|---|---|---|
-host | (requerido) | Host remoto |
-user | $USER | Usuario remoto |
-port | 22 | Puerto SSH remoto |
-agent | true | Usar el agente SSH para la autenticación |
-identity | (vacío) | Ruta a un archivo de clave privada (solicita contraseña si está cifrada) |
-password | false | Solicitar una contraseña SSH |
-insecure | false | Aceptar claves de host aún no registradas en known_hosts; las discrepancias con una clave registrada aún fallan |
-fix | false | Escribir fragmentos en /etc/modprobe.d para los módulos que aún no están en la lista negra |
-unload | false | Con -fix, descargar los módulos afectados después de ponerlos en la lista negra |
-rebuild-initramfs | false | Con -fix, reconstruir el initramfs solo para el kernel en ejecución (update-initramfs o dracut) |
-skip-logs | false | Omitir las comprobaciones del historial de registros del kernel |
-timeout | 15s | Tiempo de espera de conexión SSH |
-ssh-keepalive | 30s | Intervalo de keepalive SSH (0 lo deshabilita) |
-command-timeout | 30s | Tiempo de espera de comando remoto ( lo deshabilita) |
Al menos uno de -agent, -identity o -password debe producir un método de autenticación utilizable. Los métodos se prueban en el orden listado.
Se requiere sudo en el destino. Si está configurado sudo sin contraseña, la herramienta procede silenciosamente; de lo contrario, solicita una contraseña una vez (la entrada está oculta) y la proporciona a través de sudo -S para cada comando subsiguiente.
| Código | Significado |
|---|---|
0 | Todos los módulos afectados en lista negra, descargados, no integrados e inactivos |
1 | Error de uso |
2 | Conexión SSH fallida |
3 | Autenticación sudo fallida |
4 | Uno o más módulos no en lista negra (sin exposición actual) |
5 | Uno o más módulos actualmente cargados, integrados en el kernel o en uso activo |
99 | Fallo interno/de comprobación |
$ vcheck -host host.example.com -identity ~/.ssh/id_ed25519
INF connected user=ops host=host.example.com port=22
INF checking vulnerability cve=CVE-2026-31431 name="Copy Fail"
INF checking vulnerability cve=CVE-2026-43284 name="Dirty Frag (IPsec)"
INF checking vulnerability cve=CVE-2026-43500 name="Dirty Frag (RxRPC)"
INF mitigated cve=CVE-2026-31431 module=algif_aead
INF mitigated cve=CVE-2026-43284 module=esp4
INF mitigated cve=CVE-2026-43284 module=esp6
INF mitigated cve=CVE-2026-43284 module=ipcomp4
INF mitigated cve=CVE-2026-43284 module=ipcomp6
INF mitigated cve=CVE-2026-43284 module=xfrm_user
INF mitigated cve=CVE-2026-43500 module=rxrpc
INF mitigated cve=CVE-2026-43500 module=kafs
$ vcheck -host host.example.com -identity ~/.ssh/id_ed25519
INF connected user=ops host=host.example.com port=22
INF checking vulnerability cve=CVE-2026-31431 name="Copy Fail"
INF checking vulnerability cve=CVE-2026-43284 name="Dirty Frag (IPsec)"
INF checking vulnerability cve=CVE-2026-43500 name="Dirty Frag (RxRPC)"
INF mitigated cve=CVE-2026-31431 module=algif_aead
ERR VULNERABLE cve=CVE-2026-43284 module=esp4 loaded=true
ERR module not blacklisted cve=CVE-2026-43284 module=esp6
ERR module not blacklisted cve=CVE-2026-43284 module=ipcomp4
ERR module not blacklisted cve=CVE-2026-43284 module=ipcomp6
ERR module not blacklisted cve=CVE-2026-43284 module=xfrm_user
ERR module not blacklisted cve=CVE-2026-43500 module=rxrpc
ERR module not blacklisted cve=CVE-2026-43500 module=kafs
-fix — primera ejecución$ vcheck -fix -host host.example.com -identity ~/.ssh/id_ed25519
INF connected user=ops host=host.example.com port=22
INF checking vulnerability cve=CVE-2026-31431 name="Copy Fail"
INF checking vulnerability cve=CVE-2026-43284 name="Dirty Frag (IPsec)"
INF checking vulnerability cve=CVE-2026-43500 name="Dirty Frag (RxRPC)"
INF findings before fix
INF mitigated cve=CVE-2026-31431 module=algif_aead
ERR VULNERABLE cve=CVE-2026-43284 module=esp4 loaded=true
ERR module not blacklisted cve=CVE-2026-43284 module=esp6
ERR module not blacklisted cve=CVE-2026-43284 module=ipcomp4
ERR module not blacklisted cve=CVE-2026-43284 module=ipcomp6
ERR module not blacklisted cve=CVE-2026-43284 module=xfrm_user
ERR module not blacklisted cve=CVE-2026-43500 module=rxrpc
ERR module not blacklisted cve=CVE-2026-43500 module=kafs
INF writing modprobe.d snippet path=/etc/modprobe.d/cve-2026-43284-disable.conf modules="[esp4 esp6 ipcomp4 ipcomp6 xfrm_user]"
INF writing modprobe.d snippet path=/etc/modprobe.d/cve-2026-43500-disable.conf modules="[rxrpc kafs]"
INF re-scanning after fix snippets_written=2
INF checking vulnerability cve=CVE-2026-31431 name="Copy Fail"
INF checking vulnerability cve=CVE-2026-43284 name="Dirty Frag (IPsec)"
INF checking vulnerability cve=CVE-2026-43500 name="Dirty Frag (RxRPC)"
INF findings after fix
INF mitigated cve=CVE-2026-31431 module=algif_aead
ERR blacklisted but currently loaded; run 'modprobe -r' or reboot cve=CVE-2026-43284 module=esp4
INF mitigated cve=CVE-2026-43284 module=esp6
INF mitigated cve=CVE-2026-43284 module=ipcomp4
INF mitigated cve=CVE-2026-43284 module=ipcomp6
INF mitigated cve=CVE-2026-43284 module=xfrm_user
INF mitigated cve=CVE-2026-43500 module=rxrpc
INF mitigated cve=CVE-2026-43500 module=kafs
La lista negra está en vigor, pero esp4 ya estaba cargado en el kernel antes de que se escribiera el fragmento. Reinicie o ejecute sudo modprobe -r esp4 en el destino para eliminarlo por completo.
$ vcheck -fix -host host.example.com -identity ~/.ssh/id_ed25519
INF connected user=ops host=host.example.com port=22
INF checking vulnerability cve=CVE-2026-31431 name="Copy Fail"
INF checking vulnerability cve=CVE-2026-43284 name="Dirty Frag (IPsec)"
INF checking vulnerability cve=CVE-2026-43500 name="Dirty Frag (RxRPC)"
INF findings before fix
INF mitigated cve=CVE-2026-31431 module=algif_aead
ERR blacklisted but currently loaded; run 'modprobe -r' or reboot cve=CVE-2026-43284 module=esp4
INF mitigated cve=CVE-2026-43284 module=esp6
INF mitigated cve=CVE-2026-43284 module=ipcomp4
INF mitigated cve=CVE-2026-43284 module=ipcomp6
INF mitigated cve=CVE-2026-43284 module=xfrm_user
INF mitigated cve=CVE-2026-43500 module=rxrpc
INF mitigated cve=CVE-2026-43500 module=kafs
INF fix: nothing to do — all affected modules already blacklisted
modprobe -r esp4$ vcheck -host host.example.com -identity ~/.ssh/id_ed25519
INF connected user=ops host=host.example.com port=22
INF checking vulnerability cve=CVE-2026-31431 name="Copy Fail"
INF checking vulnerability cve=CVE-2026-43284 name="Dirty Frag (IPsec)"
INF checking vulnerability cve=CVE-2026-43500 name="Dirty Frag (RxRPC)"
INF mitigated cve=CVE-2026-31431 module=algif_aead
INF mitigated cve=CVE-2026-43284 module=esp4
INF mitigated cve=CVE-2026-43284 module=esp6
INF mitigated cve=CVE-2026-43284 module=ipcomp4
INF mitigated cve=CVE-2026-43284 module=ipcomp6
INF mitigated cve=CVE-2026-43284 module=xfrm_user
INF mitigated cve=CVE-2026-43500 module=rxrpc
INF mitigated cve=CVE-2026-43500 module=kafs
-rebuild-initramfs$ vcheck -fix -rebuild-initramfs -host host.example.com -identity ~/.ssh/id_ed25519
...
INF writing modprobe.d snippet path=/etc/modprobe.d/cve-2026-43284-disable.conf modules="[esp4 esp6 ipcomp4 ipcomp6 xfrm_user]"
INF writing modprobe.d snippet path=/etc/modprobe.d/cve-2026-43500-disable.conf modules="[rxrpc kafs]"
INF rebuilding initramfs for running kernel timeout=10m0s
INF initramfs rebuilt for running kernel tool=update-initramfs
INF re-scanning after fix snippets_written=2
...
Solo se reconstruye el initramfs del kernel en ejecución. Otros kernels instalados conservan su initramfs existente, por lo que una entrada anterior en el menú de arranque sigue siendo un respaldo funcional si el nuevo initramfs causa problemas. En un host que no tenga ni update-initramfs ni dracut, vcheck registra WRN no supported initramfs tool found ... y continúa.
-insecure$ vcheck -insecure -host host.example.com -identity ~/.ssh/id_ed25519
WRN host key not in known_hosts; accepting due to -insecure host=host.example.com:22 remote=192.0.2.42:22 fingerprint=SHA256:AAAAEXAMPLEfingerPrint000000000000000000000
INF connected user=ops host=host.example.com port=22
INF checking vulnerability cve=CVE-2026-31431 name="Copy Fail"
...
-insecure acepta hosts que aún no están en known_hosts. Si un host ya está registrado y presenta una clave diferente, la conexión aún falla — el indicador es solo una anulación de "primer contacto", no una forma de suprimir las advertencias de intermediario en un host conocido.
lsmod se obtiene una vez y los nombres de los módulos se comparan con la primera columna./lib/modules/$(uname -r)/modules.builtin y /sys/module porque los fragmentos de modprobe no pueden deshabilitar el código compilado en el kernel en ejecución./etc/modprobe.d/ (grep -rE) una directiva install <módulo> /bin/false — la misma forma que escribe vcheck con -fix. Otras formas de deshabilitar (por ejemplo, blacklist) no se reconocen.journalctl -k, con un respaldo a /var/log/kern.log; se conservan las últimas cinco líneas coincidentes por módulo. Pase -skip-logs para omitir este paso.algif_aead): ss -p --af-alg enumera los sockets AF_ALG abiertos; cualquier salida que no sea el encabezado cuenta como uso activo.Todos los comandos se ejecutan a través de sudo y están limitados por -command-timeout — se requiere acceso privilegiado para leer /var/log/kern.log, enumerar sockets AF_ALG y escribir en /etc/modprobe.d/. Con -unload, también se requiere acceso privilegiado para ejecutar modprobe -r. Con -rebuild-initramfs, vcheck ejecuta update-initramfs -u -k $(uname -r) (Debian/Ubuntu) o dracut -f --kver $(uname -r) (RHEL/Fedora), que también necesitan root.
0-initramfs-timeout | 10m | Tiempo de espera para el paso de reconstrucción del initramfs (0 lo deshabilita); solo se usa con -rebuild-initramfs |
-debug | false | Aumentar la verbosidad de los registros |
-version | false | Mostrar la versión y salir |