From 1db7a222a02e30bf8faefd6140cb68d2f65a0b72 Mon Sep 17 00:00:00 2001 From: Jon Siwek Date: Wed, 15 Jan 2020 12:43:16 -0800 Subject: [PATCH] Handle invalid Base64 encodings in FTP ADAT analyzer --- src/analyzer/protocol/ftp/FTP.cc | 12 ++++++++++-- .../weird.log | 11 +++++++++++ .../Traces/globus-url-copy-bad-encoding.trace | Bin 0 -> 21556 bytes .../base/protocols/ftp/bad-adat-encoding.zeek | 2 ++ 4 files changed, 23 insertions(+), 2 deletions(-) create mode 100644 testing/btest/Baseline/scripts.base.protocols.ftp.bad-adat-encoding/weird.log create mode 100644 testing/btest/Traces/globus-url-copy-bad-encoding.trace create mode 100644 testing/btest/scripts/base/protocols/ftp/bad-adat-encoding.zeek diff --git a/src/analyzer/protocol/ftp/FTP.cc b/src/analyzer/protocol/ftp/FTP.cc index 39d034c616..97ce54c481 100644 --- a/src/analyzer/protocol/ftp/FTP.cc +++ b/src/analyzer/protocol/ftp/FTP.cc @@ -224,8 +224,16 @@ void FTP_ADAT_Analyzer::DeliverStream(int len, const u_char* data, bool orig) // framing is supposed to be required for the initial context // token, but GSI doesn't do that and starts right in on a // TLS/SSL handshake, so look for that to identify it. - const u_char* msg = decoded_adat->Bytes(); - int msg_len = decoded_adat->Len(); + const u_char* msg = nullptr; + int msg_len = 0; + + if ( decoded_adat ) + { + msg = decoded_adat->Bytes(); + msg_len = decoded_adat->Len(); + } + else + Weird("ftp_adat_bad_first_token_encoding"); // Just check that it looks like a viable TLS/SSL handshake // record from the first byte (content type of 0x16) and diff --git a/testing/btest/Baseline/scripts.base.protocols.ftp.bad-adat-encoding/weird.log b/testing/btest/Baseline/scripts.base.protocols.ftp.bad-adat-encoding/weird.log new file mode 100644 index 0000000000..a64ac860c3 --- /dev/null +++ b/testing/btest/Baseline/scripts.base.protocols.ftp.bad-adat-encoding/weird.log @@ -0,0 +1,11 @@ +#separator \x09 +#set_separator , +#empty_field (empty) +#unset_field - +#path weird +#open 2020-01-15-20-41-16 +#fields ts uid id.orig_h id.orig_p id.resp_h id.resp_p name addl notice peer +#types time string addr port addr port string string bool string +1348168976.514202 CHhAvVGS1DHFjwGM9 192.168.57.103 60108 192.168.57.101 2811 base64_illegal_encoding character 32 ignored by Base64 decoding F zeek +1348168976.514202 CHhAvVGS1DHFjwGM9 192.168.57.103 60108 192.168.57.101 2811 ftp_adat_bad_first_token_encoding - F zeek +#close 2020-01-15-20-41-16 diff --git a/testing/btest/Traces/globus-url-copy-bad-encoding.trace b/testing/btest/Traces/globus-url-copy-bad-encoding.trace new file mode 100644 index 0000000000000000000000000000000000000000..1a6d84c9ee5f5a60d2b989ddf6410e282bfa2628 GIT binary patch literal 21556 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 tX^HEO2J`%gH|p~BGbGNMnKciLb$n))j#q$D