
Mitigação interina com nftables para a CVE-2026-98432 do kernel Linux (UAF em opções IPv4 em tcp_v4_syn_recv_sock) como uma skill de agente reproduzível
Habilidade de agente que aplica, verifica, persiste e posteriormente remove a mitigação temporária de host para a CVE-2026-98432 do kernel Linux (CVSS 9.8): uma única regra nftables que descarta pacotes TCP que transportam opções IPv4 — a única entrada que alcança o use-after-free de inet_opt/ireq_opt em tcp_v4_syn_recv_sock().
Contexto que vale a pena conhecer: o Frontier Red Team da Anthropic descreveu publicamente um PoC funcional de não autenticado a root contra servidores que expõem um listener MPTCP (outubro de 2026); nenhuma exploração em ambiente real foi reportada. O CNA do kernel atribui 9.8; o upstream e a Red Hat atribuem 8.1 (complexidade de ataque alta). A correção do fornecedor são backports da classe do kernel Ubuntu 6.8.0-149 — até que o kernel em execução carregue a correção, esta regra é a solução provisória. Ela está restrita a um campo de um cabeçalho de um protocolo, portanto o tráfego normal não é afetado.
Esta regra não é inédita — trate-a como arte prévia empacotada. Veja "Arte prévia" abaixo; a contribuição deste repositório é a forma reproduzível de habilidade de agente mais as armadilhas de produção.
| Caminho | O que é |
|---|---|
SKILL.md | A habilidade — gatilhos de frontmatter, conjunto de regras, verificações, persistência, armadilhas, remoção |
files/cve98432.nft | Conjunto de regras nftables pronto para copiar (prerouting, prioridade −300) |
files/nft-cve98432.service | Unidade systemd pronta para copiar (persistência) |
cp -R cve-2026-98432-nft-mitigation ~/.claude/skills/ # Claude Code
cp -R cve-2026-98432-nft-mitigation ~/.agents/skills/ # agents-style runtimes
O frontmatter description é a superfície de descoberta: os agentes selecionam esta skill quando solicitados a mitigar a CVE-2026-98432, o "TCP/IP fix", o UAF de opções IPv4 do kernel, ou a remover a mitigação depois que o kernel do fornecedor for lançado.
zgrep -c CVE-2026-98432 /usr/share/doc/linux-modules-$(uname -r)/changelog.Debian.gz # Debian/Ubuntu
rpm -q --changelog kernel-core-$(uname -r) | grep -c CVE-2026-98432 # RHEL/Rocky/Alma
> 0 = corrigido, ignore a mitigação. (Verifique também o rastreador do seu fornecedor; e
apt-cache policy linux-image-generic para um kernel mais novo instalado mas não inicializado.)ss -lnMp): o PoC publicado tem como alvo esses listeners, e o Go ≥ 1.24 escuta
com MPTCP por padrão em kernels que o permitem. sysctl net.mptcp.enabled=0 afeta apenas
novos sockets — listeners já abertos mantêm o MPTCP até que seu serviço seja reiniciado
(GODEBUG=multipathtcp=0 conforme a equipe do Go).cat /sys/kernel/security/lsm listar SELinux ou Smack e
você usar mapeamento NetLabel CIPSOV4, as opções IPv4 são legítimas ali — esta regra quebraria
esse caminho. Não aplique em redes rotuladas CIPSO (a RFC 7126 discute o trade-off).files/cve98432.nft e files/nft-cve98432.service.nft -c -f /usr/local/sbin/cve98432.nft — verificação de análise; requer root (sem root falha
no netlink: cache initialization failed).systemctl daemon-reload && systemctl enable --now nft-cve98432.servicedestroy table … deve ser a
primeira linha do arquivo: acrescentada ao final, ela cria a tabela e depois a destrói,
deixando um ruleset vazio enquanto o serviço ainda sai com 0.nft list table inet cve98432 deve mostrar
meta l4proto tcp ip hdrlength > 5 counter drop em uma chain com priority -300
(antes do conntrack, correspondendo à regra publicada).table inet … personalizada não pertence ao iptables, então iptables-restore /
ferramentas ufw / firewalld a deixam intacta (execute seu restore uma vez e liste novamente para confirmar).Remoção após o kernel corrigido ser instalado e reiniciado: seção 7 do SKILL.md.
O estado do nftables é por network namespace. As regras do host veem o tráfego de um contêiner apenas onde
ele cruza o host (ex.: contêiner → exterior); o tráfego que permanece dentro do
próprio namespace do contêiner (contêiner → seu próprio loopback/IP) nunca atravessa o prerouting do host —
porém o kernel é compartilhado, então o código dentro de um contêiner ainda pode alcançar o UAF localmente. Injete
o mesmo ruleset em cada contêiner em execução:
# Docker (host-side nsenter keeps the needed capabilities)
for c in $(docker ps -q); do
pid=$(docker inspect -f '{{.State.Pid}}' "$c")
nsenter -t "$pid" -n /usr/sbin/nft -f /usr/local/sbin/cve98432.nft
done
# LXC (privileged CLI as root)
for c in $(lxc-ls -1 2>/dev/null); do lxc-attach -n "$c" -- nft -f /usr/local/sbin/cve98432.nft; done
Namespaces de contêiner não persistem regras nft — reexecute a cada reinício do contêiner (integre ao passo pós-inicialização do seu orquestrador). Trabalhos anteriores para exatamente essa lacuna, com scripts:
typhoon1217/cve-2026-98432-mitigation (inject-netns.sh).
Sockets padrão são suficientes — sem criação de pacotes no servidor: um cliente define uma opção IPv4 Record
Route via setsockopt(IP_OPTIONS) e conecta; uma conexão simples é bem-sucedida, a conexão com
opções deve expirar enquanto o contador da regra incrementa. Clientes prontos:
check-blocked.py / verify-synack.sh em typhoon1217/cve-2026-98432-mitigation.
Ressalva desse projeto: um cliente que ele próprio executa a mitigação também descartará os
ecos SYN-ACK do alvo — teste a partir de um cliente não mitigado para um veredito limpo.
prerouting com priority -300: antes do conntrack, então pacotes descartados nunca criam
estado conntrack — e, diferentemente de input, também cobre tráfego encaminhado para contêineres/VMs
que atravessa o host.@nh,4,4 > 5 bruto para
ip hdrlength > 5 — o campo IHL, confirmado pela própria ferramenta.typhoon1217/cve-2026-98432-mitigation — mesma regra de descarte + injeção em netns de contêiner,
ressalva sobre CIPSO, clientes de verificação (EN/KO)Destilado de uma implantação em produção, incluindo falhas encontradas lá: nft -c sem root, o
bug de ordenação do destroy no final, um heredoc sem aspas engolindo \$ silenciosamente, e semântica
de aplicação dupla. Repositório apenas de documentação — dependências de runtime: nft ≥ 1.0 + systemd; sem suíte de testes
(n/a).