linux/net
Eric Dumazet e3f33b0a1d ipv4: free inet_opt and ireq_opt after an RCU grace period
tcp_v4_syn_recv_sock() transfers ownership of ireq->ireq_opt to the
child socket (newinet->inet_opt) without copying it.

Another cpu can concurrently process a retransmitted SYN for the same
request socket, and send a SYNACK from tcp_check_req().
tcp_v4_send_synack() and inet_csk_route_req() read ireq->ireq_opt
under rcu_read_lock() only, and ip_build_and_send_pkt() and
ip_options_build() then read opt->optlen twice.

Note that the SYNACK timer itself is not an issue: it holds a
reference on its request socket, and inet_csk_reqsk_queue_drop()
calls timer_delete_sync() before the child can be freed.

Since commit 079096f103 ("tcp/dccp: install syn_recv requests
into ehash table"), request sockets are processed without holding
the listener lock, so nothing prevents the child socket from being
freed while the SYNACK is still being built. TCP child sockets do
not have SOCK_RCU_FREE, and inet_sock_destruct() frees inet_opt
with a plain kfree(), leading to a use-after-free in
ip_options_build().

A similar issue exists with request socket migration
(net.ipv4.tcp_migrate_req=1, or a BPF_SK_REUSEPORT_SELECT_OR_MIGRATE
program). reqsk_timer_handler() clones the request socket with
inet_reqsk_clone(), so that the old request socket and its clone
share the same ireq_opt, then reqsk_migrate_reset() clears the
pointer in the old one. Another cpu holding a reference on the old
request socket can still be using these options (sending a SYNACK,
or creating a child in tcp_v4_syn_recv_sock()) when the clone is
freed, and tcp_v4_reqsk_destructor() also uses a plain kfree().

Readers already use RCU, and other paths replacing inet_opt
(do_ip_setsockopt(), cipso_v4_sock_setattr()...) already use
kfree_rcu(). Use kfree_rcu() in inet_sock_destruct() and
tcp_v4_reqsk_destructor() as well.

IPv6 is not affected by the first issue, because tcp_v6_syn_recv_sock()
duplicates the options. tcp_v6_reqsk_destructor() has the same
migration issue with ipv6_opt, which is only set by CALIPSO. This
will be addressed in a separate patch.

Fixes: 079096f103 ("tcp/dccp: install syn_recv requests into ehash table")
Fixes: c905dee622 ("tcp: Migrate TCP_NEW_SYN_RECV requests at retransmitting SYN+ACKs.")
Reported-by: Xinyang Ge <xinyang@anthropic.com>
Signed-off-by: Eric Dumazet <edumazet@kernel.org>
Reviewed-by: Kuniyuki Iwashima <kuniyu@google.com>
Link: https://patch.msgid.link/20261001221253.2964024-1-edumazet@kernel.org
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
2026-10-05 16:21:57 -07:00
..
6lowpan net: 6lowpan: fix mismatched comments 2026-09-02 09:03:06 +02:00
9p
802
8021q vlan: ensure sufficient headroom in vlan_dev_hard_header() 2026-09-24 11:00:59 -07:00
atm pppoatm: ensure a writable skb header and linear data 2026-09-15 17:07:01 -07:00
batman-adv treewide: refresh kmalloc_obj() conversions 2026-09-04 21:37:00 -07:00
bluetooth Bluetooth: hci_core: Serialize SCO and ISO scheduling with teardown 2026-09-28 11:00:20 -04:00
bpf bpf: Use kvfree() in xdp_test_run_teardown() 2026-09-12 12:11:41 -07:00
bridge net: bridge: avoid recursive multicast port cleanup 2026-10-05 03:29:53 +01:00
can
ceph libceph: remove pinning assertion in ceph_msg_data_iter_next() 2026-09-02 12:23:05 +02:00
core net: make dev_xdp_sb_prog_count() see programs attached through a link 2026-10-05 15:01:19 -07:00
dcb
devlink treewide: refresh kmalloc_obj() conversions 2026-09-04 21:37:00 -07:00
dns_resolver
dsa net: dsa: tag_brcm: legacy FCS: request needed tailroom 2026-09-09 13:31:08 -07:00
ethernet
ethtool net: ethtool: let tsconfig reach a PHY-only timestamp provider 2026-09-28 19:26:41 -07:00
handshake
hsr net: hsr: enable promiscuous mode on interlink port with fwd offload 2026-09-10 08:45:00 -07:00
ieee802154 ieee802154: 6lowpan: fix NULL dereference in lowpan_newlink 2026-09-02 09:54:27 +02:00
ife net/sched: act_ife: Only operate on Ethernet frames 2026-08-24 11:59:59 -07:00
ipv4 ipv4: free inet_opt and ireq_opt after an RCU grace period 2026-10-05 16:21:57 -07:00
ipv6 ipv6: sr: use skb_get_hash_net() in seg6_make_flowlabel() 2026-09-30 17:37:47 -07:00
iucv net/iucv: fix the recvmsg window update 2026-08-31 15:51:22 -07:00
kcm net: kcm: Hold RCU read lock while running BPF parser 2026-08-17 13:43:58 -07:00
key
l2tp net: l2tp: do not propagate multicast notification errors 2026-08-24 11:43:28 -07:00
l3mdev
lapb
llc llc: fix skb UAF and leaks on llc_mac_hdr_init() failure 2026-09-24 11:00:59 -07:00
mac80211 netfilter pull request 26-09-30 2026-10-01 12:00:40 +02:00
mac802154 mac802154: fix use-after-free of sdata via queued RX frames 2026-09-03 11:00:54 +02:00
mctp net/mctp: publish the mctp_dev only after it is initialised 2026-09-25 16:34:40 -07:00
mpls Summary 2026-08-20 08:46:41 -07:00
mptcp mptcp: fix bad accounting in __mptcp_subflow_push_pending() 2026-09-17 08:14:33 -07:00
ncsi
netfilter netfilter: flowtable: restore ieee80211 forward path 2026-09-30 09:35:20 +02:00
netlabel
netlink genetlink: report the real command id for dump-only ops in policy dumps 2026-09-22 15:21:32 +02:00
nfc nfc: llcp: fix slab-out-of-bounds reads when logging service names 2026-09-23 22:13:17 +02:00
nsh
openvswitch openvswitch: fix soft lockup in the netlink flow dump 2026-10-05 03:51:13 +01:00
packet net/packet: guard the ll header push in packet_rcv_spkt() 2026-10-01 18:24:13 -07:00
phonet
psample
psp net: psp: avoid conflicts with skb->decrypted and sk_validate_xmit_skb() 2026-09-16 19:18:24 -07:00
qrtr net: qrtr: resend HELLO on MHI resume 2026-09-20 11:21:10 -07:00
rds net/rds: size a connection's path set by the transport it ends up with 2026-09-24 10:03:23 -07:00
rfkill
rxrpc treewide: refresh kmalloc_obj() conversions 2026-09-04 21:37:00 -07:00
sched net/sched: em_text: reject unterminated algo before autoload 2026-10-01 17:59:43 -07:00
sctp sctp: check RCV_SHUTDOWN after the sendmsg connect wait 2026-09-30 16:55:47 -07:00
shaper
smc net/smc: fix UAF on lgr list traversal in smcr_port_err() 2026-09-24 10:19:50 -07:00
strparser
sunrpc treewide: refresh kmalloc_obj() conversions 2026-09-04 21:37:00 -07:00
switchdev
tipc tipc: destroy topsrv workqueues before closing connections 2026-10-02 08:20:15 +01:00
tls tls: device: fix out-of-bounds write in tls_append_frag() 2026-08-25 10:04:02 +02:00
unix af_unix: Unify scc_index when finalising SCC in __unix_walk_scc(). 2026-09-15 16:45:05 -07:00
vmw_vsock vsock: ignore empty child namespace mode writes 2026-09-17 19:06:31 -07:00
wireless wifi: cfg80211: preserve hidden-group beacon IE ownership 2026-09-22 10:47:54 +02:00
x25
xdp xsk: Use a 32-bit compare in xsk_map_gen_lookup 2026-09-17 10:56:16 -07:00
xfrm ipsec-2026-09-16 2026-09-16 15:54:19 -07:00
compat.c net: af_unix: useful handling of LSM denials on SCM_RIGHTS 2026-08-17 18:14:52 -07:00
devres.c
Kconfig
Kconfig.debug
Makefile
socket.c Major changes: 2026-08-20 07:36:20 -07:00
sysctl_net.c net: enforce net sysctl registration 2026-08-13 13:12:21 +02:00