26 #include "../suricata-common.h"
27 #include "../decode.h"
29 #include "../detect.h"
36 memset(&tv, 0, sizeof(tv)); \
38 memset(&f, 0, sizeof(f));
40 #define TEST_RUN(buf, buflen, sig, match, steps) \
42 DetectEngineCtx *de_ctx = DetectEngineCtxInit(); \
43 FAIL_IF_NULL(de_ctx); \
44 DetectEngineThreadCtx *det_ctx = NULL; \
46 snprintf(rule, sizeof(rule), "alert tcp any any -> any any (%s sid:1; rev:1;)", (sig)); \
47 Signature *s = DetectEngineAppendSig(de_ctx, rule); \
49 SigGroupBuild(de_ctx); \
50 DetectEngineThreadCtxInit(&tv, (void *)de_ctx, (void *)&det_ctx); \
51 FAIL_IF_NULL(det_ctx); \
52 int r = DetectEngineContentInspection(de_ctx, det_ctx, s, \
53 s->sm_arrays[DETECT_SM_LIST_PMATCH], NULL, &f, (uint8_t *)(buf), (buflen), 0, \
54 DETECT_CI_FLAGS_SINGLE, DETECT_ENGINE_CONTENT_INSPECTION_MODE_PAYLOAD); \
55 FAIL_IF_NOT(r == (match)); \
56 FAIL_IF_NOT(ut_inspection_recursion_counter == (steps)); \
57 DetectEngineThreadCtxDeinit(&tv, det_ctx); \
58 DetectEngineCtxFree(de_ctx); \
59 StatsThreadCleanup(&tv); \
65 static int DetectEngineContentInspectionTest01(
void) {
67 TEST_RUN(
"ab", 2,
"content:\"a\"; content:\"b\";",
true, 2);
68 TEST_RUN(
"ab", 2,
"content:\"a\"; content:\"b\"; distance:0; ",
true, 2);
69 TEST_RUN(
"ba", 2,
"content:\"a\"; content:\"b\"; distance:0; ",
false, 2);
74 static int DetectEngineContentInspectionTest02(
void) {
76 TEST_RUN(
"ab", 2,
"content:\"a\"; pcre:\"/b/\";",
true, 2);
77 TEST_RUN(
"ab", 2,
"content:\"a\"; pcre:\"/b/R\";",
true, 2);
78 TEST_RUN(
"ba", 2,
"content:\"a\"; pcre:\"/b/R\";",
false, 2);
83 static int DetectEngineContentInspectionTest03(
void) {
85 TEST_RUN(
"ababc", 5,
"content:\"a\"; content:\"b\"; content:\"c\";",
true, 3);
86 TEST_RUN(
"ababc", 5,
"content:\"a\"; content:\"b\"; content:\"d\";",
false, 3);
88 TEST_RUN(
"ababc", 5,
"content:\"a\"; content:\"b\"; distance:0; content:\"c\"; distance:0;",
true, 3);
89 TEST_RUN(
"ababc", 5,
"content:\"a\"; content:\"b\"; distance:0; content:\"d\"; distance:0;",
false, 3);
91 TEST_RUN(
"ababc", 5,
"content:\"a\"; content:\"b\"; distance:0; within:1; content:\"d\"; distance:0; within:1;",
false, 5);
94 TEST_RUN(
"ababc", 5,
"content:\"a\"; content:\"b\"; distance:0; within:1; content:\"c\"; distance:0; within:1;",
true, 5);
96 TEST_RUN(
"ababc", 5,
"content:\"a\"; content:\"b\"; distance:0; within:1; content:\"c\"; distance:0; within:1; content:\"bab\";",
true, 6);
98 TEST_RUN(
"ababc", 5,
"content:\"a\"; content:\"b\"; distance:0; within:1; content:\"c\"; distance:0; within:1; content:\"no\";",
false, 6);
101 TEST_RUN(
"ababc", 5,
"content:\"a\"; content:\"b\"; distance:0; within:1; pcre:\"/^c$/R\";",
true, 5);
103 TEST_RUN(
"ababc", 5,
"content:\"a\"; content:\"b\"; distance:0; within:1; pcre:\"/^c$/R\"; content:\"bab\";",
true, 6);
105 TEST_RUN(
"ababc", 5,
"content:\"a\"; content:\"b\"; distance:0; within:1; pcre:\"/^c$/R\"; content:\"no\";",
false, 6);
111 static int DetectEngineContentInspectionTest04(
void) {
113 TEST_RUN(
"ababc", 5,
"content:\"a\"; content:\"b\"; content:\"c\";",
true, 3);
114 TEST_RUN(
"ababc", 5,
"content:\"a\"; content:\"b\"; content:\"d\";",
false, 3);
117 TEST_RUN(
"ababc", 5,
"pcre:\"/^a/\"; pcre:\"/^b/R\"; pcre:\"/c/R\"; ",
true, 3);
118 TEST_RUN(
"ababc", 5,
"pcre:\"/a/\"; pcre:\"/^b/R\"; pcre:\"/^c/R\"; ",
true, 5);
119 TEST_RUN(
"ababc", 5,
"pcre:\"/^a/\"; pcre:\"/^b/R\"; pcre:\"/d/R\"; ",
false, 3);
120 TEST_RUN(
"ababc", 5,
"pcre:\"/^a/\"; pcre:\"/^b/R\"; pcre:\"/c/R\"; pcre:\"/d/\"; ",
false, 4);
126 static int DetectEngineContentInspectionTest05(
void) {
128 TEST_RUN(
"ababc", 5,
"content:\"a\"; content:\"b\"; content:\"c\";",
true, 3);
129 TEST_RUN(
"ababc", 5,
"content:\"a\"; content:\"b\"; content:\"d\";",
false, 3);
133 TEST_RUN(
"ababc", 5,
"content:\"a\"; content:\"b\"; distance:0; within:1; content:\"b\"; content:\"c\"; distance:0; within:1;",
true, 5);
139 static int DetectEngineContentInspectionTest06(
void) {
141 TEST_RUN(
"ababc", 5,
"content:\"a\"; content:\"b\"; content:\"c\";",
true, 3);
142 TEST_RUN(
"ababc", 5,
"content:\"a\"; content:\"b\"; content:\"d\";",
false, 3);
145 TEST_RUN(
"ababc", 5,
"content:\"a\"; content:\"b\"; distance:0; within:1; content:\"c\"; distance:0; within:1; isdataat:!1,relative;",
true, 5);
146 TEST_RUN(
"ababc", 5,
"content:\"a\"; content:\"b\"; distance:0; within:1; content:\"c\"; distance:0; within:1; isdataat:1,relative;",
false, 6);
148 "content:\"a\"; content:\"b\"; distance:0; within:1; content:\"c\"; distance:0; "
149 "within:1; isdataat:10,relative;",
152 TEST_RUN(
"ababcabc", 8,
"content:\"a\"; content:\"b\"; distance:0; within:1; content:\"c\"; distance:0; within:1; isdataat:!1,relative;",
true, 7);
153 TEST_RUN(
"ababcabc", 8,
"content:\"a\"; content:\"b\"; distance:0; within:1; content:\"c\"; distance:0; within:1; isdataat:1,relative;",
true, 6);
155 TEST_RUN(
"abcXYZ", 6,
"content:\"abc\"; content:\"XYZ\"; distance:0; within:3; isdataat:!1,relative;",
true, 2);
156 TEST_RUN(
"abcXYZ", 6,
"content:\"XYZ\"; distance:3; within:3; isdataat:!1,relative;",
true, 1);
157 TEST_RUN(
"abcXYZ", 6,
"content:\"cXY\"; distance:2; within:3; isdataat:!1,relative;",
false, 1);
159 TEST_RUN(
"xxxxxxxxxxxxxxxxxyYYYYYYYYYYYYYYYY", 34,
"content:\"yYYYYYYYYYYYYYYYY\"; distance:9; within:29; isdataat:!1,relative;",
true, 1);
164 static int DetectEngineContentInspectionTest07(
void) {
166 TEST_RUN(
"abcabcabcabcabcabcabcabcabcabcd", 31,
"content:\"a\"; content:\"b\"; within:1; distance:0; content:\"c\"; distance:0; within:1; content:\"d\";",
true, 4);
167 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);
168 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);
170 TEST_RUN(
"abcabcabcabcabcabcabcabcabcabcx", 31,
"content:\"a\"; content:\"b\"; distance:0; content:\"c\"; distance:0; content:\"d\"; distance:0; ",
false, 4);
171 TEST_RUN(
"abcabcabcabcabcabcabcabcabcabcx", 31,
"content:\"a\"; content:\"b\"; distance:0; content:\"c\"; distance:0; pcre:\"/^d/R\"; ",
false, 13);
172 TEST_RUN(
"abcabcabcabcabcabcabcabcabcabcx", 31,
"content:\"a\"; content:\"b\"; distance:0; content:\"c\"; distance:0; isdataat:!1,relative; ",
false, 3);
173 TEST_RUN(
"abcdabcdabcdabcdabcdabcdabcdabcdabcdabcdx", 41,
174 "content:\"a\"; content:\"b\"; distance:0; content:\"c\"; distance:0; content:\"d\"; distance:0; content:\"e\"; distance:0; ",
false, 5);
175 TEST_RUN(
"abcdabcdabcdabcdabcdabcdabcdabcdabcdabcdx", 41,
176 "content:\"a\"; content:\"b\"; distance:0; content:\"c\"; distance:0; content:\"d\"; distance:0; pcre:\"/^e/R\"; ",
false, 14);
177 TEST_RUN(
"abcdabcdabcdabcdabcdabcdabcdabcdabcdabcdx", 41,
178 "content:\"a\"; content:\"b\"; distance:0; content:\"c\"; distance:0; content:\"d\"; distance:0; isdataat:!1,relative; ",
false, 4);
180 TEST_RUN(
"abcabcabcabcabcabcabcabcabcabcd", 31,
"content:\"a\"; content:\"b\"; within:1; distance:0; content:\"c\"; distance:0; within:1; pcre:\"/d/\";",
true, 4);
181 TEST_RUN(
"abcabcabcabcabcabcabcabcabcabcd", 31,
"content:\"a\"; content:\"b\"; within:1; distance:0; content:\"c\"; distance:0; within:1; pcre:\"/d/R\";",
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, 31);
184 TEST_RUN(
"abcabcabcabcabcabcabcabcabcabcx", 31,
"content:\"a\"; content:\"b\"; within:1; distance:0; content:\"c\"; distance:0; within:1; pcre:\"/d/\";",
false, 4);
185 TEST_RUN(
"abcabcabcabcabcabcabcabcabcabcx", 31,
"content:\"a\"; content:\"b\"; within:1; distance:0; content:\"c\"; distance:0; within:1; pcre:\"/d/R\";",
false, 31);
186 TEST_RUN(
"abcabcabcabcabcabcabcabcabcabcx", 31,
"content:\"a\"; content:\"b\"; within:1; distance:0; content:\"c\"; distance:0; within:1; pcre:\"/^d/R\";",
false, 31);
191 static int DetectEngineContentInspectionTest08(
void) {
193 TEST_RUN(
"ababc", 5,
"content:\"a\"; content:\"b\"; content:!\"d\";",
true, 3);
194 TEST_RUN(
"ababc", 5,
"content:\"a\"; content:\"b\"; content:!\"c\";",
false, 3);
196 TEST_RUN(
"ababc", 5,
"content:\"a\"; content:\"b\"; distance:0; within:1; content:!\"a\"; distance:0; within:1;",
true, 5);
197 TEST_RUN(
"ababc", 5,
"content:\"a\"; content:\"b\"; distance:0; within:1; content:!\"a\"; distance:0; ",
true, 5);
199 TEST_RUN(
"abcdefghy", 9,
"content:\"a\"; content:!\"x\"; content:\"c\"; distance:0; within:2; ",
201 TEST_RUN(
"abcdefghx", 9,
"content:\"a\"; content:!\"x\"; content:\"c\"; distance:0; within:2; ",
204 "content:\"a\"; content:!\"x\"; content:!\"c\"; distance:2; within:1; ",
true, 3);
206 TEST_RUN(
"aaabbbccc", 9,
"content:\"ccc\"; endswith; content:!\"bccc\"; endswith; ",
false, 2);
207 TEST_RUN(
"aaabbbccc", 9,
"content:\"ccc\"; endswith; content:!\"accc\"; endswith; ",
true, 2);
208 TEST_RUN(
"aaabbbccc", 9,
"content:\"ccc\"; endswith; content:!\"bccc\"; endswith; depth:4; ",
210 TEST_RUN(
"aaabbbccc", 9,
"content:\"ccc\"; endswith; content:!\"bccc\"; endswith; depth:9; ",
216 static int DetectEngineContentInspectionTest09(
void) {
218 TEST_RUN(
"ababc", 5,
"content:\"a\"; content:\"b\"; content:!\"d\";",
true, 3);
219 TEST_RUN(
"ababc", 5,
"content:\"a\"; content:\"b\"; content:!\"c\";",
false, 3);
221 TEST_RUN(
"abc03abcxyz", 11,
"content:\"abc\"; byte_jump:2,0,relative,string,dec; content:\"xyz\"; within:3;",
true, 3);
222 TEST_RUN(
"abc03abc03abcxyz", 16,
"content:\"abc\"; byte_jump:2,0,relative,string,dec; content:\"xyz\"; within:3;",
true, 5);
223 TEST_RUN(
"abc03abc03abcxyz", 16,
"content:\"abc\"; byte_jump:2,0,relative,string,dec; content:\"xyz\"; within:3; isdataat:!1,relative;",
true, 5);
224 TEST_RUN(
"abc03abc03abcxyz", 16,
"content:\"abc\"; byte_jump:2,0,relative,string,dec; content:\"xyz\"; within:3; pcre:\"/klm$/R\";",
false, 7);
225 TEST_RUN(
"abc03abc03abcxyzklm", 19,
"content:\"abc\"; byte_jump:2,0,relative,string,dec; content:\"xyz\"; within:3; pcre:\"/klm$/R\";",
true, 6);
226 TEST_RUN(
"abc03abc03abcxyzklx", 19,
"content:\"abc\"; byte_jump:2,0,relative,string,dec; content:\"xyz\"; within:3; pcre:\"/^klm$/R\";",
false, 7);
227 TEST_RUN(
"abc03abc03abc03abcxyzklm", 24,
"content:\"abc\"; byte_jump:2,0,relative,string,dec; content:\"xyz\"; within:3; pcre:\"/^klm$/R\";",
true, 8);
233 static int DetectEngineContentInspectionTest10(
void) {
236 TEST_RUN(
"9abcdefghi", 10,
"byte_extract:1,0,data_size,string; isdataat:data_size;",
true, 2);
237 TEST_RUN(
"9abcdefgh", 9,
"byte_extract:1,0,data_size,string; isdataat:!data_size;",
true, 2);
239 TEST_RUN(
"x9x9abcdefghi", 13,
"content:\"x\"; byte_extract:1,0,data_size,string,relative; isdataat:data_size,relative;",
true, 3);
240 TEST_RUN(
"x9x9abcdefgh", 12,
"content:\"x\"; byte_extract:1,0,data_size,string,relative; isdataat:!data_size,relative;",
true, 5);
241 TEST_RUN(
"x9x9abcdefgh", 12,
"content:\"x\"; depth:1; byte_extract:1,0,data_size,string,relative; isdataat:!data_size,relative;",
false, 3);
244 "content:\"x\"; byte_extract:1,0,data_size,string,relative; "
245 "isdataat:data_size,relative;",
248 TEST_RUN(
"100000000abcdefghi", 18,
"byte_extract:0,0,data_size,string; isdataat:data_size;",
false, 2);
249 TEST_RUN(
"100000000abcdefghi", 18,
"byte_extract:0,0,data_size,string; isdataat:!data_size;",
true, 2);
253 static int DetectEngineContentInspectionTest11(
void) {
255 TEST_RUN(
"ab", 2,
"content:\"a\"; startswith; content:\"b\";",
true, 2);
256 TEST_RUN(
"ab", 2,
"content:\"a\"; startswith; content:\"b\"; within:1; distance:0;",
true, 2);
257 TEST_RUN(
"ab", 2,
"content:\"ab\"; startswith;",
true, 1);
258 TEST_RUN(
"ab", 2,
"content:\"a\"; startswith;",
true, 1);
259 TEST_RUN(
"ab", 2,
"content:\"b\"; startswith;",
false, 1);
265 static int DetectEngineContentInspectionTest12(
void) {
268 TEST_RUN(
"ababc", 5,
"content:\"a\"; content:\"b\"; distance:0; within:1; content:\"c\"; distance:0; within:1; endswith;",
true, 5);
270 TEST_RUN(
"ababcabc", 8,
"content:\"a\"; content:\"b\"; distance:0; within:1; content:\"c\"; distance:0; within:1; endswith;",
true, 7);
272 TEST_RUN(
"abcXYZ", 6,
"content:\"abc\"; content:\"XYZ\"; distance:0; within:3; endswith;",
true, 2);
273 TEST_RUN(
"abcXYZ", 6,
"content:\"XYZ\"; distance:3; within:3; endswith;",
true, 1);
274 TEST_RUN(
"abcXYZ", 6,
"content:\"cXY\"; distance:2; within:3; endswith;",
false, 1);
275 TEST_RUN(
"abcXYZ", 6,
"content:!\"cXY\"; endswith;",
true, 1);
276 TEST_RUN(
"abcXYZ", 6,
"content:!\"XYZ\"; endswith;",
false, 1);
278 TEST_RUN(
"xxxxxxxxxxxxxxxxxyYYYYYYYYYYYYYYYY", 34,
"content:\"yYYYYYYYYYYYYYYYY\"; distance:9; within:29; endswith;",
true, 1);
282 static int DetectEngineContentInspectionTest13(
void) {
284 TEST_RUN(
"ab", 2,
"content:\"a\"; startswith; content:\"b\"; endswith;",
true, 2);
285 TEST_RUN(
"ab", 2,
"content:\"a\"; startswith; content:\"b\"; within:1; distance:0; endswith;",
true, 2);
286 TEST_RUN(
"ab", 2,
"content:\"ab\"; startswith; endswith;",
true, 1);
287 TEST_RUN(
"ab", 2,
"content:\"a\"; startswith; endswith;",
false, 1);
288 TEST_RUN(
"ab", 2,
"content:\"b\"; startswith;",
false, 1);
289 TEST_RUN(
"ab", 2,
"content:\"b\"; startswith; endswith;",
false, 1);
293 static int DetectEngineContentInspectionTest14(
void)
296 TEST_RUN(
"XYZ_klm_1234abcd_XYZ_klm_5678abcd", 33,
297 "content:\"XYZ\"; content:\"_klm_\"; distance:0; content:\"abcd\"; distance:4; "
298 "byte_test:4,=,1234,-8,relative,string;",
300 TEST_RUN(
"XYZ_klm_1234abcd_XYZ_klm_5678abcd", 33,
301 "content:\"XYZ\"; content:\"_klm_\"; distance:0; content:\"abcd\"; distance:4; "
302 "byte_test:4,=,5678,-8,relative,string;",
308 static int DetectEngineContentInspectionTest17(
void)
312 "content:\"aaa\"; content:\"ee\"; within:2; distance:9; content:\"bbb\"; within:3; "
313 "distance:-11; content:\"ccc\"; within:3; distance:0;",
321 DetectEngineContentInspectionTest01);
323 DetectEngineContentInspectionTest02);
325 DetectEngineContentInspectionTest03);
327 DetectEngineContentInspectionTest04);
329 DetectEngineContentInspectionTest05);
331 DetectEngineContentInspectionTest06);
333 DetectEngineContentInspectionTest07);
335 DetectEngineContentInspectionTest08);
337 DetectEngineContentInspectionTest09);
339 DetectEngineContentInspectionTest10);
341 DetectEngineContentInspectionTest11);
343 DetectEngineContentInspectionTest12);
344 UtRegisterTest(
"DetectEngineContentInspectionTest13 mix startswith/endswith",
345 DetectEngineContentInspectionTest13);
346 UtRegisterTest(
"DetectEngineContentInspectionTest14 byte_test negative offset",
347 DetectEngineContentInspectionTest14);
348 UtRegisterTest(
"DetectEngineContentInspectionTest17 negative distance",
349 DetectEngineContentInspectionTest17);