
Script de auditoria bash somente leitura que faz a triagem da CVE-2026-98432, uma vulnerabilidade use-after-free no TCP IPv4 do kernel Linux, verificando changelogs do kernel, matrizes de correção das distribuições e exposição de listeners TCP.
Script de auditoria somente leitura para a CVE-2026-98432, um use-after-free no handshake TCP IPv4 do kernel Linux. Um SYN-ACK pode ser construído a partir de opções IP que outra CPU acabou de liberar. O gatilho é tráfego de rede contra um socket de escuta comum, portanto, ao contrário dos bugs de page-cache e checksum nas auditorias irmãs, ele não exige acesso local.
Quando uma conexão é concluída, tcp_v4_syn_recv_sock() entrega as opções IP do request socket (ireq->ireq_opt) ao novo socket filho sem copiá-las. Um SYN retransmitido para o mesmo request socket, tratado em outra CPU, ainda pode estar construindo um SYN-ACK a partir dessas opções. Desde 079096f103fa (4.4) os request sockets executam sem o lock do listener, as opções do filho são liberadas com um kfree() simples, e ip_options_build() lê memória liberada (CWE-416).
Existe uma segunda corrida na migração de request socket, que só está ativa com net.ipv4.tcp_migrate_req=1 ou um programa BPF SK_REUSEPORT_SELECT_OR_MIGRATE. A correção troca ambas as liberações por kfree_rcu().
| CVE | CVE-2026-98432 |
| Componente | Kernel Linux net/ipv4 (tcp_v4_syn_recv_sock, inet_sock_destruct, tcp_v4_reqsk_destructor) |
| Classe | Use-after-free, alcançável remotamente por um socket TCP em escuta |
| Introduzido em | 079096f103fa "tcp/dccp: install syn_recv requests into ehash table" (4.4); parte de migração c905dee62232 |
| Correção upstream | e3f33b0a1d89 "ipv4: free inet_opt and ireq_opt after an RCU grace period" (Eric Dumazet), em 7.3-rc7 |
| Correções em stable | 5.10.272, 5.15.223, 6.1.190, 6.6.159, 6.12.113, 6.18.56, 7.2.10 |
| Relator | Xinyang Ge |
| Severidade | CNA: 9.8 (AC:L). Red Hat: 8.1 (AC:H, por causa da corrida), sem mitigação disponível. Ubuntu: High |
| Debian | bookworm corrigido em 6.1.190-1, trixie em 6.12.113-1, forky 7.2.12-1 |
| Ubuntu | correção em andamento para todas as versões, nenhuma lançada ainda |
| Red Hat | nenhuma tabela de produtos afetados ou erratum publicado |
As versões stable foram verificadas contra os arquivos ChangeLog-* do kernel.org em 2026-10-29. Em cada branch, a versão listada é a primeira a conter a correção e a versão anterior a ela não a possui. O mainline foi verificado comparando tags: 7.3-rc6 não possui o commit e 7.3-rc7 o possui. As séries sem linha de correção (4.x, 5.4, 6.2–6.5, 6.7–6.11, 6.13–6.17, 6.19, 7.0, 7.1) estão em fim de vida e são reportadas como vulneráveis. Os estados das distribuições são da mesma data.
O bug exige um socket TCP em escuta e um SYN que carregue opções IP, além de uma corrida perdida entre duas CPUs. O script não consegue julgar o quão alcançáveis sua rede torna essas opções, então ele reporta o que consegue ver (listeners) e deixa o resto com você.
Ele apenas faz triagem e não altera nada. Nunca carrega um módulo, nunca abre um socket, nunca toca em sysctl ou regras de firewall, e nunca executa um PoC, portanto é seguro executá-lo em produção.
changelog.Debian.gz ou rpm -q --changelog) o ID do CVE ou o assunto do commit upstream. Uma correção encontrada aí vence sempre./proc/net/tcp e /proc/net/tcp6:
net.ipv6.bindv6only=1;net.ipv4.tcp_migrate_req e regista os runtimes de contentores, cujas portas publicadas e network namespaces privados não consegue ver. Contam como exposição.--json.As linhas das distros são um snapshot (2026-10-29). Os fornecedores lançarão correções depois disso, pelo que uma cópia antiga pode reportar "fix in progress" para um kernel que já foi corrigido há muito tempo. O relatório imprime a idade do snapshot e avisa uma vez quando ultrapassa 14 dias. O aviso nunca altera o veredicto, e a verificação do changelog e os limites upstream não envelhecem. Com --quiet, uma segunda linha NOTE: aparece apenas quando está desatualizado, pelo que um parser da linha 1 não é afetado. O JSON contém matrix_date, matrix_age_days e matrix_stale.
Quando avisar, obtenha a versão mais recente deste script.
| Veredicto | Significado | Saída |
|---|---|---|
| PATCHED | Correção encontrada no changelog ou nas tabelas upstream/vendor | 0 |
| NOT_APPLICABLE | O kernel é anterior a 4.4 | 0 |
| MITIGATED | Não corrigido, mas nenhum listener TCP está acessível por IPv4 neste momento. Ainda assim, corrija: iniciar qualquer serviço reabre-o | 1 |
| VULNERABLE | Não corrigido e pelo menos um listener (ou um /proc/net/tcp ilegível, ou um runtime de contentores) | 2 |
| UNKNOWN | Não é possível determinar, por exemplo sem changelog e sem linha na matriz | 3 |
| ERROR | Opção inválida ou ferramenta em falta | 4 |
MITIGATED é raro de propósito: quase todos os servidores escutam em algo. Um utilizador local também pode executar um listener num user+network namespace privado; essa via é anotada no relatório mas não contada, porque a sua explorabilidade não está verificada.
Dois casos em que uma simples comparação de versões estaria errada são tratados:
ID=debian mas executa a sua própria série proxmox-kernel-*. Os limites mínimos do Debian não se aplicam, pelo que só é limpo através de uma ocorrência no changelog....-microsoft-standard-WSL2). A regra da distro não se aplica; a tabela upstream aplica-se. Atualize-o a partir do Windows com wsl --update.sudo ./cve-2026-98432-audit.sh # text report
./cve-2026-98432-audit.sh --json # JSON on stdout
./cve-2026-98432-audit.sh --quiet # one line, exit code carries the verdict
./cve-2026-98432-audit.sh --since 2026-09-01 --no-hunt
Ele é executado sem root, mas então a busca por journal e algumas consultas de pacotes podem ficar vazias. Veja examples/ para um relatório real.
Atualize o kernel e reinicie. Não há nenhuma opção em tempo de execução que corrija isso, e a Red Hat não lista nenhuma mitigação. Até então, você pode reduzir a exposição: