diff --git a/CHANGES b/CHANGES index ccd191cfcb..5563968d1a 100644 --- a/CHANGES +++ b/CHANGES @@ -1,3 +1,14 @@ +8.1.0-dev.29 | 2025-08-11 11:37:22 -0700 + + * smb2/read: Parse only 1 byte for data_offset, ignore reserved1 (Arne Welzel, Corelight) + + A user provided a SMB2 pcap with the reserved1 field of a ReadResponse + set to 1 instead of 0. This confused the padding computation due to + including this byte into the offset. Properly split data_offset and + reserved1 into individual byte fields. + + Closes #4730 + 8.1.0-dev.27 | 2025-08-10 21:28:33 -0700 * GH-4176: cluster: Add on_subscribe() and on_unsubscribe() hooks (Arne Welzel, Corelight) diff --git a/VERSION b/VERSION index 2f95534d14..2b38f91bfe 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -8.1.0-dev.27 +8.1.0-dev.29 diff --git a/src/analyzer/protocol/smb/smb2-com-read.pac b/src/analyzer/protocol/smb/smb2-com-read.pac index d9b2d7cf7f..4f0e7548ed 100644 --- a/src/analyzer/protocol/smb/smb2-com-read.pac +++ b/src/analyzer/protocol/smb/smb2-com-read.pac @@ -93,10 +93,11 @@ type SMB2_read_request(header: SMB2_Header) = record { type SMB2_read_response(header: SMB2_Header) = record { structure_size : uint16; - data_offset : uint16; + data_offset : uint8; + reserved1 : uint8; data_len : uint32; data_remaining : uint32; - reserved : uint32; + reserved2 : uint32; pad : padding to data_offset - header.head_length; data : bytestring &length=data_len; } &let { diff --git a/testing/btest/Baseline/scripts.base.protocols.smb.smb2-read-response-non-zero-reserved1/files.log b/testing/btest/Baseline/scripts.base.protocols.smb.smb2-read-response-non-zero-reserved1/files.log new file mode 100644 index 0000000000..fe939ef5e9 --- /dev/null +++ b/testing/btest/Baseline/scripts.base.protocols.smb.smb2-read-response-non-zero-reserved1/files.log @@ -0,0 +1,11 @@ +### BTest baseline data generated by btest-diff. Do not edit. Use "btest -U/-u" to update. Requires BTest >= 0.63. +#separator \x09 +#set_separator , +#empty_field (empty) +#unset_field - +#path files +#open XXXX-XX-XX-XX-XX-XX +#fields ts fuid uid id.orig_h id.orig_p id.resp_h id.resp_p source depth analyzers mime_type filename duration local_orig is_orig seen_bytes total_bytes missing_bytes overflow_bytes timedout parent_fuid +#types time string string addr port addr port string count set[string] string string interval bool bool count count count count bool string +XXXXXXXXXX.XXXXXX FmcSEk2dq4v0hewpM4 CHhAvVGS1DHFjwGM9 172.31.112.17 57829 172.31.112.16 445 SMB 0 (empty) text/plain Test.txt 0.000000 T F 189 189 0 0 F - +#close XXXX-XX-XX-XX-XX-XX diff --git a/testing/btest/Traces/README b/testing/btest/Traces/README index ec244576a9..a01d06902b 100644 --- a/testing/btest/Traces/README +++ b/testing/btest/Traces/README @@ -53,3 +53,6 @@ Trace Index/Sources: - ldap/adduser1.pcap ldap/adduser1-ntlm.pcap Provided by Mohan-Dhawan on #4275 https://github.com/zeek/zeek/issues/4275 +- smb_v2_only_non_zero_reserved1.pcap + Provided by @predator89090 on #4730 + https://github.com/zeek/zeek/issues/4730 diff --git a/testing/btest/Traces/smb/smb_v2_only_non_zero_reserved1.pcap b/testing/btest/Traces/smb/smb_v2_only_non_zero_reserved1.pcap new file mode 100644 index 0000000000..a30eecffe3 Binary files /dev/null and b/testing/btest/Traces/smb/smb_v2_only_non_zero_reserved1.pcap differ diff --git a/testing/btest/scripts/base/protocols/smb/smb2-read-response-non-zero-reserved1.test b/testing/btest/scripts/base/protocols/smb/smb2-read-response-non-zero-reserved1.test new file mode 100644 index 0000000000..6d2858a8c8 --- /dev/null +++ b/testing/btest/scripts/base/protocols/smb/smb2-read-response-non-zero-reserved1.test @@ -0,0 +1,9 @@ +# @TEST-DOC: Regression test for #4730, ReadResponse not parsed properly. +# +# @TEST-EXEC: zeek -b -C -r $TRACES/smb/smb_v2_only_non_zero_reserved1.pcap %INPUT +# @TEST-EXEC: btest-diff files.log +# @TEST-EXEC: test ! -f analyzer.log +# @TEST-EXEC: test ! -f weird.log + +@load base/protocols/smb +