
Scanner Linux passivo de hosts que classifica a exposição ao CVE-2026-31431 por meio da versão do kernel, changelog da distribuição, status do módulo e acessibilidade do AF_ALG, com saída em JSON para integração com SIEM.
Autores/Colaboradores: Patrick Doyle (Autor/Mantenedor), Effie Renard (Coautora), Kimberly-Lee Banks (Coautora), Chris F. (Suporte/Revisão de Código)
Divulgação de IA: Claude Code usado para escrever arquivos de teste, escrever dados de teste e uma revisão de segurança do código. Todas as edições foram auditadas manualmente por um dos colaboradores.
Binário Go único com linkagem estática que classifica a exposição de um host Linux à CVE-2026-31431.
A ferramenta é passiva. Ela não explora a falha. A sonda de mecanismo (veja a declaração de segurança abaixo) emite exatamente duas chamadas de sistema e nunca toca o caminho de código vulnerável.
| Sinal | Fonte | Flag |
|---|
| Versão do kernel vs. correção upstream | uname(2) | --kernel-version |
| Changelog da distribuição menciona a CVE | apt/rpm/apk ou changelog.Debian.gz em disco | --changelog |
Status do módulo algif_aead | /proc/modules, modprobe.d, /lib/modules | --module |
| Superfície vulnerável acessível | socket(AF_ALG) + bind(authencesn(...)) | --mechanism |
| Compilado no vmlinux | /boot/config-$(uname -r) ou /proc/config.gz | (parte de --module) |
Se nenhuma flag de verificação for fornecida, todas as quatro são executadas.
| Modo | Gatilho | Caso de uso |
|---|---|---|
| Estilizado bonito (Padrão) | stdout TTY, sem override de --format, sem env NO_COLOR | Execuções em shell interativo |
| Texto simples | stdout não-TTY, OU --format=text, OU NO_COLOR=1, OU --no-color | Scripts de Shell, Pipes |
| JSON | --format=json | Ingestão Syslog/SIEM, Scripts de Shell |
| Silencioso | --quiet | Apenas código de saída (automação/scripts) |
Forçar bonito quando usado com pipe: cvecheck --pretty | tee report.txt.
Forçar texto simples em um TTY: cvecheck --no-color ou NO_COLOR=1 cvecheck.
A sonda emite exatamente duas chamadas de sistema socket(AF_ALG, SOCK_SEQPACKET, 0) e bind(fd, &SockaddrALG{Type:"aead", Name:"authencesn(hmac(sha256), cbc(aes))"}). Em seguida, é seguida por close(fd). Ela não executa setsockopt para uma chave, não executa accept, não executa sendmsg, não executa splice e não cria pipes. O caminho de código vulnerável requer sendmsg de dados criptográficos combinado com um splice de um descritor de arquivo com suporte de cache de página; nenhuma dessas operações ocorre, portanto a falha não pode ser acionada.
Uma sonda bem-sucedida significa que a superfície está acessível. Se o kernel ainda contém a falha é decidido pelos sinais de versão do kernel + changelog.
Efeito colateral: um bind bem-sucedido carrega automaticamente algif_aead via o carregador automático de módulos do kernel. A verificação do módulo é executada antes da sonda de mecanismo, para que o relatório de estado carregado seja pré-sonda. Para suprimir o carregamento automático completamente, coloque algif_aead na lista negra primeiro.
| Código | Significado |
|---|---|
0 | PATCHED / NOT_VULNERABLE / MITIGATED / LIKELY_NOT_EXPLOITABLE |
2 | VULNERABLE ou MECHANISM_REACHABLE (varredura parcial, versão do kernel não verificada) |
3 | INCONCLUSIVE (sinais insuficientes) |
| Distribuição | Detecção | Pacote do kernel | Notas |
|---|---|---|---|
| Ubuntu / Debian / Mint / Pop!_OS | apt | linux-image-$(uname -r) | Leitura do changelog em disco primeiro evita a fragilidade de rede do apt changelog em kernels assinados |
| RHEL / CentOS / Rocky / Alma / Fedora / Amazon Linux | rpm | kernel | Inclui algif_aead embutido (CONFIG_..._AEAD=y); mitigação por lista negra não é eficaz |
| Oracle Linux | rpm | kernel ou kernel-uek | UEK detectado via substring uek em uname -r |
| openSUSE / SLES | rpm | kernel-default | |
| Alpine | apk | linux-lts / linux-virt / etc. | Sabor escolhido pelo sufixo da versão |
| Arch / CachyOS / Manjaro / Endeavour / Gentoo | nenhum | n/d | Rolling/fonte: depende da verificação da versão do kernel |
Detecta automaticamente sua arquitetura, baixa o binário correto em $(pwd) e verifica seu SHA-256 contra o SHA256SUMS publicado:
curl -fsSL https://copyfail.pcdoyle.dev/install.sh | sh
O script sai com código não-zero em caso de incompatibilidade de checksum e remove o arquivo defeituoso.
Escolha o binário para a arquitetura do seu host:
| Arquitetura | Binário |
|---|---|
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 executar:
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) para o Servidor:
scp ./bin/cvecheck-linux-x86_64 host:/tmp/ # Menos de 4 MB, estático, sem dependência de glibc
# SSH:
ssh <host>
# Executar o Binário:
/tmp/cvecheck-linux-x86_64 # Saída bonita amigável para humanos.
/tmp/cvecheck-linux-x86_64 --format=json # Amigável para Scripts, Syslog e SIEM
/tmp/cvecheck-linux-x86_64 --format=text # Amigável para Scripts e Pipes
ssh <host> /tmp/cvecheck-linux-x86_64 # Se executado diretamente, usa --format=text por padrão
ssh <host> /tmp/cvecheck-linux-x86_64 --format=json # Amigável para Syslog/SIEM
Monte a raiz do host em algum lugar legível e passe --root:
docker run --rm -v /:/host:ro alpine /tmp/cvecheck --root /<host-path>
--root controla todas as buscas em disco (/etc/os-release, modprobe.d, /lib/modules, /boot/config-*, arquivos de changelog). As sondas de versão do kernel e de mecanismo ainda tocam o kernel em execução via uname(2) e socket(AF_ALG, ...).
Resolvida nesta ordem (a primeira correspondência vence):
PATCHED: O changelog da distribuição referencia o ID da CVE.NOT_VULNERABLE: Kernel em execução >= versão corrigida upstream.MITIGATED: algif_aead na lista negra e não carregado e não embutido no vmlinux.LIKELY_NOT_EXPLOITABLE: AF_ALG indisponível e módulo não está em disco.MECHANISM_REACHABLE: Superfície acessível, mas versão do kernel não verificada.VULNERABLE: Kernel na faixa vulnerável e mecanismo acessível.INCONCLUSIVE: Nenhum dos acima corresponde.Se --mechanism for executado junto com --kernel-version e ambos sinalizarem problema, o resultado é VULNERABLE com uma dica de remediação.
algif_aead na lista negra até a atualização do kernel chegar.
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 o símbolo dentro do vmlinux. Apenas uma atualização do kernel (ou patch ao vivo estilo kpatch) resolve a exposição. A ferramenta detecta isso.| Sintoma | Causa | Correção |
|---|---|---|
changelog: error="apt: exit status 100 ... Changelog unavailable for linux-signed-amd64" | Kernel assinado Debian/Ubuntu; o espelho apt não serve o changelog do pacote-fonte | O erro aparece apenas quando o arquivo em disco está ausente além do espelho estar inacessível; instale apt-doc ou aguarde o espelho. |
module: ... config_src="" | Nenhuma configuração de kernel legível (sem /boot/config-*, sem /proc/config.gz, /boot é somente root) | Execute como root, ou aceite que BuiltIn não pode ser determinado. O veredito ainda pode ser resolvido por outros sinais. |
mechanism: error="EAFNOSUPPORT" | Kernel compilado sem CONFIG_CRYPTO_USER_API, então o host não é vulnerável via AF_ALG | O veredito será LIKELY_NOT_EXPLOITABLE. |