CVE-2026-98432
ipv4: inet_opt und ireq_opt nach einer RCU-Grace-Period freigeben
- Veröffentlicht
- 15.10.2026
- Aktualisiert
- 03.11.2026
- CNA zuweisen
- Linux
- Beweise beobachtet
- 01.11.2026
Primäres CVSS
nvd · CVSS 3.1
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:HNiedrig · nächste 30 Tage
- Perzentil
- 39,6 %
- Modelldatum
- 02.11.2026
EPSS ist eine statistische Schätzung, keine Gewissheit oder ein Maß für die Auswirkung. Kombinieren Sie es mit CVSS, KEV-Status, Belichtung und Ihrer Umgebung.
Zusammenfassung
Im Linux-Kernel wurde die folgende Schwachstelle behoben: ipv4: inet_opt und ireq_opt nach einer RCU-Grace-Period freigeben. tcp_v4_syn_recv_sock() überträgt den Besitz von ireq->ireq_opt auf den untergeordneten Socket (newinet->inet_opt), ohne ihn zu kopieren. Eine andere CPU kann gleichzeitig ein erneut übertragenes SYN für denselben Request-Socket verarbeiten und ein SYNACK aus tcp_check_req() senden. tcp_v4_send_synack() und inet_csk_route_req() lesen ireq->ireq_opt nur unter rcu_read_lock(), und ip_build_and_send_pkt() sowie ip_options_build() lesen opt->optlen dann zweimal. Beachten Sie, dass der SYNACK-Timer selbst kein Problem darstellt: Er hält eine Referenz auf seinen Request-Socket, und inet_csk_reqsk_queue_drop() ruft timer_delete_sync() auf, bevor der untergeordnete Socket freigegeben werden kann. Seit Commit 079096f103fa („tcp/dccp: install syn_recv requests into ehash table“) werden Request-Sockets verarbeitet, ohne den Listener-Lock zu halten, sodass nichts verhindert, dass der untergeordnete Socket freigegeben wird, während das SYNACK noch aufgebaut wird. TCP-Kind-Sockets haben kein SOCK_RCU_FREE, und inet_sock_destruct() gibt inet_opt mit einem einfachen kfree() frei, was zu einer Use-after-free in ip_options_build() führt. Ein ähnliches Problem besteht bei der Migration von Request-Sockets (net.ipv4.tcp_migrate_req=1 oder ein BPF_SK_REUSEPORT_SELECT_OR_MIGRATE-Programm). reqsk_timer_handler() klont den Request-Socket mit inet_reqsk_clone(), sodass der alte Request-Socket und sein Klon dasselbe ireq_opt teilen, und reqsk_migrate_reset() löscht dann den Zeiger im alten Socket. Eine andere CPU, die eine Referenz auf den alten Request-Socket hält, kann diese Optionen noch verwenden (Senden eines SYNACK oder Erzeugen eines untergeordneten Sockets in tcp_v4_syn_recv_sock()), wenn der Klon freigegeben wird, und tcp_v4_reqsk_destructor() verwendet ebenfalls ein einfaches kfree(). Leser verwenden bereits RCU, und andere Pfade, die inet_opt ersetzen (do_ip_setsockopt(), cipso_v4_sock_setattr()...), verwenden bereits kfree_rcu(). Verwenden Sie kfree_rcu() auch in inet_sock_destruct() und tcp_v4_reqsk_destructor(). IPv6 ist vom ersten Problem nicht betroffen, da tcp_v6_syn_recv_sock() die Optionen dupliziert. tcp_v6_reqsk_destructor() hat dasselbe Migrationsproblem mit ipv6_opt, das nur von CALIPSO gesetzt wird. Dies wird in einem separaten Patch behandelt.
Quellen
Verantwortungsvoller Umgang
Verwenden Sie Schwachstelleninformationen nur auf Systemen, die Sie besitzen oder zu deren Testen Sie berechtigt sind. Kitploit verlinkt auf öffentliche Forschungsmetadaten und speichert keinen Exploit-Code oder bösartige Payloads.