From: Jason Ish Date: Tue, 22 Mar 2022 15:46:45 +0000 (-0600) Subject: detect-content: error on single char hex pairs X-Git-Tag: suricata-5.0.9~40 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=ecbdd352a248fdd3e1f817745fc006bc4896ff5f;p=thirdparty%2Fsuricata.git detect-content: error on single char hex pairs Fix parsing of content like "|aa b cc|" which was parsed as "|aa bc|" without error or warning. This will now fail out, requiring all hex values to be 2 chars. Ticket #5201 (cherry picked from commit 8d1e4a1d0b481b289bcbae619693c4c442e937e1) --- diff --git a/src/detect-content.c b/src/detect-content.c index 3e584e7cae..bc7872dc1e 100644 --- a/src/detect-content.c +++ b/src/detect-content.c @@ -107,6 +107,12 @@ int DetectContentDataParse(const char *keyword, const char *contentstr, if (str[i] == '|') { bin_count++; if (bin) { + if (binpos > 0) { + SCLogError(SC_ERR_INVALID_SIGNATURE, + "Incomplete hex code in content - %s. Invalidating signature.", + contentstr); + goto error; + } bin = 0; } else { bin = 1; @@ -3002,7 +3008,25 @@ static int DetectLongContentTest3(void) return !DetectLongContentTestCommon(sig, 1); } -#endif /* UNITTESTS */ +static int DetectBadBinContent(void) +{ + DetectEngineCtx *de_ctx = NULL; + de_ctx = DetectEngineCtxInit(); + FAIL_IF_NULL(de_ctx); + de_ctx->flags |= DE_QUIET; + FAIL_IF_NOT_NULL(DetectEngineAppendSig( + de_ctx, "alert tcp any any -> any any (msg:\"test\"; content:\"|a|\"; sid:1;)")); + FAIL_IF_NOT_NULL(DetectEngineAppendSig( + de_ctx, "alert tcp any any -> any any (msg:\"test\"; content:\"|aa b|\"; sid:1;)")); + FAIL_IF_NOT_NULL(DetectEngineAppendSig( + de_ctx, "alert tcp any any -> any any (msg:\"test\"; content:\"|aa bz|\"; sid:1;)")); + /* https://redmine.openinfosecfoundation.org/issues/5201 */ + FAIL_IF_NOT_NULL(DetectEngineAppendSig( + de_ctx, "alert tcp any any -> any any (msg:\"test\"; content:\"|22 2 22|\"; sid:1;)")); + DetectEngineCtxFree(de_ctx); + PASS; +} +#endif /** * \brief this function registers unit tests for DetectContent @@ -3123,5 +3147,7 @@ static void DetectContentRegisterTests(void) UtRegisterTest("DetectLongContentTest1", DetectLongContentTest1); UtRegisterTest("DetectLongContentTest2", DetectLongContentTest2); UtRegisterTest("DetectLongContentTest3", DetectLongContentTest3); + + UtRegisterTest("DetectBadBinContent", DetectBadBinContent); #endif /* UNITTESTS */ }