Uso após liberação no aperto de mão TCP do kernel Linux, do pacote com opções IPv4 ao root remoto
Quando o kernel Linux aceita uma nova conexão TCP por IPv4, ele entrega à conexão as opções IP guardadas do pedido original sem copiá-las, e as libera logo em seguida. Se, nesse instante, outro núcleo do processador estiver respondendo a um SYN retransmitido do mesmo pedido, ele lê memória já liberada. Um atacante remoto, sem conta, provoca essa corrida com pacotes que carregam opções IPv4. A Anthropic demonstrou, com um modelo Claude ainda não lançado, um exploit que obtém root em servidores com ouvinte MPTCP em cerca de 53 minutos. A correção está no kernel oficial desde 11 de outubro, mas várias distribuições ainda não a entregavam no fim do mês, e o kernel atualizado só protege depois do reinício.
A função tcp_v4_syn_recv_sock() transfere a posse de ireq->ireq_opt para o socket filho sem copiá-lo, enquanto outro núcleo pode estar lendo a mesma estrutura para responder a um SYN retransmitido, protegido apenas por rcu_read_lock() [1]. O resultado é um uso após liberação alcançável pela rede, sem autenticação, com nota 9.8 da equipe de CVE do kernel [1] [2]. O exploit demonstrado precisa de um ouvinte MPTCP, mas o defeito está no TCP comum por IPv4: desligar o MPTCP estreita o caminho conhecido e não fecha a falha [1] [2]. A proteção só existe depois de instalar o kernel corrigido e reiniciar [2] [3].
A CVE-2026-98432 é uma condição de corrida que leva a uso após liberação (use-after-free) no código do kernel Linux que monta novas conexões TCP por IPv4 [1] [2]. Afeta kernels desde a versão 4.4 [1]. A equipe de CVE do kernel atribuiu 9.8 em CVSS 3.1; a Red Hat começou classificando como negação de serviço, com 5.9, e elevou para crítica em 30 de outubro [1] [2].
O ataque exige que o atacante alcance uma porta TCP aberta e vença uma corrida com pacotes que carregam opções IPv4, como Record Route ou Timestamp [2]. Perder a corrida só faz a conexão falhar, então o atacante pode repetir quantas vezes quiser [2] [3]. A Anthropic relatou que um modelo Claude de pesquisa, ainda não lançado, construiu um exploit que vaza memória do kernel, contorna o KASLR (Kernel Address Space Layout Randomization), desvia o fluxo de execução do kernel e executa um comando do atacante como root, contra um servidor com ouvinte MPTCP (Multipath TCP) [1] [4]. O exploit não foi publicado [2].
A correção existe no kernel oficial desde 11 de outubro, nas versões 7.2.10 e 6.18.56, e chegou aos demais ramos estáveis em 15 de outubro [2]. As distribuições demoraram: em 30 de outubro, Ubuntu e Red Hat ainda não tinham kernel corrigido; a Red Hat entregou o seu em 1º de novembro, e o Ubuntu seguia vulnerável nessa data [1] [2].
A ação é: instale o kernel corrigido da sua distribuição e reinicie; até lá, bloqueie pacotes IPv4 TCP com opções IP na entrada e tire os ouvintes MPTCP da internet [1] [2] [3]. A seção 6 traz a verificação da infraestrutura do CiberLab.
Não houve submissão a sandbox, execução de exploit nem análise de amostra. O CiberLab não reproduziu a corrida nem testou as regras de filtragem. A causa raiz vem do aviso do kernel, citado pelo BleepingComputer [1], e do commit de correção, descrito pela Atlas [2]; a orientação de verificação, da Hive Security [3]; o exploit, da descrição da Anthropic relatada pela CSO Online [4]. A verificação da seção 6 foi feita sobre o código da plataforma e a estação de trabalho; o kernel do servidor de produção não foi inspecionado.
| Campo | Valor |
|---|---|
| Identificador | CVE-2026-98432 |
| Componente afetado | Aperto de mão TCP por IPv4: net/ipv4/tcp_ipv4.c e net/ipv4/af_inet.c [1] [2] |
| Classe de fraqueza | Condição de corrida com uso após liberação; o registro da CVE não lista CWE [2] |
| Vetor | Rede, sem autenticação, sem interação do usuário [1] [4] |
| Pontuação | 9.8 em CVSS 3.1 (equipe de CVE do kernel); Red Hat de 5.9 para crítica em 30 de outubro [1] [2] |
| Pré-condição de rede | Pacotes IPv4 com opções IP, como Record Route ou Timestamp no SYN [2] |
| Impacto descrito | Revelação de memória do kernel ao par remoto, escrita fora dos limites no kernel ou queda [2] |
| Commit de correção | e3f33b0, "ipv4: free inet_opt and ireq_opt after an RCU grace period", Eric Dumazet, 1º de outubro de 2026 [2] |
| IPv6 | Não afetado pela falha principal; um caso relacionado ficou para outro patch [2] |
| Inclusão no KEV | Não incluída até 1º de novembro [2] |
| Ramo | Primeira versão corrigida | Data |
|---|---|---|
| 7.3 | 7.3 [2] [3] | 18 de outubro [2] |
| 7.2 | 7.2.10 [2] [3] | 11 de outubro [2] |
| 6.18 | 6.18.56 [2] [3] | 11 de outubro [2] |
| 6.12 | 6.12.113 [2] [3] | 15 de outubro [2] |
| 6.6 | 6.6.159 [2] [3] | 15 de outubro [2] |
| 6.1 | 6.1.190 [2] [3] | 15 de outubro [2] |
| 5.15 | 5.15.223 [2] [3] | 15 de outubro [2] |
| 5.10 | 5.10.272 [2] [3] | 15 de outubro [2] |
| 4.4 a 5.4 | Fora de suporte no upstream; só correção de distribuição [2] | n/d |
Distribuições aplicam correções em kernels com numeração própria. Não compare a saída de uname -r com a tabela 2 para decidir se um servidor Ubuntu, RHEL ou Debian está corrigido: consulte o rastreador de segurança da distribuição [2] [3].
Uma conexão TCP começa com três pacotes: o cliente envia SYN, o servidor responde SYN-ACK e o cliente confirma com ACK. Entre o SYN e o ACK, o kernel guarda um pedido de conexão (request socket) com o que aprendeu do SYN, inclusive as opções do cabeçalho IPv4, no campo ireq_opt [1]. Quando o ACK chega, o kernel cria o socket filho, a conexão de fato, e transfere a ele o que estava no pedido [1]. Se o SYN-ACK se perde, o cliente retransmite o SYN, e o kernel responde de novo a partir do mesmo pedido [1].
O cabeçalho IPv4 tem uma área opcional para instruções como Record Route, que pede que cada roteador anote seu endereço, e Timestamp, que pede marcas de tempo [2]. Esses campos são raros no tráfego normal da internet, e pacotes com cabeçalho maior que o mínimo de 20 bytes são identificáveis pelo campo de tamanho do cabeçalho [2].
O kernel usa RCU (Read-Copy-Update) para permitir leituras muito rápidas de estruturas compartilhadas: o leitor não pega trava, e quem libera a estrutura precisa esperar um período de carência, até que todos os leitores tenham saído, antes de devolver a memória [1] [2]. Liberar com kfree() sem esperar esse período quebra a garantia, e é esse o defeito da falha [2].
O Multipath TCP permite que uma única conexão use vários caminhos de rede ao mesmo tempo, comum em aparelhos com Wi-Fi e rede celular [1]. É opcional no Linux, mas há programas que o ativam sem que o administrador perceba: desde a versão 1.24, a linguagem Go abre ouvintes TCP como MPTCP por padrão quando o kernel suporta [1] [2]. Configurações por eBPF também podem forçar aplicações a usá-lo [4].
Ao criar o socket filho, tcp_v4_syn_recv_sock() passa ireq->ireq_opt para newinet->inet_opt sem copiar, e a estrutura é liberada imediatamente com kfree() quando deixa de ser necessária [1] [2]. Ao mesmo tempo, outro núcleo pode estar processando um SYN retransmitido do mesmo pedido e enviando um SYN-ACK a partir de tcp_check_req() [1]. As funções tcp_v4_send_synack() e inet_csk_route_req() leem ireq->ireq_opt só sob rcu_read_lock(), e ip_build_and_send_pkt() e ip_options_build() leem o campo opt->optlen duas vezes [1]. Se a memória for liberada e reaproveitada entre as duas leituras, o kernel monta o pacote de resposta com um tamanho e um conteúdo que não correspondem mais à estrutura original.
O aviso do kernel registra um segundo caminho para o mesmo efeito: a migração de pedidos de conexão entre sockets, quando net.ipv4.tcp_migrate_req está ligado ou um programa BPF do tipo BPF_SK_REUSEPORT_SELECT_OR_MIGRATE está em uso [1].
Segundo a equipe de CVE do kernel, o defeito pode vazar memória do kernel para o par remoto, dentro do próprio SYN-ACK, causar escrita fora dos limites no kernel ou derrubá-lo [2]. O exploit descrito pela Anthropic encadeia esses efeitos: usa o vazamento para descobrir um ponteiro do kernel e contornar o KASLR, em cerca de 48 minutos, e depois sequestra o fluxo de execução para rodar um comando como root, em cerca de 5 minutos [2] [3] [4].
O commit de Eric Dumazet troca duas chamadas kfree() por kfree_rcu(), que adia a liberação de inet_opt e ireq_opt até o fim do período de carência do RCU [2]. É uma mudança de duas linhas que fecha a corrida sem alterar o comportamento do protocolo.
O exploit funcional precisou de um ouvinte MPTCP, mas o defeito está no TCP comum por IPv4 [1] [2]. A CIQ e a equipe de segurança do Go alertam que sistemas sem MPTCP podem ser vulneráveis a ataques semelhantes [1] [2]. Não declare um servidor seguro só porque net.mptcp.enabled está em zero: sem o kernel corrigido, ele continua exposto a queda e possivelmente a mais.
A tabela reúne a cronologia, da correção ao estado das distribuições:
| Data | Evento |
|---|---|
| 1º de outubro | Correção enviada e commit criado [2] |
| 5 de outubro | Integrada à árvore de rede do kernel [2] |
| 11 de outubro | Lançamento de 7.2.10 e 6.18.56 [2] |
| 15 de outubro | Lançamento dos cinco ramos estáveis restantes; publicação da CVE [2] |
| 16 de outubro | Errata do Oracle UEK [2] |
| 18 de outubro | Lançamento do Linux 7.3 [2] |
| 27 de outubro | A Anthropic descreve o exploit funcional [2] [4] |
| 29 de outubro | A equipe do Go lembra que programas Go abrem ouvintes MPTCP por padrão desde a 1.24 [2] |
| 30 de outubro | A Red Hat eleva a classificação para crítica; Ubuntu e RHEL ainda sem kernel corrigido [1] [2] |
| 1º de novembro | A Red Hat entrega a correção para RHEL 8, 9 e 10; Ubuntu segue vulnerável [2] |
| Distribuição | Estado |
|---|---|
| Debian 12 e 13 | Corrigido em 6.1.190-1 e 6.12.113-1; testing e unstable também [1] |
| Red Hat Enterprise Linux 8, 9 e 10 | Corrigido em 1º de novembro; RHEL 7 não afetado [1] [2] |
| Ubuntu 22.04, 24.04, 26.04 e 26.10 | Vulnerável, correção em andamento, até 1º de novembro [1] [2] |
| Rocky Linux 8, 9 e 10 | Afetado; a CIQ publicou regras de firewall temporárias [1] |
| Oracle Linux, Amazon Linux e SUSE | Correções publicadas para parte das versões [1] [2] |
| Arch Linux | O pacote linux padrão já é mais novo que 7.2.10 [3] |
Não havia exploração em campo confirmada nem inclusão no catálogo KEV até 1º de novembro [1] [2]. Em 1º de novembro, 41 repositórios públicos no GitHub mencionavam a CVE, e ao menos sete descreviam um gatilho da corrida ou uma prova de conceito, sem verificação independente [2].
A falha é do kernel do host, e não da aplicação, então a verificação olhou para onde o CiberLab roda e para quem abre ouvintes TCP. A conclusão é que a aplicação não aciona MPTCP, mas o kernel dos servidores precisa ser conferido.
| Ponto verificado | Estado | Resultado |
|---|---|---|
| Uso de MPTCP pela aplicação | Busca no código, no Dockerfile e nas dependências declaradas: nenhuma ocorrência de mptcp ou IPPROTO_MPTCP | Não aciona |
| Kernel do servidor de produção | Não inspecionado; o contêiner compartilha o kernel do host | Confirmar |
| Servidor Git (Gitea) | Escrito em Go; compilado com Go 1.24 ou superior, abre ouvintes MPTCP por padrão quando o kernel suporta [1] [2] | Confirmar |
| Estação de desenvolvimento | Kernel Ubuntu 7.0.0-38-generic; o Ubuntu seguia sem correção em 1º de novembro [2] | Vulnerável |
No servidor de produção e no do Gitea, rode uname -r, consulte o rastreador da distribuição e, se o kernel não estiver corrigido, aplique a regra nftables da seção 8.2 até a atualização. Rode ss -Mlnp no host do Gitea: se houver ouvinte MPTCP exposto, defina GODEBUG=multipathtcp=0 no serviço ou net.mptcp.enabled=0 no host enquanto o kernel não for atualizado [2] [3]. Não conte o servidor como corrigido antes do reinício.
O primeiro passo é saber qual kernel está rodando, e não qual está instalado, e onde há ouvintes MPTCP [2] [3]:
# Kernel em execucao (difere do instalado ate o reinicio)
uname -r
uname -v
# Kernels instalados
dpkg -l 'linux-image*' # Debian e Ubuntu
rpm -q kernel # familia RHEL
needs-restarting -r # RHEL: reinicio pendente?
# Ouvintes TCP e MPTCP
ss -ltnp
ss -Mlnp
sysctl net.mptcp.enabled
net.mptcp.enabled ligado não prova que exista um ouvinte vulnerável; o que importa é a saída de ss -Mlnp [3].
Pacotes IPv4 TCP com opções IP são raros no tráfego da internet. Uma rajada de SYN com opções Record Route ou Timestamp contra a mesma porta, com retransmissões, é o padrão da corrida [2] [3]. A regra abaixo alerta esse padrão em sensores de borda:
alert tcp $EXTERNAL_NET any -> $HOME_NET any (msg:"CIBERLAB LINUX CVE-2026-98432 TCP SYN WITH IPV4 OPTIONS BURST"; \
flags:S,12; ipopts:any; \
threshold:type both, track by_src, count 50, seconds 60; \
classtype:attempted-admin; sid:9000311; rev:1; \
reference:cve,2026-98432; reference:url,ciberlab.seg.br/reports/linux-tcp-uaf;)
Observe quedas repetidas do kernel, falhas inexplicadas de ouvintes e tráfego de entrada com opções IPv4 [3]. Processos com privilégio de root que surgem depois desse tipo de atividade justificam isolar a máquina e preservar evidências [3]. Depois do reinício, confira systemctl --failed e journalctl -k -b -p warning [3].
Instale o kernel corrigido pelo caminho normal da distribuição e reinicie numa janela aprovada [3]. Não aplique o commit do upstream à mão num kernel de produção de distribuição [3]. A condição de encerramento é cada servidor rodando um kernel que a distribuição confirma como corrigido, e os ouvintes de maior risco verificados quanto a sinais de exploração anterior [3].
Enquanto o kernel não é atualizado, a medida mais eficaz é descartar pacotes IPv4 TCP com opções antes que cheguem ao código vulnerável [1] [2]:
table ip cve_2026_98432 {
chain prerouting {
type filter hook prerouting priority -300; policy accept;
ip protocol tcp ip hdrlength gt 5 drop
}
}
xt_u32, que não existe nessas versões [2]. As duas regras somem no reinício [2].net.mptcp.enabled=0 e reinicie os serviços com ouvintes MPTCP; contêineres precisam do ajuste no próprio namespace [2]. Em programas Go, GODEBUG=multipathtcp=0 desliga o padrão, o que a equipe do Go considera frágil [2].A Atlas verificou que a regra nftables não afeta o TCP normal, mas não a testou contra o exploit; a Red Hat afirma que sua regra na cadeia de entrada não consegue impedir a falha por completo [2]. Não use o filtro como motivo para adiar o reinício. Ele compra tempo; só o kernel corrigido fecha a falha.
O reinício depois da atualização impede novo disparo, mas não remove persistência nem credenciais roubadas antes dele [3]. Num servidor com sinais da seção 7.3 e kernel vulnerável exposto, preserve memória e registros antes de reiniciar, gire as credenciais acessíveis ao host e reconstrua a partir de imagem limpa.
IDs e nomes conferidos na base oficial do MITRE ATT&CK for Enterprise [5]:
| Técnica | Nome | Relação com o caso |
|---|---|---|
| T1210 | Exploitation of Remote Services | Corrida no aperto de mão TCP de um ouvinte exposto, sem autenticação [1] [4] |
| T1068 | Exploitation for Privilege Escalation | Execução no contexto do kernel, com privilégio de root [1] [4] |
| T1005 | Data from Local System | Vazamento de memória do kernel no SYN-ACK [2] |
| T1499.004 | Endpoint Denial of Service: Application or System Exploitation | Queda do kernel, o desfecho mais provável de tentativas malsucedidas [1] [2] |
Nenhuma fonte publicou IPs, domínios, hashes ou assinaturas de exploração [2] [3]. Os indicadores abaixo são de exposição e de comportamento:
| Tipo | Indicador | Severidade | Contexto e ação |
|---|---|---|---|
| Vulnerabilidade | CVE-2026-98432 | Crítica | Uso após liberação no TCP IPv4, remoto e sem autenticação. Atualize o kernel e reinicie [1] [2]. |
| Rede | SYN IPv4 com ip hdrlength > 5 | Alta | Opções Record Route ou Timestamp no SYN; descarte na entrada até a atualização [2]. |
| Exposição | ss -Mlnp com ouvinte público | Alta | Ouvinte MPTCP alcançável da internet, o caminho do exploit demonstrado [1] [3]. |
| Exposição | net.ipv4.tcp_migrate_req = 1 | Média | Segundo caminho para a mesma corrida [1]. |
| Host | queda de kernel ou de ouvinte sem causa | Alta | Correlacione com tráfego de entrada com opções IPv4 [3]. |
| Host | processo root novo após rajada de SYN | Crítica | Possível exploração bem-sucedida; isole e preserve evidências [3]. |
CVE-2026-98432, uso após liberação no TCP IPv4 do kernel Linux. Relatório técnico de análise de vulnerabilidade, versão 1.0, emitido em 2 de novembro de 2026.
CiberLab, uma iniciativa do Ciência Embarcada.
Classificado TLP:CLEAR: distribuição livre, sem restrição de compartilhamento.