26 #include "../suricata-common.h"
27 #include "../decode.h"
29 #include "../detect.h"
36 memset(&tv, 0, sizeof(tv)); \
37 StatsThreadInit(&tv.stats); \
39 memset(&f, 0, sizeof(f));
41 #define TEST_RUN(buf, buflen, sig, match, steps) \
43 DetectEngineCtx *de_ctx = DetectEngineCtxInit(); \
44 FAIL_IF_NULL(de_ctx); \
45 DetectEngineThreadCtx *det_ctx = NULL; \
47 snprintf(rule, sizeof(rule), "alert tcp any any -> any any (%s sid:1; rev:1;)", (sig)); \
48 Signature *s = DetectEngineAppendSig(de_ctx, rule); \
50 SigGroupBuild(de_ctx); \
51 DetectEngineThreadCtxInit(&tv, (void *)de_ctx, (void *)&det_ctx); \
52 FAIL_IF_NULL(det_ctx); \
53 int r = DetectEngineContentInspection(de_ctx, det_ctx, s, \
54 s->sm_arrays[DETECT_SM_LIST_PMATCH], NULL, &f, (uint8_t *)(buf), (buflen), 0, \
55 DETECT_CI_FLAGS_SINGLE, DETECT_ENGINE_CONTENT_INSPECTION_MODE_PAYLOAD); \
56 FAIL_IF_NOT(r == (match)); \
57 FAIL_IF_NOT(ut_inspection_recursion_counter == (steps)); \
58 DetectEngineThreadCtxDeinit(&tv, det_ctx); \
59 DetectEngineCtxFree(de_ctx); \
60 StatsThreadCleanup(&tv.stats); \
66 static int DetectEngineContentInspectionTest01(
void) {
68 TEST_RUN(
"ab", 2,
"content:\"a\"; content:\"b\";",
true, 2);
69 TEST_RUN(
"ab", 2,
"content:\"a\"; content:\"b\"; distance:0; ",
true, 2);
70 TEST_RUN(
"ba", 2,
"content:\"a\"; content:\"b\"; distance:0; ",
false, 2);
75 static int DetectEngineContentInspectionTest02(
void) {
77 TEST_RUN(
"ab", 2,
"content:\"a\"; pcre:\"/b/\";",
true, 2);
78 TEST_RUN(
"ab", 2,
"content:\"a\"; pcre:\"/b/R\";",
true, 2);
79 TEST_RUN(
"ba", 2,
"content:\"a\"; pcre:\"/b/R\";",
false, 2);
84 static int DetectEngineContentInspectionTest03(
void) {
86 TEST_RUN(
"ababc", 5,
"content:\"a\"; content:\"b\"; content:\"c\";",
true, 3);
87 TEST_RUN(
"ababc", 5,
"content:\"a\"; content:\"b\"; content:\"d\";",
false, 3);
89 TEST_RUN(
"ababc", 5,
"content:\"a\"; content:\"b\"; distance:0; content:\"c\"; distance:0;",
true, 3);
90 TEST_RUN(
"ababc", 5,
"content:\"a\"; content:\"b\"; distance:0; content:\"d\"; distance:0;",
false, 3);
92 TEST_RUN(
"ababc", 5,
"content:\"a\"; content:\"b\"; distance:0; within:1; content:\"d\"; distance:0; within:1;",
false, 5);
95 TEST_RUN(
"ababc", 5,
"content:\"a\"; content:\"b\"; distance:0; within:1; content:\"c\"; distance:0; within:1;",
true, 5);
97 TEST_RUN(
"ababc", 5,
"content:\"a\"; content:\"b\"; distance:0; within:1; content:\"c\"; distance:0; within:1; content:\"bab\";",
true, 6);
99 TEST_RUN(
"ababc", 5,
"content:\"a\"; content:\"b\"; distance:0; within:1; content:\"c\"; distance:0; within:1; content:\"no\";",
false, 6);
102 TEST_RUN(
"ababc", 5,
"content:\"a\"; content:\"b\"; distance:0; within:1; pcre:\"/^c$/R\";",
true, 5);
104 TEST_RUN(
"ababc", 5,
"content:\"a\"; content:\"b\"; distance:0; within:1; pcre:\"/^c$/R\"; content:\"bab\";",
true, 6);
106 TEST_RUN(
"ababc", 5,
"content:\"a\"; content:\"b\"; distance:0; within:1; pcre:\"/^c$/R\"; content:\"no\";",
false, 6);
112 static int DetectEngineContentInspectionTest04(
void) {
114 TEST_RUN(
"ababc", 5,
"content:\"a\"; content:\"b\"; content:\"c\";",
true, 3);
115 TEST_RUN(
"ababc", 5,
"content:\"a\"; content:\"b\"; content:\"d\";",
false, 3);
118 TEST_RUN(
"ababc", 5,
"pcre:\"/^a/\"; pcre:\"/^b/R\"; pcre:\"/c/R\"; ",
true, 3);
119 TEST_RUN(
"ababc", 5,
"pcre:\"/a/\"; pcre:\"/^b/R\"; pcre:\"/^c/R\"; ",
true, 5);
120 TEST_RUN(
"ababc", 5,
"pcre:\"/^a/\"; pcre:\"/^b/R\"; pcre:\"/d/R\"; ",
false, 3);
121 TEST_RUN(
"ababc", 5,
"pcre:\"/^a/\"; pcre:\"/^b/R\"; pcre:\"/c/R\"; pcre:\"/d/\"; ",
false, 4);
127 static int DetectEngineContentInspectionTest05(
void) {
129 TEST_RUN(
"ababc", 5,
"content:\"a\"; content:\"b\"; content:\"c\";",
true, 3);
130 TEST_RUN(
"ababc", 5,
"content:\"a\"; content:\"b\"; content:\"d\";",
false, 3);
134 TEST_RUN(
"ababc", 5,
"content:\"a\"; content:\"b\"; distance:0; within:1; content:\"b\"; content:\"c\"; distance:0; within:1;",
true, 5);
140 static int DetectEngineContentInspectionTest06(
void) {
142 TEST_RUN(
"ababc", 5,
"content:\"a\"; content:\"b\"; content:\"c\";",
true, 3);
143 TEST_RUN(
"ababc", 5,
"content:\"a\"; content:\"b\"; content:\"d\";",
false, 3);
146 TEST_RUN(
"ababc", 5,
"content:\"a\"; content:\"b\"; distance:0; within:1; content:\"c\"; distance:0; within:1; isdataat:!1,relative;",
true, 5);
147 TEST_RUN(
"ababc", 5,
"content:\"a\"; content:\"b\"; distance:0; within:1; content:\"c\"; distance:0; within:1; isdataat:1,relative;",
false, 6);
149 "content:\"a\"; content:\"b\"; distance:0; within:1; content:\"c\"; distance:0; "
150 "within:1; isdataat:10,relative;",
153 TEST_RUN(
"ababcabc", 8,
"content:\"a\"; content:\"b\"; distance:0; within:1; content:\"c\"; distance:0; within:1; isdataat:!1,relative;",
true, 7);
154 TEST_RUN(
"ababcabc", 8,
"content:\"a\"; content:\"b\"; distance:0; within:1; content:\"c\"; distance:0; within:1; isdataat:1,relative;",
true, 6);
156 TEST_RUN(
"abcXYZ", 6,
"content:\"abc\"; content:\"XYZ\"; distance:0; within:3; isdataat:!1,relative;",
true, 2);
157 TEST_RUN(
"abcXYZ", 6,
"content:\"XYZ\"; distance:3; within:3; isdataat:!1,relative;",
true, 1);
158 TEST_RUN(
"abcXYZ", 6,
"content:\"cXY\"; distance:2; within:3; isdataat:!1,relative;",
false, 1);
160 TEST_RUN(
"xxxxxxxxxxxxxxxxxyYYYYYYYYYYYYYYYY", 34,
"content:\"yYYYYYYYYYYYYYYYY\"; distance:9; within:29; isdataat:!1,relative;",
true, 1);
165 static int DetectEngineContentInspectionTest07(
void) {
167 TEST_RUN(
"abcabcabcabcabcabcabcabcabcabcd", 31,
"content:\"a\"; content:\"b\"; within:1; distance:0; content:\"c\"; distance:0; within:1; content:\"d\";",
true, 4);
168 TEST_RUN(
"abcabcabcabcabcabcabcabcabcabcd", 31,
"content:\"a\"; content:\"b\"; within:1; distance:0; content:\"c\"; distance:0; within:1; content:\"d\"; within:1; distance:0; ",
true, 31);
169 TEST_RUN(
"abcabcabcabcabcabcabcabcabcabcx", 31,
"content:\"a\"; content:\"b\"; within:1; distance:0; content:\"c\"; distance:0; within:1; content:\"d\"; within:1; distance:0; ",
false, 31);
171 TEST_RUN(
"abcabcabcabcabcabcabcabcabcabcx", 31,
"content:\"a\"; content:\"b\"; distance:0; content:\"c\"; distance:0; content:\"d\"; distance:0; ",
false, 4);
172 TEST_RUN(
"abcabcabcabcabcabcabcabcabcabcx", 31,
"content:\"a\"; content:\"b\"; distance:0; content:\"c\"; distance:0; pcre:\"/^d/R\"; ",
false, 13);
173 TEST_RUN(
"abcabcabcabcabcabcabcabcabcabcx", 31,
"content:\"a\"; content:\"b\"; distance:0; content:\"c\"; distance:0; isdataat:!1,relative; ",
false, 3);
174 TEST_RUN(
"abcdabcdabcdabcdabcdabcdabcdabcdabcdabcdx", 41,
175 "content:\"a\"; content:\"b\"; distance:0; content:\"c\"; distance:0; content:\"d\"; distance:0; content:\"e\"; distance:0; ",
false, 5);
176 TEST_RUN(
"abcdabcdabcdabcdabcdabcdabcdabcdabcdabcdx", 41,
177 "content:\"a\"; content:\"b\"; distance:0; content:\"c\"; distance:0; content:\"d\"; distance:0; pcre:\"/^e/R\"; ",
false, 14);
178 TEST_RUN(
"abcdabcdabcdabcdabcdabcdabcdabcdabcdabcdx", 41,
179 "content:\"a\"; content:\"b\"; distance:0; content:\"c\"; distance:0; content:\"d\"; distance:0; isdataat:!1,relative; ",
false, 4);
181 TEST_RUN(
"abcabcabcabcabcabcabcabcabcabcd", 31,
"content:\"a\"; content:\"b\"; within:1; distance:0; content:\"c\"; distance:0; within:1; pcre:\"/d/\";",
true, 4);
182 TEST_RUN(
"abcabcabcabcabcabcabcabcabcabcd", 31,
"content:\"a\"; content:\"b\"; within:1; distance:0; content:\"c\"; distance:0; within:1; pcre:\"/d/R\";",
true, 4);
183 TEST_RUN(
"abcabcabcabcabcabcabcabcabcabcd", 31,
"content:\"a\"; content:\"b\"; within:1; distance:0; content:\"c\"; distance:0; within:1; pcre:\"/^d/R\";",
true, 31);
185 TEST_RUN(
"abcabcabcabcabcabcabcabcabcabcx", 31,
"content:\"a\"; content:\"b\"; within:1; distance:0; content:\"c\"; distance:0; within:1; pcre:\"/d/\";",
false, 4);
186 TEST_RUN(
"abcabcabcabcabcabcabcabcabcabcx", 31,
"content:\"a\"; content:\"b\"; within:1; distance:0; content:\"c\"; distance:0; within:1; pcre:\"/d/R\";",
false, 31);
187 TEST_RUN(
"abcabcabcabcabcabcabcabcabcabcx", 31,
"content:\"a\"; content:\"b\"; within:1; distance:0; content:\"c\"; distance:0; within:1; pcre:\"/^d/R\";",
false, 31);
192 static int DetectEngineContentInspectionTest08(
void) {
194 TEST_RUN(
"ababc", 5,
"content:\"a\"; content:\"b\"; content:!\"d\";",
true, 3);
195 TEST_RUN(
"ababc", 5,
"content:\"a\"; content:\"b\"; content:!\"c\";",
false, 3);
197 TEST_RUN(
"ababc", 5,
"content:\"a\"; content:\"b\"; distance:0; within:1; content:!\"a\"; distance:0; within:1;",
true, 5);
198 TEST_RUN(
"ababc", 5,
"content:\"a\"; content:\"b\"; distance:0; within:1; content:!\"a\"; distance:0; ",
true, 5);
200 TEST_RUN(
"abcdefghy", 9,
"content:\"a\"; content:!\"x\"; content:\"c\"; distance:0; within:2; ",
202 TEST_RUN(
"abcdefghx", 9,
"content:\"a\"; content:!\"x\"; content:\"c\"; distance:0; within:2; ",
205 "content:\"a\"; content:!\"x\"; content:!\"c\"; distance:2; within:1; ",
true, 3);
207 TEST_RUN(
"aaabbbccc", 9,
"content:\"ccc\"; endswith; content:!\"bccc\"; endswith; ",
false, 2);
208 TEST_RUN(
"aaabbbccc", 9,
"content:\"ccc\"; endswith; content:!\"accc\"; endswith; ",
true, 2);
209 TEST_RUN(
"aaabbbccc", 9,
"content:\"ccc\"; endswith; content:!\"bccc\"; endswith; depth:4; ",
211 TEST_RUN(
"aaabbbccc", 9,
"content:\"ccc\"; endswith; content:!\"bccc\"; endswith; depth:9; ",
217 static int DetectEngineContentInspectionTest09(
void) {
219 TEST_RUN(
"ababc", 5,
"content:\"a\"; content:\"b\"; content:!\"d\";",
true, 3);
220 TEST_RUN(
"ababc", 5,
"content:\"a\"; content:\"b\"; content:!\"c\";",
false, 3);
222 TEST_RUN(
"abc03abcxyz", 11,
"content:\"abc\"; byte_jump:2,0,relative,string,dec; content:\"xyz\"; within:3;",
true, 3);
223 TEST_RUN(
"abc03abc03abcxyz", 16,
"content:\"abc\"; byte_jump:2,0,relative,string,dec; content:\"xyz\"; within:3;",
true, 5);
224 TEST_RUN(
"abc03abc03abcxyz", 16,
"content:\"abc\"; byte_jump:2,0,relative,string,dec; content:\"xyz\"; within:3; isdataat:!1,relative;",
true, 5);
225 TEST_RUN(
"abc03abc03abcxyz", 16,
"content:\"abc\"; byte_jump:2,0,relative,string,dec; content:\"xyz\"; within:3; pcre:\"/klm$/R\";",
false, 7);
226 TEST_RUN(
"abc03abc03abcxyzklm", 19,
"content:\"abc\"; byte_jump:2,0,relative,string,dec; content:\"xyz\"; within:3; pcre:\"/klm$/R\";",
true, 6);
227 TEST_RUN(
"abc03abc03abcxyzklx", 19,
"content:\"abc\"; byte_jump:2,0,relative,string,dec; content:\"xyz\"; within:3; pcre:\"/^klm$/R\";",
false, 7);
228 TEST_RUN(
"abc03abc03abc03abcxyzklm", 24,
"content:\"abc\"; byte_jump:2,0,relative,string,dec; content:\"xyz\"; within:3; pcre:\"/^klm$/R\";",
true, 8);
234 static int DetectEngineContentInspectionTest10(
void) {
237 TEST_RUN(
"9abcdefghi", 10,
"byte_extract:1,0,data_size,string; isdataat:data_size;",
true, 2);
238 TEST_RUN(
"9abcdefgh", 9,
"byte_extract:1,0,data_size,string; isdataat:!data_size;",
true, 2);
240 TEST_RUN(
"x9x9abcdefghi", 13,
"content:\"x\"; byte_extract:1,0,data_size,string,relative; isdataat:data_size,relative;",
true, 3);
241 TEST_RUN(
"x9x9abcdefgh", 12,
"content:\"x\"; byte_extract:1,0,data_size,string,relative; isdataat:!data_size,relative;",
true, 5);
242 TEST_RUN(
"x9x9abcdefgh", 12,
"content:\"x\"; depth:1; byte_extract:1,0,data_size,string,relative; isdataat:!data_size,relative;",
false, 3);
245 "content:\"x\"; byte_extract:1,0,data_size,string,relative; "
246 "isdataat:data_size,relative;",
249 TEST_RUN(
"100000000abcdefghi", 18,
"byte_extract:0,0,data_size,string; isdataat:data_size;",
false, 2);
250 TEST_RUN(
"100000000abcdefghi", 18,
"byte_extract:0,0,data_size,string; isdataat:!data_size;",
true, 2);
254 static int DetectEngineContentInspectionTest11(
void) {
256 TEST_RUN(
"ab", 2,
"content:\"a\"; startswith; content:\"b\";",
true, 2);
257 TEST_RUN(
"ab", 2,
"content:\"a\"; startswith; content:\"b\"; within:1; distance:0;",
true, 2);
258 TEST_RUN(
"ab", 2,
"content:\"ab\"; startswith;",
true, 1);
259 TEST_RUN(
"ab", 2,
"content:\"a\"; startswith;",
true, 1);
260 TEST_RUN(
"ab", 2,
"content:\"b\"; startswith;",
false, 1);
266 static int DetectEngineContentInspectionTest12(
void) {
269 TEST_RUN(
"ababc", 5,
"content:\"a\"; content:\"b\"; distance:0; within:1; content:\"c\"; distance:0; within:1; endswith;",
true, 5);
271 TEST_RUN(
"ababcabc", 8,
"content:\"a\"; content:\"b\"; distance:0; within:1; content:\"c\"; distance:0; within:1; endswith;",
true, 7);
273 TEST_RUN(
"abcXYZ", 6,
"content:\"abc\"; content:\"XYZ\"; distance:0; within:3; endswith;",
true, 2);
274 TEST_RUN(
"abcXYZ", 6,
"content:\"XYZ\"; distance:3; within:3; endswith;",
true, 1);
275 TEST_RUN(
"abcXYZ", 6,
"content:\"cXY\"; distance:2; within:3; endswith;",
false, 1);
276 TEST_RUN(
"abcXYZ", 6,
"content:!\"cXY\"; endswith;",
true, 1);
277 TEST_RUN(
"abcXYZ", 6,
"content:!\"XYZ\"; endswith;",
false, 1);
279 TEST_RUN(
"xxxxxxxxxxxxxxxxxyYYYYYYYYYYYYYYYY", 34,
"content:\"yYYYYYYYYYYYYYYYY\"; distance:9; within:29; endswith;",
true, 1);
283 static int DetectEngineContentInspectionTest13(
void) {
285 TEST_RUN(
"ab", 2,
"content:\"a\"; startswith; content:\"b\"; endswith;",
true, 2);
286 TEST_RUN(
"ab", 2,
"content:\"a\"; startswith; content:\"b\"; within:1; distance:0; endswith;",
true, 2);
287 TEST_RUN(
"ab", 2,
"content:\"ab\"; startswith; endswith;",
true, 1);
288 TEST_RUN(
"ab", 2,
"content:\"a\"; startswith; endswith;",
false, 1);
289 TEST_RUN(
"ab", 2,
"content:\"b\"; startswith;",
false, 1);
290 TEST_RUN(
"ab", 2,
"content:\"b\"; startswith; endswith;",
false, 1);
294 static int DetectEngineContentInspectionTest14(
void)
297 TEST_RUN(
"XYZ_klm_1234abcd_XYZ_klm_5678abcd", 33,
298 "content:\"XYZ\"; content:\"_klm_\"; distance:0; content:\"abcd\"; distance:4; "
299 "byte_test:4,=,1234,-8,relative,string;",
301 TEST_RUN(
"XYZ_klm_1234abcd_XYZ_klm_5678abcd", 33,
302 "content:\"XYZ\"; content:\"_klm_\"; distance:0; content:\"abcd\"; distance:4; "
303 "byte_test:4,=,5678,-8,relative,string;",
309 static int DetectEngineContentInspectionTest17(
void)
313 "content:\"aaa\"; content:\"ee\"; within:2; distance:9; content:\"bbb\"; within:3; "
314 "distance:-11; content:\"ccc\"; within:3; distance:0;",
322 DetectEngineContentInspectionTest01);
324 DetectEngineContentInspectionTest02);
326 DetectEngineContentInspectionTest03);
328 DetectEngineContentInspectionTest04);
330 DetectEngineContentInspectionTest05);
332 DetectEngineContentInspectionTest06);
334 DetectEngineContentInspectionTest07);
336 DetectEngineContentInspectionTest08);
338 DetectEngineContentInspectionTest09);
340 DetectEngineContentInspectionTest10);
342 DetectEngineContentInspectionTest11);
344 DetectEngineContentInspectionTest12);
345 UtRegisterTest(
"DetectEngineContentInspectionTest13 mix startswith/endswith",
346 DetectEngineContentInspectionTest13);
347 UtRegisterTest(
"DetectEngineContentInspectionTest14 byte_test negative offset",
348 DetectEngineContentInspectionTest14);
349 UtRegisterTest(
"DetectEngineContentInspectionTest17 negative distance",
350 DetectEngineContentInspectionTest17);