From: Simon Horman <horms@kernel.org>
To: Hyunwoo Kim <imv4bel@gmail.com>
Cc: edumazet@google.com, ncardwell@google.com, kuniyu@google.com,
davem@davemloft.net, kuba@kernel.org, pabeni@redhat.com,
dsahern@kernel.org, 0x7f454c46@gmail.com, fruggeri@arista.com,
noureddine@arista.com, netdev@vger.kernel.org
Subject: Re: [PATCH net] net/tcp-ao: fix use-after-free of current_key on reconnect to another peer
Date: Wed, 19 Aug 2026 17:56:40 +0100 [thread overview]
Message-ID: <20260819165640.GW265046@horms.kernel.org> (raw)
In-Reply-To: <aoIriv3pHDgII2YR@v4bel>
On Mon, Aug 17, 2026 at 06:28:42AM +0900, Hyunwoo Kim wrote:
> tcp_inbound_ao_hash() is called before bh_lock_sock_nested() is taken,
> with only rcu_read_lock() held. On the fast path for established
> sockets, if the rnext_keyid sent by the peer differs from
> current_key->sndid, the key the peer asked for is looked up and stored
> in current_key. The lookup is inside the RCU read side, but current_key
> outlives it.
>
> When the socket is disconnected and connect() is called again for
> another peer, tcp_ao_connect_init() unlinks every key that does not
> match the new peer and frees it with call_rcu(). If current_key points
> at such a key, it is cleared to NULL.
>
> The fast path reads sk_state only once on entry, so a softirq that got
> into it while the socket was still established can update current_key
> after that loop has already run. The update is inside the RCU read side,
> so it comes before the call_rcu() callback, and once the callback frees
> the key, current_key is left pointing at freed memory.
>
> The next transmission picks that pointer up in tcp_get_current_key().
> tcp_ao_transmit_skb() then reads the traffic key from the freed object,
> which is the use-after-free.
>
> Wait for one grace period before unlinking, and only if a key is going
> to be removed. By the time tcp_connect() runs the socket is already in
> TCP_SYN_SENT, and TCP_AO_ESTABLISHED does not contain TCPF_SYN_SENT, so
> a softirq entering after the wait cannot reach the fast path, and the
> ones already in it have finished. The existing NULL handling in the loop
> is then enough.
>
> Fixes: 0a3a809089eb ("net/tcp: Verify inbound TCP-AO signed segments")
> Cc: stable@vger.kernel.org
> Signed-off-by: Hyunwoo Kim <imv4bel@gmail.com>
I do have some concern about potential performance impact of using
synchronize_rcu(). But on the balance I agree that this is a good
bug-fix patch.
Reviewed-by: Simon Horman <horms@kernel.org>
next prev parent reply other threads:[~2026-08-19 16:56 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-08-16 21:28 [PATCH net] net/tcp-ao: fix use-after-free of current_key on reconnect to another peer Hyunwoo Kim
2026-08-19 16:56 ` Simon Horman [this message]
2026-08-20 10:49 ` Paolo Abeni
2026-08-20 19:30 ` patchwork-bot+netdevbpf
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20260819165640.GW265046@horms.kernel.org \
--to=horms@kernel.org \
--cc=0x7f454c46@gmail.com \
--cc=davem@davemloft.net \
--cc=dsahern@kernel.org \
--cc=edumazet@google.com \
--cc=fruggeri@arista.com \
--cc=imv4bel@gmail.com \
--cc=kuba@kernel.org \
--cc=kuniyu@google.com \
--cc=ncardwell@google.com \
--cc=netdev@vger.kernel.org \
--cc=noureddine@arista.com \
--cc=pabeni@redhat.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.