
Escáner pasivo de hosts Linux que clasifica la exposición a CVE-2026-31431 mediante la versión del kernel, el changelog de la distribución, el estado de los módulos y la accesibilidad de AF_ALG, con salida JSON para la integración con SIEM.
Autores/Colaboradores: Patrick Doyle (Autor/Mantenedor), Effie Renard (Coautora), Kimberly-Lee Banks (Coautora), Chris F. (Soporte/Revisión de código)
Divulgación de IA: Claude Code se utilizó para escribir archivos de pruebas, escribir datos de prueba y una revisión de seguridad del código. Todas las ediciones fueron auditadas manualmente por uno de los colaboradores.
Binario único de Go con enlace estático que clasifica la exposición de un host Linux a CVE-2026-31431.
La herramienta es pasiva. No explota el fallo. La sonda de mecanismo (consulte la declaración de seguridad a continuación) emite exactamente dos llamadas al sistema y nunca toca la ruta de código vulnerable.
| Señal | Fuente | Indicador |
|---|
| Versión del kernel vs. corrección ascendente | uname(2) | --kernel-version |
| El changelog de la distribución menciona el CVE | apt/rpm/apk o changelog.Debian.gz en disco | --changelog |
Estado del módulo algif_aead | /proc/modules, modprobe.d, /lib/modules | --module |
| Superficie vulnerable accesible | socket(AF_ALG) + bind(authencesn(...)) | --mechanism |
| Compilado en vmlinux | /boot/config-$(uname -r) o /proc/config.gz | (parte de --module) |
Si no se proporcionan indicadores de comprobación, se ejecutan las cuatro.
| Modo | Activación | Caso de uso |
|---|---|---|
| Con estilo bonito (Predeterminado) | Salida TTY, sin anulación de --format, sin variable de entorno NO_COLOR | Ejecuciones interactivas en shell |
| Texto plano | Salida no TTY, O --format=text, O NO_COLOR=1, O --no-color | Scripts de shell, tuberías |
| JSON | --format=json | Ingesta Syslog/SIEM, scripts de shell |
| Silencioso | --quiet | Solo código de salida (automatización/scripts) |
Forzar bonito cuando se usa tubería: cvecheck --pretty | tee report.txt.
Forzar plano en una TTY: cvecheck --no-color o NO_COLOR=1 cvecheck.
La sonda emite exactamente dos llamadas al sistema socket(AF_ALG, SOCK_SEQPACKET, 0) y bind(fd, &SockaddrALG{Type:"aead", Name:"authencesn(hmac(sha256), cbc(aes))"}). Luego le sigue close(fd). No realiza ningún setsockopt para una clave, ningún accept, ningún sendmsg, ningún splice y ninguna creación de tubería. La ruta de código vulnerable requiere sendmsg de datos criptográficos combinado con un splice desde un descriptor de archivo respaldado por caché de páginas; ninguna de esas operaciones ocurre, por lo que el fallo no puede activarse.
Una sonda exitosa significa que la superficie es accesible. Si el kernel aún contiene el fallo lo deciden las señales de versión del kernel + changelog.
Efecto secundario: un bind exitoso carga automáticamente algif_aead mediante el cargador automático de módulos del kernel. La comprobación del módulo se ejecuta antes de la sonda de mecanismo, por lo que el informe del estado cargado es previo a la sonda. Para suprimir la carga automática por completo, incluya algif_aead en la lista negra primero.
| Código | Significado |
|---|---|
0 | PARCHEADO / NO_VULNERABLE / MITIGADO / PROBABLEMENTE_NO_EXPLOTABLE |
2 | VULNERABLE o MECANISMO_ACCESIBLE (escaneo parcial, versión del kernel no comprobada) |
3 | NO_CONCLUYENTE (señales insuficientes) |
| Distribución | Detección | Paquete de kernel | Notas |
|---|---|---|---|
| Ubuntu / Debian / Mint / Pop!_OS | apt | linux-image-$(uname -r) | La lectura del changelog desde disco primero evita la fragilidad de red de apt changelog en kernels firmados |
| RHEL / CentOS / Rocky / Alma / Fedora / Amazon Linux | rpm | kernel | Incluye algif_aead integrado (CONFIG_..._AEAD=y); la mitigación de lista negra no es efectiva |
| Oracle Linux | rpm | kernel o kernel-uek | UEK se detecta mediante la subcadena uek en uname -r |
| openSUSE / SLES | rpm | kernel-default | |
| Alpine | apk | linux-lts / linux-virt / etc. | La variante se elige según el sufijo de la versión |
| Arch / CachyOS / Manjaro / Endeavour / Gentoo | ninguno | n/a | Rodante/fuente: depende de la comprobación de versión del kernel |
Detecta automáticamente su arquitectura, descarga el binario correcto en $(pwd) y verifica su SHA-256 contra los SHA256SUMS publicados:
curl -fsSL https://copyfail.pcdoyle.dev/install.sh | sh
El script sale con código distinto de cero en caso de discrepancia de suma de verificación y elimina el archivo defectuoso.
Elija el binario para la arquitectura de su host:
| Arquitectura | Binario |
|---|---|
Intel/AMD 64 bits (x86_64) | cvecheck-linux-x86_64 |
ARM 64 bits (aarch64) | cvecheck-linux-arm64 |
Intel/AMD 32 bits (i?86) | cvecheck-linux-x86 |
Verifique antes de ejecutar:
curl -LO https://github.com/pcdoyle/copy-fail-cve-2026-31431/releases/latest/download/cvecheck-linux-x86_64
curl -LO https://github.com/pcdoyle/copy-fail-cve-2026-31431/releases/latest/download/SHA256SUMS
sha256sum --ignore-missing -c SHA256SUMS
chmod +x cvecheck-linux-x86_64
make build # bin/cvecheck-linux-{x86_64,arm64,x86}
# SCP(SFTP) al Servidor:
scp ./bin/cvecheck-linux-x86_64 host:/tmp/ # Menos de 4 MB, estático, sin dependencia de glibc
# SSH:
ssh <host>
# Ejecutar Binario:
/tmp/cvecheck-linux-x86_64 # Salida bonita amigable para humanos.
/tmp/cvecheck-linux-x86_64 --format=json # Amigable para Scripts, Syslog y SIEM
/tmp/cvecheck-linux-x86_64 --format=text # Amigable para Scripts y Tuberías
ssh <host> /tmp/cvecheck-linux-x86_64 # Si se ejecuta directamente, usa --format=text por defecto
ssh <host> /tmp/cvecheck-linux-x86_64 --format=json # Amigable para Syslog/SIEM
Monte la raíz del host en algún lugar legible y pase --root:
docker run --rm -v /:/host:ro alpine /tmp/cvecheck --root /<host-path>
--root controla todas las búsquedas en disco (/etc/os-release, modprobe.d, /lib/modules, /boot/config-*, archivos de changelog). Las sondas de versión del kernel y de mecanismo aún tocan el kernel en ejecución mediante uname(2) y socket(AF_ALG, ...).
Se resuelve en este orden (la primera coincidencia gana):
PARCHEADO: El changelog de la distribución hace referencia al ID del CVE.NO_VULNERABLE: El kernel en ejecución >= versión corregida ascendente.MITIGADO: algif_aead en lista negra y no cargado y no integrado en vmlinux.PROBABLEMENTE_NO_EXPLOTABLE: AF_ALG no disponible y el módulo no está en disco.MECANISMO_ACCESIBLE: Superficie accesible pero versión del kernel no comprobada.VULNERABLE: Kernel en rango vulnerable y mecanismo accesible.NO_CONCLUYENTE: Ninguna de las anteriores coincide.Si --mechanism se ejecuta junto con --kernel-version y ambas señales indican problemas, el resultado es VULNERABLE con una sugerencia de remediación.
algif_aead en lista negra hasta que se aplique la actualización del kernel.
echo 'blacklist algif_aead' | sudo tee /etc/modprobe.d/cve-2026-31431.conf
sudo rmmod algif_aead 2>/dev/null
CONFIG_CRYPTO_USER_API_AEAD=y coloca el símbolo dentro de vmlinux. Solo una actualización del kernel (o un parche en vivo estilo kpatch) resuelve la exposición. La herramienta lo detecta.| Síntoma | Causa | Solución |
|---|---|---|
changelog: error="apt: exit status 100 ... Changelog unavailable for linux-signed-amd64" | Kernel firmado Debian/Ubuntu; el espejo apt no sirve el changelog del paquete fuente | El error aparece solo cuando el archivo en disco falta además de que el espejo es inaccesible; instale apt-doc o espere al espejo. |
module: ... config_src="" | No hay configuración de kernel legible (sin /boot/config-*, sin /proc/config.gz, /boot es solo raíz) | Ejecute como root, o acepte que BuiltIn no puede determinarse. El veredicto aún puede resolverse mediante otras señales. |
mechanism: error="EAFNOSUPPORT" | Kernel compilado sin CONFIG_CRYPTO_USER_API, por lo que el host no es vulnerable mediante AF_ALG | El veredicto será PROBABLEMENTE_NO_EXPLOTABLE. |