Feature #796
closedstream: deal with multiple different SYN/ACK's better
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.
Updated by Peter Manev over 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?
Updated by Victor Julien over 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.
Updated by Victor Julien over 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(-)