DCCP protocol discussions
 help / color / mirror / Atom feed
From: Eddie Kohler <kohler@cs.ucla.edu>
To: dccp@vger.kernel.org
Subject: Re: [PATCH 39/43]: Protect against Reset/Sync floods due to buggy
Date: Fri, 06 Apr 2007 16:46:43 +0000	[thread overview]
Message-ID: <46167973.602@cs.ucla.edu> (raw)
In-Reply-To: <200704051637.18198@strip-the-willow>

Hi Gerrit,

I agree that the bug is scary!  It would be good to fix.  But this fix isn't a 
good fix, especially because it makes it trivially easy to shoot down a 
connection if you know the port numbers.  Would you mind withdrawing the patch 
until the bug reappears?

Eddie


Gerrit Renker wrote:
> Eddie,
> 
> I have spent half a day or so trying to reconstruct the condition which triggered this bug.
> With the new patches regarding closing state I couldn't trigger this bug anymore. Which is
> not to say that it has gone away. 
> 
> All I can say is that I have observed this bug as described and that it is pretty scary -
> the computer freezes for several minutes (until the server connection timer declares the
> connection as dead) and it generates a massive load of packets. 
> 
> I will try to follow this up when I have some more time; as indicated by the comment in 
> the patch below, I am lacking the resources to implement rate-limiting for DCCP-Sync; too 
> many other things to fix.
> 
> Anyone else any ideas / suggestions?
> 
> Gerrit
> 
> 
> Quoting Eddie Kohler:
> |  Hi Gerrit,
> |  
> |  I'm surprised this kind of flood happens & think it may represent a bug in the 
> |  stack.  What is the acknowledgement number on the Sync packet sent in step 
> |  (6)?  It should be GSR, according to Step 6 of the pseudocode in Section 8.5. 
> |    If it was GSR, I would expect the following denouement:
> |  
> |  5. client responds with Reset packet Code 3 with seqno=0
> |  6. server thinks that seqno=0 is out of synch (step 6), sends Sync with 
> |  seqno=GSS, ackno=GSR, then increments GSS;
> |  7. client responds with Reset packet Code 3 with seqno=GSR+1 and ackno=GSS (it 
> |  can do this because it takes the seqno from the received packet's ackno, per 
> |  Section 8.3.1);
> |  8. the Reset is now in synch, so the server kills the connection.
> |  
> |  No flood should be possible with valid stacks; some people actually verified 
> |  this theoretically.
> |  
> |  Of course stacks can be INvalid, in which case one should rate-limit Syncs, as 
> |  allowed by the protocol.
> |  
> |  Your solution, which is to accept Resets with seqno 0, makes it trivially 
> |  simple for an attacker to kill any connection.  It should not be committed! 
> |  Can we figure out why the stack has the chatter problem first?
> |  
> |  Eddie
> |  
> |  
> |  Gerrit Renker wrote:
> |  > [DCCP]: Protect against Reset/Sync floods due to buggy applications
> |  > 
> |  > This patch protects against Reset/Sync floods which happens as a result
> |  > of either buggy or crashing client applications. The Reset/Sync flood
> |  > is triggered as follows:
> |  > 
> |  >  1. Client establishes connection to listening server;
> |  >  2. before server can write data to client, client crashes;
> |  >  3. crashing client removes connection state at client host;
> |  >  4. server still thinks client is alive and sends data;
> |  >  5. client responds to server packet with Reset packet Code 3, 
> |  >     "No Connection", with seqno=0 - as per RFC 4340, 8.3.1;
> |  >  6. server thinks that seqno=0 is out of synch (step 6), sends Sync;
> |  >  7. goto (6).
> |  > 
> |  > The result is a drastic flood of packets: In one occasion I counted
> |  > 345549 Reset/Sync packets, before the server finally killed itself.
> |  > 
> |  > Fix:
> |  > ----
> |  > Since this condition is peculiar and can be distinguished from other
> |  > sequence-invalid packets, a special case has been added. The Reset
> |  > is accepted if
> |  >  * it has Reset Code 3, "No Connection" AND
> |  >  * it has sequence number 0 as described in RFC 4340, 8.3.1.
> |  > 
> |  > If both conditions are satisfied, the Reset is enqueued in the receive queue
> |  > as usual, and will very soon terminate the crashed connection.
> |  > 
> |  > Signed-off-by: Gerrit Renker <gerrit@erg.abdn.ac.uk>
> |  > ---
> |  >  net/dccp/input.c |   17 +++++++++++++++++
> |  >  1 file changed, 17 insertions(+)
> |  > 
> |  > --- a/net/dccp/input.c
> |  > +++ b/net/dccp/input.c
> |  > @@ -155,6 +155,22 @@ static int dccp_check_seqno(struct sock 
> |  >  		    (DCCP_SKB_CB(skb)->dccpd_ack_seq !> |  >  		     DCCP_PKT_WITHOUT_ACK_SEQ))
> |  >  			dp->dccps_gar = DCCP_SKB_CB(skb)->dccpd_ack_seq;
> |  > +
> |  > +	} else if (dh->dccph_type = DCCP_PKT_RESET  &&
> |  > +		   dccp_hdr_reset(skb)->dccph_reset_code =
> |  > +		   DCCP_RESET_CODE_NO_CONNECTION &&
> |  > +		   DCCP_SKB_CB(skb)->dccpd_seq = 0) {
> |  > +		/*
> |  > +		 * This happens when connection is established and client app
> |  > +		 * crashes before server can send data. The crashing client
> |  > +		 * removes connection state, so the server gets a Code 3 Reset
> |  > +		 * packet with seqno 0 (RFC 4340, 8.3.1). Responding here with
> |  > +		 * a Sync leads to a Reset-Storm which will flood the network
> |  > +		 * until the server gives up on this connection or is killed.
> |  > +		 * We let this case pass so that the Reset gets enqueued and
> |  > +		 * will terminate the erratic connection.
> |  > +		 */
> |  > +		DCCP_WARN("DCCP: Peer sent RESET with seqno 0\n");
> |  >  	} else {
> |  >  		DCCP_WARN("DCCP: Step 6 failed for %s packet, "
> |  >  			  "(LSWL(%llu) <= P.seqno(%llu) <= S.SWH(%llu)) and "
> |  > @@ -168,6 +184,7 @@ static int dccp_check_seqno(struct sock 
> |  >  			  (unsigned long long) lawl,
> |  >  			  (unsigned long long) DCCP_SKB_CB(skb)->dccpd_ack_seq,
> |  >  			  (unsigned long long) dp->dccps_awh);
> |  > +		/* FIXME: Rate-limit DCCP-Sync packets as per RFC 4340, 7.5.4 */
> |  >  		dccp_send_sync(sk, DCCP_SKB_CB(skb)->dccpd_seq, DCCP_PKT_SYNC);
> |  >  		return -1;
> |  >  	}
> |  > -
> |  > To unsubscribe from this list: send the line "unsubscribe dccp" in
> |  > the body of a message to majordomo@vger.kernel.org
> |  > More majordomo info at  http://vger.kernel.org/majordomo-info.html
> |  
> |  

  parent reply	other threads:[~2007-04-06 16:46 UTC|newest]

Thread overview: 13+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2007-04-05 15:37 [PATCH 39/43]: Protect against Reset/Sync floods due to buggy applications Gerrit Renker
2007-04-05 17:02 ` [PATCH 39/43]: Protect against Reset/Sync floods due to buggy Eddie Kohler
2007-04-06 15:38 ` [PATCH 39/43]: Protect against Reset/Sync floods due to buggy applications Gerrit Renker
2007-04-06 16:46 ` Eddie Kohler [this message]
2007-04-09  7:23 ` Gerrit Renker
2007-04-10 15:08 ` [PATCH 39/43]: Protect against Reset/Sync floods due to buggy Eddie Kohler
2007-04-10 15:29 ` [PATCH 39/43]: Protect against Reset/Sync floods due to buggy applications Arnaldo Carvalho de Melo
2007-04-10 23:20 ` Ian McDonald
2007-04-11  8:12 ` Gerrit Renker
2007-04-11  8:45 ` Gerrit Renker
2007-04-11 11:57 ` Gerrit Renker
2007-04-11 15:10 ` [PATCH 39/43]: Protect against Reset/Sync floods due to buggy Eddie Kohler
2007-04-12  8:54 ` [PATCH 39/43]: Protect against Reset/Sync floods due to buggy applications Gerrit Renker

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=46167973.602@cs.ucla.edu \
    --to=kohler@cs.ucla.edu \
    --cc=dccp@vger.kernel.org \
    /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