Project

General

Profile

Actions

Feature #796

closed

stream: deal with multiple different SYN/ACK's better

Added by Victor Julien about 11 years ago. Updated about 11 years ago.

Status:
Closed
Priority:
Normal
Assignee:
Target version:
Effort:
Difficulty:
Label:

Description

Currently we accept the first SYN/ACK and reject (+set event on) new ones that are different. Ran into some streams where the 2nd is accepted.

As there is no way to distinguish between them we'll have to wait for the client to ACK one. For this we'll use a simple list in the TCP ssn. Also a limit will be used to make sure we won't get vulnerable to a resource starvation attack.

Code will only be used in slow path.

Actions #1

Updated by Peter Manev about 11 years ago

What do you mean "slow path"?
What would be the limit for a resource starvation attack - a time based limit?

In the case that you are referring to, the client received 2 SYN/ACKs and choose to accept the second one - correct?

Actions #2

Updated by Victor Julien about 11 years ago

Peter Manev wrote:

What do you mean "slow path"?

That we won't touch this code in the normal case (fast path), which would be the normal 3whs.

What would be the limit for a resource starvation attack - a time based limit?

No just absolute. Defaulting to 5 now. So more than 5 different SYN/ACKs in a single session will lead to rejected packets, stream event being set.

In the case that you are referring to, the client received 2 SYN/ACKs and choose to accept the second one - correct?

We can't be sure the client received both. We can only see which one it ACKs.

Actions #3

Updated by Victor Julien about 11 years ago

  • Status changed from Assigned to Closed
  • % Done changed from 0 to 100

Addressed by:

commit 4c6463f3784f533a07679589dab713096137a439
Author: Victor Julien <victor@inliniac.net>
Date:   Sat Apr 6 20:54:25 2013 +0200

    stream: handle extra different SYN/ACK

    Until now, when processing the TCP 3 way handshake (3whs), retransmissions
    of SYN/ACKs are silently accepted, unless they are different somehow. If
    the SEQ or ACK values are different they are considered wrong and events
    are set. The stream events rules will match on this.

    In some cases, this is wrong. If the client missed the SYN/ACK, the server
    may send a different one with a different SEQ. This commit deals with this.

    As it is impossible to predict which one the client will accept, each is
    added to a list. Then on receiving the final ACK from the 3whs, the list
    is checked and the state is updated according to the queued SYN/ACK.

-----------------------------------------------------------------------

Summary of changes:
 rules/stream-events.rules |    4 +-
 src/decode-events.h       |    1 +
 src/detect-engine-event.h |    1 +
 src/stream-tcp-private.h  |   21 ++-
 src/stream-tcp.c          |  568 +++++++++++++++++++++++++++++++++++++++++++--
 src/stream-tcp.h          |    1 +
 suricata.yaml.in          |    5 +-
 7 files changed, 582 insertions(+), 19 deletions(-)

Actions

Also available in: Atom PDF