On Mon, Mar 21, 2016 at 12:58:41PM +0100, Alexander Bluhm wrote:
> The attack I see is that you can measure the bucket distribution
> by timing the SYN+ACK response.  You can collect samples that end
> in the same bucket.  After you have collected enough, start your
> DoS attack.  I think that just collecting data is also possible
> with a strong hash function.  With a weak function you may collect
> less and can start guessing early on top of that.  But reseeding
> after a number of packets prevents to collect information over a
> long peroid.

The syn cache already detects when it has too many bucket collisions.
That seems a good moment to reseed the hash function.

ok?

bluhm

Index: netinet/tcp_input.c
===================================================================
RCS file: /data/mirror/openbsd/cvs/src/sys/netinet/tcp_input.c,v
retrieving revision 1.316
diff -u -p -r1.316 tcp_input.c
--- netinet/tcp_input.c 27 Mar 2016 19:19:01 -0000      1.316
+++ netinet/tcp_input.c 28 Mar 2016 21:51:20 -0000
@@ -3400,6 +3400,12 @@ syn_cache_insert(struct syn_cache *sc, s
        if (scp->sch_length >= tcp_syn_bucket_limit) {
                tcpstat.tcps_sc_bucketoverflow++;
                /*
+                * Someone might attack our bucket hash function.  Reseed
+                * with random as soon as the passive syn cache gets empty.
+                */
+               if (set->scs_use > 0)
+                       set->scs_use = 0;
+               /*
                 * The bucket is full.  Toss the oldest element in the
                 * bucket.  This will be the first entry in the bucket.
                 */

Reply via email to