From aef9fe11dc801e7ee6bb94e292e2a00a87782d15 Mon Sep 17 00:00:00 2001 From: Evan Typanski Date: Wed, 29 Jan 2025 09:52:56 -0500 Subject: [PATCH] spicy-redis: Abort parsing if server data comes first Redis seems to only want client data first to request server data. The DPD signature seems to pick up on some cases where server data comes first, but is otherwise "valid" RESP. See if this helps lower FP rates. --- src/analyzer/protocol/redis/resp.spicy | 19 +++++++++++++++--- .../output | 1 + .../btest/Traces/redis/start-with-server.pcap | Bin 0 -> 209412 bytes .../protocols/redis/start-with-server.zeek | 14 +++++++++++++ 4 files changed, 31 insertions(+), 3 deletions(-) create mode 100644 testing/btest/Baseline/scripts.base.protocols.redis.start-with-server/output create mode 100644 testing/btest/Traces/redis/start-with-server.pcap create mode 100644 testing/btest/scripts/base/protocols/redis/start-with-server.zeek diff --git a/src/analyzer/protocol/redis/resp.spicy b/src/analyzer/protocol/redis/resp.spicy index b5cd6d1e95..f372f0e34d 100644 --- a/src/analyzer/protocol/redis/resp.spicy +++ b/src/analyzer/protocol/redis/resp.spicy @@ -10,15 +10,29 @@ const MAX_SIZE = 1024 * 1024; const MAX_RECURSION_DEPTH = 20; public type ClientMessages = unit { + # The context here refers to whether we saw client data first. It is a one-time switch, + # either we have seen client data or not. + %context = bool; + on %init { + *self.context() = True; + } : ClientData[]; }; public type ServerMessages = unit { + %context = bool; + on %init { + if (!*self.context()) { + throw "Server responses must come after a client request is seen"; + } + } : (ServerData &synchronize)[]; }; public type ClientData = unit { - on %init() { self.start = self.input(); } + on %init() { + self.start = self.input(); + } # Clients can only be an array or inline ty: uint8 &convert=DataType($$) { @@ -49,7 +63,7 @@ type BulkStringArray = unit { type BulkStringWithTy = unit { # Need to consume the type here - : uint8 &requires=$$=='$'; + : uint8 &requires=$$ == '$'; length: RedisBytes &convert=$$.to_int(10) &requires=self.length <= int64(MAX_SIZE); # NullBulkString is a BulkString with content unset @@ -59,7 +73,6 @@ type BulkStringWithTy = unit { : skip RedisBytes; }; - public type ServerData = unit { %synchronize-after = b"\x0d\x0a"; var depth: uint8& = new uint8; diff --git a/testing/btest/Baseline/scripts.base.protocols.redis.start-with-server/output b/testing/btest/Baseline/scripts.base.protocols.redis.start-with-server/output new file mode 100644 index 0000000000..49d861c74c --- /dev/null +++ b/testing/btest/Baseline/scripts.base.protocols.redis.start-with-server/output @@ -0,0 +1 @@ +### BTest baseline data generated by btest-diff. Do not edit. Use "btest -U/-u" to update. Requires BTest >= 0.63. diff --git a/testing/btest/Traces/redis/start-with-server.pcap b/testing/btest/Traces/redis/start-with-server.pcap new file mode 100644 index 0000000000000000000000000000000000000000..66d0a59f6486c67ce48b20b11ebfa2b675c30b2e GIT binary patch literal 209412 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 T@$l>5_g7>53Joutput +# @TEST-EXEC: btest-diff output + +event Redis::command(c: connection, is_orig: bool, command: Redis::Command) + { + print "BAD", command; + } + +event Redis::server_data(c: connection, is_orig: bool, dat: Redis::ServerData) + { + print "BAD", dat; + }