Skip to content

Commit

Permalink
stream: add liberal timetamps option
Browse files Browse the repository at this point in the history
Linux is slightly more permissive wrt timestamps than many
other OS'. To avoid many events/issues with linux hosts, add an
option to allow for this slightly more permissive behavior.

Ideally the host-os config would be used, but in practice this
setting is rarely set up correctly, if at all.

This option is enabled by default.
  • Loading branch information
victorjulien committed Feb 24, 2023
1 parent d79a926 commit 01b7ccc
Show file tree
Hide file tree
Showing 3 changed files with 16 additions and 2 deletions.
13 changes: 11 additions & 2 deletions src/stream-tcp.c
Original file line number Diff line number Diff line change
Expand Up @@ -656,6 +656,15 @@ void StreamTcpInitConfig(bool quiet)
if (!quiet)
SCLogConfig("stream.reassembly.raw: %s", enable_raw ? "enabled" : "disabled");

/* default to true. Not many ppl (correctly) set up host-os policies, so be permissive. */
stream_config.liberal_timestamps = true;
int liberal_timestamps = 0;
if (ConfGetBool("stream.liberal-timestamps", &liberal_timestamps) == 1) {
stream_config.liberal_timestamps = liberal_timestamps;
}
if (!quiet)
SCLogConfig("stream.liberal-timestamps: %s", liberal_timestamps ? "enabled" : "disabled");

/* init the memcap/use tracking */
StreamTcpInitMemuse();
StatsRegisterGlobalCounter("tcp.memuse", StreamTcpMemuseCounter);
Expand Down Expand Up @@ -5997,7 +6006,7 @@ static int StreamTcpValidateTimestamp (TcpSession *ssn, Packet *p)

SCLogDebug("ts %"PRIu32", last_ts %"PRIu32"", ts, last_ts);

if (receiver_stream->os_policy == OS_POLICY_LINUX) {
if (receiver_stream->os_policy == OS_POLICY_LINUX || stream_config.liberal_timestamps) {
/* Linux accepts TS which are off by one.*/
result = (int32_t) ((ts - last_ts) + 1);
} else {
Expand Down Expand Up @@ -6139,7 +6148,7 @@ static int StreamTcpHandleTimestamp (TcpSession *ssn, Packet *p)

SCLogDebug("ts %"PRIu32", last_ts %"PRIu32"", ts, sender_stream->last_ts);

if (receiver_stream->os_policy == OS_POLICY_LINUX) {
if (receiver_stream->os_policy == OS_POLICY_LINUX || stream_config.liberal_timestamps) {
/* Linux accepts TS which are off by one.*/
result = (int32_t) ((ts - sender_stream->last_ts) + 1);
} else {
Expand Down
3 changes: 3 additions & 0 deletions src/stream-tcp.h
Original file line number Diff line number Diff line change
Expand Up @@ -70,6 +70,9 @@ typedef struct TcpStreamCnf_ {
enum ExceptionPolicy reassembly_memcap_policy;
enum ExceptionPolicy midstream_policy;

/* default to "LINUX" timestamp behavior if true*/
bool liberal_timestamps;

StreamingBufferConfig sbcnf;
} TcpStreamCnf;

Expand Down
2 changes: 2 additions & 0 deletions suricata.yaml.in
Original file line number Diff line number Diff line change
Expand Up @@ -1499,6 +1499,8 @@ flow-timeouts:
# bypass: no # Bypass packets when stream.reassembly.depth is reached.
# # Warning: first side to reach this triggers
# # the bypass.
# liberal-timestamps: false # Treat all timestamps as if the Linux policy applies. This
# # means it's slightly more permissive. Enabled by default.
#
# reassembly:
# memcap: 256mb # Can be specified in kb, mb, gb. Just a number
Expand Down

0 comments on commit 01b7ccc

Please sign in to comment.