From: Florian Westphal <fw@strlen.de>
To: yyxRoy <yyxroy22@gmail.com>
Cc: pablo@netfilter.org, kadlec@netfilter.org,
gregkh@linuxfoundation.org, davem@davemloft.net,
edumazet@google.com, kuba@kernel.org, pabeni@redhat.com,
netfilter-devel@vger.kernel.org, coreteam@netfilter.org,
netdev@vger.kernel.org, linux-kernel@vger.kernel.org,
yyxRoy <979093444@qq.com>
Subject: Re: [PATCH] netfilter: conntrack: tcp: do not lower timeout to CLOSE for in-window RSTs
Date: Fri, 5 Jul 2024 11:43:33 +0200 [thread overview]
Message-ID: <20240705094333.GB30758@breakpoint.cc> (raw)
In-Reply-To: <20240705040013.29860-1-979093444@qq.com>
yyxRoy <yyxroy22@gmail.com> wrote:
> With previous commit https://github.com/torvalds/linux/commit/be0502a
> ("netfilter: conntrack: tcp: only close if RST matches exact sequence")
> to fight against TCP in-window reset attacks, current version of netfilter
> will keep the connection state in ESTABLISHED, but lower the timeout to
> that of CLOSE (10 seconds by default) for in-window TCP RSTs, and wait for
> the peer to send a challenge ack to restore the connection timeout
> (5 mins in tests).
>
> However, malicious attackers can prevent incurring challenge ACKs by
> manipulating the TTL value of RSTs. The attacker can probe the TTL value
> between the NAT device and itself and send in-window RST packets with
> a TTL value to be decreased to 0 after arriving at the NAT device.
> This causes the packet to be dropped rather than forwarded to the
> internal client, thus preventing a challenge ACK from being triggered.
> As the window of the sequence number is quite large (bigger than 60,000
> in tests) and the sequence number is 16-bit, the attacker only needs to
> send nearly 60,000 RST packets with different sequence numbers
> (i.e., 1, 60001, 120001, and so on) and one of them will definitely
> fall within in the window.
>
> Therefore we can't simply lower the connection timeout to 10 seconds
> (rather short) upon receiving in-window RSTs. With this patch, netfilter
> will lower the connection timeout to that of CLOSE only when it receives
> RSTs with exact sequence numbers (i.e., old_state != new_state).
This effectively ignores most RST packets, which will clog up the
conntrack table (established timeout is 5 days).
I don't think there is anything sensible that we can do here.
Also, one can send train with data packet + rst and we will hit
the immediate close conditional:
/* Check if rst is part of train, such as
* foo:80 > bar:4379: P, 235946583:235946602(19) ack 42
* foo:80 > bar:4379: R, 235946602:235946602(0) ack 42
*/
if (ct->proto.tcp.last_index == TCP_ACK_SET &&
ct->proto.tcp.last_dir == dir &&
seq == ct->proto.tcp.last_end)
break;
So even if we'd make this change it doesn't prevent remote induced
resets.
Conntrack cannot validate RSTs precisely due to lack of information,
only the endpoints can do this.
next prev parent reply other threads:[~2024-07-05 9:43 UTC|newest]
Thread overview: 8+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-07-05 4:00 [PATCH] netfilter: conntrack: tcp: do not lower timeout to CLOSE for in-window RSTs yyxRoy
2024-07-05 9:43 ` Florian Westphal [this message]
2024-07-06 16:16 ` Jozsef Kadlecsik
2024-07-06 17:04 ` Florian Westphal
2024-07-08 8:59 ` yyxRoy
2024-07-08 14:12 ` Florian Westphal
2024-07-10 9:45 ` yyxRoy
2024-07-10 13:49 ` Jozsef Kadlecsik
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=20240705094333.GB30758@breakpoint.cc \
--to=fw@strlen.de \
--cc=979093444@qq.com \
--cc=coreteam@netfilter.org \
--cc=davem@davemloft.net \
--cc=edumazet@google.com \
--cc=gregkh@linuxfoundation.org \
--cc=kadlec@netfilter.org \
--cc=kuba@kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=netdev@vger.kernel.org \
--cc=netfilter-devel@vger.kernel.org \
--cc=pabeni@redhat.com \
--cc=pablo@netfilter.org \
--cc=yyxroy22@gmail.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox