Alexander:
In-line
On 5/6/24 3:27 AM, Alexander Leidinger wrote:
Am 2024-05-05 15:10, schrieb Randall Stewart:
The branch main has been updated by rrs:
URL:
https://cgit.FreeBSD.org/src/commit/?id=fce03f85c5bfc0d73fb5c43ac1affad73efab11a
commit fce03f85c5bfc0d73fb5c43ac1affad73efab11a
Author: Randall Stewart <r...@freebsd.org>
AuthorDate: 2024-05-05 13:08:47 +0000
Commit: Randall Stewart <r...@freebsd.org>
CommitDate: 2024-05-05 13:08:47 +0000
TCP can be subject to Sack Attacks lets fix this issue.
There is a type of attack that a TCP peer can launch on a
connection. This is for sure in Rack or BBR and probably even the
default stack if it uses lists in sack processing. The idea of the
attack is that the attacker is driving you to look at 100's of sack
blocks that only update 1 byte. So for example if you have 1 - 10,000
bytes outstanding the attacker sends in something like:
ACK 0 SACK(1-512) SACK(1024 - 1536), SACK(2048-2536), SACK(4096 -
4608), SACK(8192-8704)
This first sack looks fine but then the attacker sends
ACK 0 SACK(1-512) SACK(1025 - 1537), SACK(2049-2537), SACK(4097 -
4609), SACK(8193-8705)
ACK 0 SACK(1-512) SACK(1027 - 1539), SACK(2051-2539), SACK(4099 -
4611), SACK(8195-8707)
...
These blocks are making you hunt across your linked list and
split things up so that you have an entry for every other byte. Has
your list grows you spend more and more CPU running through the
lists. The idea here is the attacker chooses entries as far apart as
possible that make you run through the list. This example is small
but in theory if the window is open to say 1Meg you could end up with
100's of thousands link list entries.
Would it make sense to use a tree list (generic example:
https://commons.apache.org/proper/commons-collections/apidocs/org/apache/commons/collections4/list/TreeList.html)
instead of a linked list additional/independently to what you committed?
We used to use an RBtree but this had CPU consequences that @gallatin
and I worked on. Using this customized hash-list which is tuned for TCP
sequence numbers saved us about 10% CPU IIRR over the RB tree.
With these new fixes I think we are ok and I really don't want to
introduce more overhead cpu wise :)
R
diff --git a/sys/netinet/tcp_stacks/sack_filter.c
b/sys/netinet/tcp_stacks/sack_filter.c
index e82fcee2ffac..fc9ee8454a1e 100644
--- a/sys/netinet/tcp_stacks/sack_filter.c
+++ b/sys/netinet/tcp_stacks/sack_filter.c
#ifndef _KERNEL
+
+static u_int tcp_fixed_maxseg(const struct tcpcb *tp)
+{
+ /* Lets pretend their are timestamps on for user space */
+ return (tp->t_maxseg - 12);
+}
Typo in the comment?
Bye,
Alexander.