Hello again

Michael Tuexen wrote:
MT> > On 17. Jul 2019, at 09:42, Vitalij Satanivskij <sa...@ukr.net> wrote:
MT> > 
MT> > 
MT> > 
MT> > Hello. 
MT> > 
MT> > Is there any changes about this problem
MT> > 
MT> > 
MT> > I'm using FreeBSD 12 on my desktop and can confirm problem occur with 
some hosts.
MT> Can you provide a list of some of these hosts?
MT> I'll put up a change for review later today.


Here some hosts.

5.9.242.150 https://vitagramma.com
77.120.8.194 https://volia.com
31.41.220.92 https://moemisto.ua
185.5.72.33 https://fotostrana.ru

Problem can be seen by sending curl request to hosts in serial (manual, so 
delay it's from few msec to few sec)

Or by using proxy on machine with parallel/serial request's (eq squid or 
reverse proxy in nginx)

On system before https://svnweb.freebsd.org/base?view=revision&revision=338053 
such behavior not seen.

MT> 
MT> In the meantime you can deal with the buggy hosts by disabling the 
timestamps
MT> or dropping extensions on SYN retransmits.

You meen by some code changes?


MT> 
MT> Best regards
MT> Michael
MT> > 
MT> > 
MT> > 
MT> > Michael Tuexen wrote:
MT> > MT> 
MT> > MT> 
MT> > MT> > On 9. Jul 2019, at 14:58, Paul <de...@ukr.net> wrote:
MT> > MT> > 
MT> > MT> > Hi Michael,
MT> > MT> > 
MT> > MT> > 9 July 2019, 15:34:29, by "Michael Tuexen" <tue...@freebsd.org>:
MT> > MT> > 
MT> > MT> >> 
MT> > MT> >> 
MT> > MT> >>> On 8. Jul 2019, at 17:22, Paul <de...@ukr.net> wrote:
MT> > MT> >>> 
MT> > MT> >>> 
MT> > MT> >>> 
MT> > MT> >>> 8 July 2019, 17:12:21, by "Michael Tuexen" <tue...@freebsd.org>:
MT> > MT> >>> 
MT> > MT> >>>>> On 8. Jul 2019, at 15:24, Paul <de...@ukr.net> wrote:
MT> > MT> >>>>> 
MT> > MT> >>>>> Hi Michael,
MT> > MT> >>>>> 
MT> > MT> >>>>> 8 July 2019, 15:53:15, by "Michael Tuexen" <tue...@freebsd.org>:
MT> > MT> >>>>> 
MT> > MT> >>>>>>> On 8. Jul 2019, at 12:37, Paul <de...@ukr.net> wrote:
MT> > MT> >>>>>>> 
MT> > MT> >>>>>>> Hi team,
MT> > MT> >>>>>>> 
MT> > MT> >>>>>>> Recently we had an upgrade to 12 Stable. Immediately after, 
we have started 
MT> > MT> >>>>>>> seeing some strange connection establishment timeouts to some 
fixed number
MT> > MT> >>>>>>> of external (world) hosts. The issue was persistent and easy 
to reproduce.
MT> > MT> >>>>>>> Thanks to a patience and dedication of our system engineer we 
have tracked  
MT> > MT> >>>>>>> this issue down to a specific commit:
MT> > MT> >>>>>>> 
MT> > MT> >>>>>>> https://svnweb.freebsd.org/base?view=revision&revision=338053
MT> > MT> >>>>>>> 
MT> > MT> >>>>>>> This patch was also back-ported into 11 Stable:
MT> > MT> >>>>>>> 
MT> > MT> >>>>>>> https://svnweb.freebsd.org/base?view=revision&revision=348435
MT> > MT> >>>>>>> 
MT> > MT> >>>>>>> Among other things this patch changes the timestamp 
allocation strategy,
MT> > MT> >>>>>>> by introducing a deterministic randomness via a hash function 
that takes
MT> > MT> >>>>>>> into account a random key as well as source address, source 
port, dest
MT> > MT> >>>>>>> address and dest port. As the result, timestamp offsets of 
different
MT> > MT> >>>>>>> tuples (SA,SP,DA,DP) will be wildly different and will jump 
from small 
MT> > MT> >>>>>>> to large numbers and back, as long as something in the tuple 
changes.
MT> > MT> >>>>>> Hi Paul,
MT> > MT> >>>>>> 
MT> > MT> >>>>>> this is correct.
MT> > MT> >>>>>> 
MT> > MT> >>>>>> Please note that the same happens with the old method, if two 
hosts with
MT> > MT> >>>>>> different uptimes are bind a consumer grade NAT.
MT> > MT> >>>>> 
MT> > MT> >>>>> If NAT does not replace timestamps then yes, it should be the 
case.
MT> > MT> >>>>> 
MT> > MT> >>>>>>> 
MT> > MT> >>>>>>> After performing various tests of hosts that produce the 
above mentioned 
MT> > MT> >>>>>>> issue we came to conclusion that there are some interesting 
implementations 
MT> > MT> >>>>>>> that drop SYN packets with timestamps smaller  than the 
largest timestamp 
MT> > MT> >>>>>>> value from streams of all recent or current connections from 
a specific 
MT> > MT> >>>>>>> address. This looks as some kind of SYN flood protection.
MT> > MT> >>>>>> This also breaks multiple hosts with different uptimes behind 
a consumer
MT> > MT> >>>>>> level NAT talking to such a server.
MT> > MT> >>>>>>> 
MT> > MT> >>>>>>> To ensure that each external host is not going to see a wild 
jumps of 
MT> > MT> >>>>>>> timestamp values I propose a patch that removes ports from 
the equation
MT> > MT> >>>>>>> all together, when calculating the timestamp offset:
MT> > MT> >>>>>>> 
MT> > MT> >>>>>>> Index: sys/netinet/tcp_subr.c
MT> > MT> >>>>>>> 
===================================================================
MT> > MT> >>>>>>> --- sys/netinet/tcp_subr.c    (revision 348435)
MT> > MT> >>>>>>> +++ sys/netinet/tcp_subr.c    (working copy)
MT> > MT> >>>>>>> @@ -2224,7 +2224,22 @@
MT> > MT> >>>>>>> uint32_t
MT> > MT> >>>>>>> tcp_new_ts_offset(struct in_conninfo *inc)
MT> > MT> >>>>>>> {
MT> > MT> >>>>>>> -     return (tcp_keyed_hash(inc, V_ts_offset_secret));
MT> > MT> >>>>>>> +        /* 
MT> > MT> >>>>>>> +         * Some implementations show a strange behaviour 
when a wildly random 
MT> > MT> >>>>>>> +         * timestamps allocated for different streams. It 
seems that only the
MT> > MT> >>>>>>> +         * SYN packets are affected. Observed 
implementations drop SYN packets
MT> > MT> >>>>>>> +         * with timestamps smaller than the largest 
timestamp value of all 
MT> > MT> >>>>>>> +         * recent or current connections from specific a 
address. To mitigate 
MT> > MT> >>>>>>> +         * this we are going to ensure that each host will 
always observe 
MT> > MT> >>>>>>> +         * timestamps as increasing no matter the stream: by 
dropping ports
MT> > MT> >>>>>>> +         * from the equation.
MT> > MT> >>>>>>> +         */ 
MT> > MT> >>>>>>> +        struct in_conninfo inc_copy = *inc;
MT> > MT> >>>>>>> +
MT> > MT> >>>>>>> +        inc_copy.inc_fport = 0;
MT> > MT> >>>>>>> +        inc_copy.inc_lport = 0;
MT> > MT> >>>>>>> +
MT> > MT> >>>>>>> +     return (tcp_keyed_hash(&inc_copy, V_ts_offset_secret));
MT> > MT> >>>>>>> }
MT> > MT> >>>>>>> 
MT> > MT> >>>>>>> /*
MT> > MT> >>>>>>> 
MT> > MT> >>>>>>> In any case, the solution of the uptime leak, implemented in 
rev338053 is 
MT> > MT> >>>>>>> not going to suffer, because a supposed attacker is currently 
able to use 
MT> > MT> >>>>>>> any fixed values of SP and DP, albeit not 0, anyway, to 
remove them out 
MT> > MT> >>>>>>> of the equation.
MT> > MT> >>>>>> Can you describe how a peer can compute the uptime from two 
observed timestamps?
MT> > MT> >>>>>> I don't see how you can do that...
MT> > MT> >>>>> 
MT> > MT> >>>>> Supposed attacker could run a script that continuously monitors 
timestamps,
MT> > MT> >>>>> for example via a periodic TCP connection from a fixed local 
port (eg 12345) 
MT> > MT> >>>>> and a fixed local address to the fixed victim's address and 
port (eg 80).
MT> > MT> >>>>> Whenever large discrepancy is observed, attacker can assume 
that reboot has 
MT> > MT> >>>>> happened (due to V_ts_offset_secret re-generation), hence the 
received 
MT> > MT> >>>>> timestamp is considered an approximate point of reboot from 
which the uptime
MT> > MT> >>>>> can be calculated, until the next reboot and so on.
MT> > MT> >>>> Ahh, I see. The patch we are talking about is not intended to 
protect against
MT> > MT> >>>> continuous monitoring, which is something you can always do. You 
could even
MT> > MT> >>>> watch for service availability and detect reboots. A change of 
the local key
MT> > MT> >>>> would also look similar to a reboot without a temporary loss of 
connectivity.
MT> > MT> >>>> 
MT> > MT> >>>> Thanks for the clarification.
MT> > MT> >>>>> 
MT> > MT> >>>>>>> 
MT> > MT> >>>>>>> There is the list of example hosts that we were able to 
reproduce the 
MT> > MT> >>>>>>> issue with:
MT> > MT> >>>>>>> 
MT> > MT> >>>>>>> curl -v http://88.99.60.171:80
MT> > MT> >>>>>>> curl -v http://163.172.71.252:80
MT> > MT> >>>>>>> curl -v http://5.9.242.150:80
MT> > MT> >>>>>>> curl -v https://185.134.205.105:443
MT> > MT> >>>>>>> curl -v https://136.243.1.231:443
MT> > MT> >>>>>>> curl -v https://144.76.196.4:443
MT> > MT> >>>>>>> curl -v http://94.127.191.194:80
MT> > MT> >>>>>>> 
MT> > MT> >>>>>>> To reproduce, call curl repeatedly with a same URL some 
number of times. 
MT> > MT> >>>>>>> You are going  to see some of the requests stuck in 
MT> > MT> >>>>>>> `*    Trying XXX.XXX.XXX.XXX...`
MT> > MT> >>>>>>> 
MT> > MT> >>>>>>> For some reason, the easiest way to reproduce the issue is 
with nc:
MT> > MT> >>>>>>> 
MT> > MT> >>>>>>> $ echo "foooooo" | nc -v 88.99.60.171 80
MT> > MT> >>>>>>> 
MT> > MT> >>>>>>> Only a few such calls are required until one of them is stuck 
on connect():
MT> > MT> >>>>>>> issuing SYN packets with an exponential backoff.
MT> > MT> >>>>>> Thanks for providing an end-point to test with. I'll take a 
look.
MT> > MT> >>>>>> Just to be clear: You are running a FreeBSD client against one 
of the above
MT> > MT> >>>>>> servers and experience the problem with the new timestamp 
computations.
MT> > MT> >>>>>> 
MT> > MT> >>>>>> You are not running arbitrary clients against a FreeBSD 
server...
MT> > MT> >>>>> 
MT> > MT> >>>>> We are talking about FreeBSD being the client. Peers that yield 
this unwanted
MT> > MT> >>>>> behaviour are unknown. Little bit of tinkering showed that some 
of them run 
MT> > MT> >>>>> Debian:
MT> > MT> >>>>> 
MT> > MT> >>>>> telnet 88.99.60.171 22
MT> > MT> >>>>> Trying 88.99.60.171...
MT> > MT> >>>>> Connected to 88.99.60.171.
MT> > MT> >>>>> Escape character is '^]'.
MT> > MT> >>>>> SSH-2.0-OpenSSH_6.7p1 Debian-5+deb8u3
MT> > MT> >>>> Also some are hosted by Hetzner, but not all. I'll will look into
MT> > MT> >>>> this tomorrow, since I'm on a deadline today (well it is 2am 
tomorrow
MT> > MT> >>>> morning, to be precise)...
MT> > MT> >>> 
MT> > MT> >>> Thanks a lot, I would appreciate that.
MT> > MT> >> Hi Paul,
MT> > MT> >> 
MT> > MT> >> I have looked into this.
MT> > MT> >> 
MT> > MT> >> * The FreeBSD behaviour is the one which is specified in the last 
bullet item
MT> > MT> >>  in https://tools.ietf.org/html/rfc7323#section-5.4
MT> > MT> >>  It is also the one, which is RECOMMENDED in
MT> > MT> >>  https://tools.ietf.org/html/rfc7323#section-7.1 
MT> > MT> >> 
MT> > MT> >> * My NAT box (a popular one in Germany) does NOT rewrite TCP 
timestamps.
MT> > MT> >> 
MT> > MT> >> This means that the host you are referring to have some sort of 
protection,
MT> > MT> >> which makes incorrect assumptions. It will also break multiple 
hosts behind
MT> > MT> >> a NAT.
MT> > MT> >> 
MT> > MT> >> I can run
MT> > MT> >> curl -v http://88.99.60.171:80
MT> > MT> >> in a loop without any problems from a FreeBSD head system. I 
tested 1000
MT> > MT> >> iterations or so. The TS.val is jumping up and down as expected.
MT> > MT> >> I'm wondering why you are observing errors in this case, too.
MT> > MT> >> 
MT> > MT> >> However, doing something like
MT> > MT> >> echo "foooooo" | nc -v 88.99.60.171 80
MT> > MT> >> triggers the problem.
MT> > MT> >> 
MT> > MT> >> So I think there is some functionality (in a middlebox or running 
on the host),
MT> > MT> >> which incorrectly assume monotonic timestamps between multiple TCP 
connections
MT> > MT> >> coming from the same IP address, but only in case of errors at the 
application layer.
MT> > MT> > 
MT> > MT> > Yeah, exactly, some hosts seem to enable this only in case of an 
error in HTTP
MT> > MT> > communication (some smart proxy?). However, there are some that 
behave this way
MT> > MT> > regardless of errors, for example these:
MT> > MT> > 
MT> > MT> > curl -v https://185.134.205.105:443
MT> > MT> > curl -v https://136.243.1.231:443
MT> > MT> Wireshark sees an Encrypted Alert in both cases. So I guess this is 
another indication
MT> > MT> of "error at the application layer".
MT> > MT> > 
MT> > MT> >> 
MT> > MT> >> Do you have any insights whether the hosts you are listed share 
something in
MT> > MT> >> common. Some of them are hosted by Hetzner, but not all.
MT> > MT> > 
MT> > MT> > Nope. A whole set of endpoints that we have detected so far is 
pretty diverse,
MT> > MT> > containing a lot of different locations geographically, as well as 
different
MT> > MT> > hosters.
MT> > MT> OK. Thanks for the clarification.
MT> > MT> > 
MT> > MT> >> 
MT> > MT> >> I think in general, it is the correct thing to include the port 
numbers in
MT> > MT> >> the offset computation. We might add a sysctl variable to control 
the inclusion.
MT> > MT> >> This would allow interworking with broken middleboxes.
MT> > MT> > 
MT> > MT> > Yeah, I completely agree that these rare cases should not dictate 
the implementation.
MT> > MT> > But an ability to enable a work-around via sysctl would be greatly 
appreciated.
MT> > MT> > Currently we are unable to roll-out the upgrade across all servers 
because of this
MT> > MT> > issue: even though it happens not so often, a lot of requests from 
our users 
MT> > MT> > get stuck or fail all together. For example, a host 185.134.205.105 
is a kind of
MT> > MT> > social network that our proxy servers connect to so securely access 
to content,
MT> > MT> > such as images, on behalf of our users.
MT> > MT> > 
MT> > MT> >> 
MT> > MT> >> Please note, this does not fix the case of multiple clients behind 
a NAT.
MT> > MT> > 
MT> > MT> > Yeah, that's true. Fortunately we don't use NAT.
MT> > MT> > 
MT> > MT> >> 
MT> > MT> >> I'm also trying to figure out how and why Linux and Windows are 
handling this.
MT> > MT> > 
MT> > MT> > Thanks for bothering!
MT> > MT> Will let you know what I figure out.
MT> > MT> 
MT> > MT> Best regards
MT> > MT> Michael
MT> > MT> > 
MT> > MT> >> 
MT> > MT> >> Best regards
MT> > MT> >> Michael
MT> > MT> >> 
MT> > MT> >>> 
MT> > MT> >>>> 
MT> > MT> >>>> Best regards
MT> > MT> >>>> Michael 
MT> > MT> >>>>> 
MT> > MT> >>>>> 
MT> > MT> >>>>>> 
MT> > MT> >>>>>> Best regards
MT> > MT> >>>>>> Michael
MT> > MT> >>>>>> 
MT> > MT> >>>>>> 
MT> > MT> >>>> 
MT> > MT> >>>> 
MT> > MT> >> 
MT> > MT> >> 
MT> > MT> 
MT> > MT> _______________________________________________
MT> > MT> freebsd-net@freebsd.org mailing list
MT> > MT> https://lists.freebsd.org/mailman/listinfo/freebsd-net
MT> > MT> To unsubscribe, send any mail to "freebsd-net-unsubscr...@freebsd.org"
MT> 
MT> _______________________________________________
MT> freebsd-net@freebsd.org mailing list
MT> https://lists.freebsd.org/mailman/listinfo/freebsd-net
MT> To unsubscribe, send any mail to "freebsd-net-unsubscr...@freebsd.org"
_______________________________________________
freebsd-net@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/freebsd-net
To unsubscribe, send any mail to "freebsd-net-unsubscr...@freebsd.org"

Reply via email to