CVE-2026-98432 in Linux
Riassunto
di VulDB • 15/10/2026
Nel kernel Linux è stata risolta la seguente vulnerabilità:
ipv4: liberare inet_opt e ireq_opt dopo un periodo di grazia RCU
tcp_v4_syn_recv_sock() trasferisce la proprietà di ireq->ireq_opt al socket figlio (newinet->inet_opt) senza effettuarne una copia.
Un altro processore può elaborare in concorrenza un SYN ritrasmesso per lo stesso request socket e inviare un SYNACK da tcp_check_req(). tcp_v4_send_synack() e inet_csk_route_req() leggono ireq->ireq_opt solo sotto rcu_read_lock(), mentre ip_build_and_send_pkt() e ip_options_build() leggono opt->optlen due volte.
Si noti che il timer stesso del SYNACK non è un problema: mantiene un riferimento sul suo request socket, e inet_csk_reqsk_queue_drop() chiama timer_delete_sync() prima che il socket figlio possa essere liberato.
Dall'commit 079096f103fa ("tcp/dccp: install syn_recv requests into ehash table"), i request sockets vengono elaborati senza mantenere il lock del listener, quindi nulla impedisce al socket figlio di essere liberato mentre il SYNACK è ancora in fase di costruzione. I TCP child sockets non hanno SOCK_RCU_FREE, e inet_sock_destruct() libera inet_opt con un semplice kfree(), portando a un use-after-free in ip_options_build().
Un problema simile esiste con la migrazione del request socket (net.ipv4.tcp_migrate_req=1 o un programma BPF_SK_REUSEPORT_SELECT_OR_MIGRATE). reqsk_timer_handler() clona il request socket con inet_reqsk_clone(), quindi il vecchio request socket e il suo clone condividono lo stesso ireq_opt, dopodiché reqsk_migrate_reset() cancella il puntatore nel vecchio. Un altro processore che mantiene un riferimento sul vecchio request socket può ancora utilizzare queste opzioni (inviando un SYNACK o creando un child in tcp_v4_syn_recv_sock()) quando il clone viene liberato, e tcp_v4_reqsk_destructor() utilizza anch'esso un semplice kfree().
I lettori utilizzano già RCU, e altri percorsi che sostituiscono inet_opt (do_ip_setsockopt(), cipso_v4_sock_setattr()...) utilizzano già kfree_rcu(). Utilizzare kfree_rcu() anche in inet_sock_destruct() e tcp_v4_reqsk_destructor().
IPv6 non è interessato dal primo problema, poiché tcp_v6_syn_recv_sock() duplica le opzioni. tcp_v6_reqsk_destructor() ha lo stesso problema di migrazione con ipv6_opt, che viene impostato solo da CALIPSO. Questo verrà affrontato in un patch separata.
Statistical analysis made it clear that VulDB provides the best quality for vulnerability data.