Fortinet PSIRT advisory FG-IR-26-188 describes Linux kernel IPv4 TCP use-after-free (CVE-2026-98432)
Fortinet PSIRT published advisory FG-IR-26-188 on 2026-11-02 for CVE-2026-98432, a use-after-free in the Linux kernel IPv4 TCP stack (inet_opt / ireq_opt handling). The article does not specify which Fortinet products are affected. It does not state active exploitation, a CVSS score, fixed versions or attribution. IPv6 is not affected by the first issue, and the IPv6 migration variant tied to CALIPSO will be fixed in a separate patch.
Entenda a falha
A vulnerabilidade
CVE-2026-98432 is a use-after-free in the Linux kernel IPv4 TCP stack, in the handling of inet_opt / ireq_opt (IP options of request and child sockets). It is reachable through normal TCP handshake traffic: a retransmitted SYN processed on another CPU while the child socket is being freed. The articles give no CVSS score, no attacker prerequisites beyond this race, no affected or fixed versions, and no report of exploitation. Fortinet's advisory FG-IR-26-188 lists many Fortinet products but does not say which are affected. IPv6 is not affected by the first issue.
Como funciona
When the handshake completes, tcp_v4_syn_recv_sock() hands ireq->ireq_opt to the new child socket (as inet_opt) without copying it. If the client retransmits its SYN, another CPU can handle it for the same request socket and send a SYNACK from tcp_check_req(). That path (tcp_v4_send_synack(), inet_csk_route_req()) reads ireq_opt under rcu_read_lock() only, and ip_build_and_send_pkt() / ip_options_build() read opt->optlen twice. Meanwhile the child can be destroyed and its options freed, so the SYNACK builder reads freed memory. A similar race exists with request socket migration, where the old and cloned request sockets share ireq_opt.
Por que é vulnerável
Since commit 079096f103fa, request sockets are processed without the listener lock, so nothing stops the child from being freed while a SYNACK is still being built. TCP child sockets lack SOCK_RCU_FREE, and inet_sock_destruct() frees inet_opt with a plain kfree() even though readers rely on RCU. In migration (net.ipv4.tcp_migrate_req=1 or a BPF_SK_REUSEPORT_SELECT_OR_MIGRATE program), reqsk_timer_handler() clones the request socket via inet_reqsk_clone(), and tcp_v4_reqsk_destructor() also uses a plain kfree(). The fix uses kfree_rcu() in inet_sock_destruct() and tcp_v4_reqsk_destructor(), as other paths that replace inet_opt already do.
Onde está
Linux kernel IPv4 TCP: tcp_v4_syn_recv_sock(), tcp_check_req(), tcp_v4_send_synack(), inet_csk_route_req(), ip_build_and_send_pkt(), ip_options_build(), reqsk_timer_handler(), inet_sock_destruct() and tcp_v4_reqsk_destructor(); the race was introduced by commit 079096f103fa.
Como foi descoberta
The articles do not say who found the flaw or how. Fortinet PSIRT published advisory FG-IR-26-188 on 2026-11-02 (initial publication), with the description matching a kernel patch. The IPv6 variant tied to CALIPSO (ipv6_opt in tcp_v6_reqsk_destructor()) will be handled in a separate patch.
Explicação gerada por IA a partir da matéria e dos artigos, em 02/11/2026 14:19.
Detalhes técnicos
tcp_v4_syn_recv_sock()transfers ownership ofireq->ireq_optto the child socket without copying it. Another CPU can concurrently handle a retransmitted SYN for the same request socket and send a SYNACK fromtcp_check_req().tcp_v4_send_synack()andinet_csk_route_req()readireq->ireq_optunderrcu_read_lock()only, andip_build_and_send_pkt()/ip_options_build()readopt->optlentwice.- Since commit 079096f103fa, request sockets are processed without the listener lock, so the child socket can be freed while the SYNACK is still being built. TCP child sockets lack
SOCK_RCU_FREE, andinet_sock_destruct()freesinet_optwith a plainkfree(), causing a use-after-free inip_options_build(). - A similar issue exists with request socket migration (
net.ipv4.tcp_migrate_req=1or aBPF_SK_REUSEPORT_SELECT_OR_MIGRATEprogram).reqsk_timer_handler()clones the request socket viainet_reqsk_clone(), so the old and cloned sockets shareireq_opt, andtcp_v4_reqsk_destructor()also uses a plainkfree(). - The fix described uses
kfree_rcu()ininet_sock_destruct()andtcp_v4_reqsk_destructor(), consistent with other paths that replaceinet_opt.
Remediação
The article gives no fixed versions and does not specify which Fortinet products are affected. Defenders should consult the FG-IR-26-188 advisory for affected products and apply the fix described (kfree_rcu() in the two destructors) once it is available in their kernel.
Linha do tempo
-
Fortinet PSIRT advisory FG-IR-26-188 describes Linux kernel IPv4 TCP use-after-free (CVE-2026-98432)
ler a análise desta fonte ocultar
Fortinet PSIRT published advisory FG-IR-26-188 on 2026-11-02 for CVE-2026-98432, a use-after-free in the Linux kernel IPv4 TCP stack (
inet_opt/ireq_opthandling). The article does not specify which Fortinet products are affected. It does not state active exploitation, a CVSS score, fixed versions or attribution. IPv6 is not affected by the first issue, and the IPv6 migration variant tied to CALIPSO will be fixed in a separate patch.Technical Details
tcp_v4_syn_recv_sock()transfers ownership ofireq->ireq_optto the child socket without copying it. Another CPU can concurrently handle a retransmitted SYN for the same request socket and send a SYNACK fromtcp_check_req().tcp_v4_send_synack()andinet_csk_route_req()readireq->ireq_optunderrcu_read_lock()only, andip_build_and_send_pkt()/ip_options_build()readopt->optlentwice.- Since commit 079096f103fa, request sockets are processed without the listener lock, so the child socket can be freed while the SYNACK is still being built. TCP child sockets lack
SOCK_RCU_FREE, andinet_sock_destruct()freesinet_optwith a plainkfree(), causing a use-after-free inip_options_build(). - A similar issue exists with request socket migration (
net.ipv4.tcp_migrate_req=1or aBPF_SK_REUSEPORT_SELECT_OR_MIGRATEprogram).reqsk_timer_handler()clones the request socket viainet_reqsk_clone(), so the old and cloned sockets shareireq_opt, andtcp_v4_reqsk_destructor()also uses a plainkfree(). - The fix described uses
kfree_rcu()ininet_sock_destruct()andtcp_v4_reqsk_destructor(), consistent with other paths that replaceinet_opt.
Remediation
The article gives no fixed versions and does not specify which Fortinet products are affected. Defenders should consult the FG-IR-26-188 advisory for affected products and apply the fix described (
kfree_rcu()in the two destructors) once it is available in their kernel.