CVE-2026-98432
ipv4: libera inet_opt e ireq_opt após um período de carência do RCU
- Publicado
- 15 de out. de 2026
- Atualizado
- 3 de nov. de 2026
- Atribuindo CNA
- Linux
- Evidência observada
- 1 de nov. de 2026
CVSS primário
nvd · CVSS 3.1
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:HBaixo · próximos 30 dias
- Percentil
- 39,6%
- Data do modelo
- 2 de nov. de 2026
EPSS é uma estimativa estatística, não uma certeza ou uma medida de impacto. Combine-o com CVSS, status KEV, exposição e seu ambiente.
Resumo
No kernel Linux, a seguinte vulnerabilidade foi resolvida: ipv4: liberar inet_opt e ireq_opt após um período de carência do RCU tcp_v4_syn_recv_sock() transfere a propriedade de ireq->ireq_opt para o socket filho (newinet->inet_opt) sem copiá-lo. Outra cpu pode processar simultaneamente um SYN retransmitido para o mesmo request socket, e enviar um SYNACK a partir de tcp_check_req(). tcp_v4_send_synack() e inet_csk_route_req() leem ireq->ireq_opt apenas sob rcu_read_lock(), e ip_build_and_send_pkt() e ip_options_build() então leem opt->optlen duas vezes. Observe que o próprio timer do SYNACK não é um problema: ele mantém uma referência em seu request socket, e inet_csk_reqsk_queue_drop() chama timer_delete_sync() antes que o filho possa ser liberado. Desde o commit 079096f103fa ("tcp/dccp: install syn_recv requests into ehash table"), os request sockets são processados sem manter o lock do listener, então nada impede que o socket filho seja liberado enquanto o SYNACK ainda está sendo construído. Sockets filhos TCP não têm SOCK_RCU_FREE, e inet_sock_destruct() libera inet_opt com um kfree() simples, levando a um use-after-free em ip_options_build(). Um problema semelhante existe com a migração de request socket (net.ipv4.tcp_migrate_req=1, ou um programa BPF_SK_REUSEPORT_SELECT_OR_MIGRATE). reqsk_timer_handler() clona o request socket com inet_reqsk_clone(), de modo que o request socket antigo e seu clone compartilham o mesmo ireq_opt, e então reqsk_migrate_reset() limpa o ponteiro no antigo. Outra cpu mantendo uma referência no request socket antigo ainda pode estar usando essas opções (enviando um SYNACK, ou criando um filho em tcp_v4_syn_recv_sock()) quando o clone é liberado, e tcp_v4_reqsk_destructor() também usa um kfree() simples. Os leitores já usam RCU, e outros caminhos que substituem inet_opt (do_ip_setsockopt(), cipso_v4_sock_setattr()...) já usam kfree_rcu(). Use kfree_rcu() em inet_sock_destruct() e tcp_v4_reqsk_destructor() também. O IPv6 não é afetado pelo primeiro problema, porque tcp_v6_syn_recv_sock() duplica as opções. tcp_v6_reqsk_destructor() tem o mesmo problema de migração com ipv6_opt, que só é definido pelo CALIPSO. Isso será tratado em um patch separado.
Fontes
Uso responsável
Use informações de vulnerabilidade apenas em sistemas que você possui ou está autorizado a testar. O Kitploit vincula-se a metadados de pesquisa pública e não armazena código de exploração ou cargas maliciosas.