
Conjunto de regras nftables e unidade systemd que descartam pacotes TCP IPv4 que transportam opções IP para mitigar a use-after-free do kernel Linux CVE-2026-98432 até que um kernel corrigido seja disponibilizado.
Uma mitigação paliativa de firewall para a CVE-2026-98432 no Ubuntu 24.04 (noble), para hosts que expõem um listener TCP público (por exemplo, um nó Geth na porta 30303) enquanto um kernel corrigido ainda não está disponível.
A CVE-2026-98432 é um use-after-free no código de handshake TCP IPv4 do kernel Linux. Quando um SYN recebido transporta opções IP IPv4, essas opções são entregues ao novo socket filho sem serem copiadas; um SYN retransmitido processado em simultâneo noutra CPU pode então lê-las depois de terem sido libertadas. Existe um segundo vetor de acionamento através da migração de request-socket (net.ipv4.tcp_migrate_req=1 ou um programa BPF_SK_REUSEPORT_SELECT_OR_MIGRATE).
A Ubuntu classifica-a como prioridade Alta (CVSS 3: 9.8). No momento da redação, a correção do kernel linux para noble ainda está em curso.
Os listeners MPTCP não são um caso à parte. Os binários Go 1.24+ (incluindo o Geth recente) abrem listeners como MPTCP por predefinição, pelo que o ss os mostra como mptcp. Os subflows MPTCP passam pelo mesmo caminho de SYN TCP IPv4, pelo que estão exatamente tão expostos como o TCP simples. Desativar o MPTCP (GODEBUG=multipathtcp=0) não mitiga isto.
Uma única regra nftables, na sua própria tabela, descarta qualquer pacote TCP IPv4 cujo comprimento do cabeçalho não seja 5 (ou seja, qualquer coisa que transporte opções IP) antes de a stack TCP do kernel o ver:
ip protocol tcp ip hdrlength != 5 counter drop
ip hdrlength != 5) também descartava consultas de adesão IGMP, que carregam a opção Router Alert, e pode quebrar silenciosamente o multicast em LAN (mDNS/Avahi, casting).inet cvefix), pelo que coexiste com o ufw e não é afetada pelos recarregamentos do ufw.| Ficheiro | Instalar em | Finalidade |
|---|---|---|
nftables-cve-2026-98432.nft | /etc/nftables-cve-2026-98432.nft | O conjunto de regras (idempotente; seguro para reexecutar) |
cve-2026-98432.service | /etc/systemd/system/cve-2026-98432.service | Unidade oneshot que carrega o conjunto de regras no arranque |
Não coloque esta regra em
/etc/nftables.conf. Esse ficheiro começa comflush ruleset, o que apagaria as regras do ufw se onftables.servicefor executado.
git clone <this-repo> && cd <this-repo>
sudo install -m 0644 nftables-cve-2026-98432.nft /etc/nftables-cve-2026-98432.nft
sudo install -m 0644 cve-2026-98432.service /etc/systemd/system/cve-2026-98432.service
sudo systemctl daemon-reload
sudo systemctl enable --now cve-2026-98432.service
sudo nft list table inet cvefix
Também confirme que o gatilho de migração está desativado (padrão):
sysctl net.ipv4.tcp_migrate_req # expect: 0
Instale o nping. No Ubuntu, ele vem no pacote nmap; não há um pacote nping separado:
sudo apt install nmap
Primeiro, recarregue o conjunto de regras para redefinir o contador para 0, depois envie um SYN normal (sem opções de IP) pelo loopback:
sudo nft -f /etc/nftables-cve-2026-98432.nft # reload; resets the counter to 0
sudo nping --tcp -p 30303 --flags syn -c 3 127.0.0.1
sudo nft list table inet cvefix
Esperado: respostas SA (SYN-ACK), mostrando que o listener ainda está acessível, e o contador permanece em packets 0 bytes 0. Se você não receber respostas, o nping pode estar falhando ao capturar no loopback; nesse caso, execute este teste e o próximo contra o IP da LAN do host em vez de 127.0.0.1.
Envie o mesmo SYN, desta vez carregando uma opção IP (Record Route). O tráfego de loopback passa pelo hook de prerouting, então isto exercita a regra sem nada no meio:
sudo nping --tcp -p 30303 --flags syn --ip-options R -c 3 127.0.0.1
sudo nft list table inet cvefix
Esperado: o nping não recebe respostas (Lost: 3 (100.00%)), e o contador exibe exatamente:
ip protocol tcp ip hdrlength != 5 counter packets 3 bytes 240 drop
(3 sondagens × 80 bytes.)
Os testes remotos só exercitam a regra se a sondagem realmente chegar ao host. Em outra máquina na mesma LAN, direcione para o endereço LAN do host:
sudo nping --tcp -p 30303 --flags syn --ip-options R -c 3 <host-lan-ip>
Em seguida, verifique o contador no host protegido:
sudo nft list table inet cvefix
Esperado: nenhuma resposta, e o contador aumenta em 3 (para packets 6 bytes 480 se você executou o passo 2 primeiro).
Sondar o IP público a partir do exterior geralmente é inconclusivo. Muitos roteadores e dispositivos de ISP rejeitam eles próprios os pacotes com opções de IP. Um sinal típico é uma resposta RA (reset) com um TTL elevado, como ttl=250, o que aponta para um dispositivo com TTL inicial de 255 em vez de um host Linux (TTL inicial 64). A sonda nunca chega ao host, portanto o contador não se altera. O passo 4 mostra como distinguir.
Execute estas no host protegido.
Confirme que as sondas remotas chegam. Inicie isto e, em seguida, repita a sonda do passo 3 a partir da outra máquina:
sudo tcpdump -ni any 'tcp port 30303 and (ip[0] & 0x0f) > 5'
| tcpdump no host | contador nft | resposta nping | Significado |
|---|---|---|---|
| mostra pacotes | aumenta | nenhuma | Mitigação funcionando |
| mostra pacotes | inalterado | SA | Regra não ativa; verifique nft list table inet cvefix |
| nada | inalterado | nenhuma ou RA | Sonda interrompida a montante; teste a partir da LAN ou do loopback |
Confirme que nada mais está sendo capturado. Deixe o contador em paz por vários minutos; ele deve permanecer na sua contagem de teste. Para ver o tráfego não-TCP que carrega opções chegando (que esta regra intencionalmente deixa passar):
sudo tcpdump -ni any '(ip[0] & 0x0f) > 5 and not tcp'
Consultas IGMP do router da LAN (por exemplo, igmp query v3 para 224.0.0.1) são normais e não devem incrementar o contador.
systemctl is-enabled cve-2026-98432.service # expect: enabled
sudo nft list table inet cvefix # table present
sysctl net.ipv4.tcp_migrate_req # expect: 0
Esta é uma solução paliativa. Verifique periodicamente o kernel corrigido:
uname -r
sudo pro fix CVE-2026-98432
Quando uma correção estiver disponível:
sudo apt update && sudo apt full-upgrade
sudo reboot
O Livepatch (por meio de uma assinatura pessoal gratuita do Ubuntu Pro; pro status, canonical-livepatch status) pode evitar a reinicialização, mas não há garantia de que um livepatch será disponibilizado para esta CVE.
Depois de executar um kernel corrigido (mantê-lo também é inofensivo):
sudo systemctl disable --now cve-2026-98432.service
sudo nft delete table inet cvefix
sudo rm /etc/systemd/system/cve-2026-98432.service /etc/nftables-cve-2026-98432.nft
sudo systemctl daemon-reload
Para uma margem extra até a aplicação do patch, a porta de entrada 30303 pode ser fechada completamente (o Geth continua sincronizando por meio de peers de saída, com menos peers):
sudo ufw deny 30303/tcp
# later:
sudo ufw delete deny 30303/tcp