46 #define PARSE_REGEX "^\\s*([A-z_]+)\\s*(?:,\\s*([A-z_]+))?\\s*(?:,\\s*([A-z_]+))?\\s*$"
54 static void DetectFlowRegisterTests(
void);
59 static bool PrefilterFlowIsPrefilterable(
const Signature *s);
92 static inline int FlowMatch(
const uint32_t pflags,
const uint8_t pflowflags,
const uint16_t dflags,
93 const uint16_t match_cnt)
119 return (match_cnt ==
cnt) ? 1 : 0;
153 SCLogDebug(
"returning %" PRId32
" fd->match_cnt %" PRId32
" fd->flags 0x%02X p->flowflags 0x%02X",
172 char *args[3] = {NULL,NULL,NULL};
175 char str1[16] =
"", str2[16] =
"", str3[16] =
"";
176 pcre2_match_data *match = NULL;
179 if (ret < 1 || ret > 4) {
180 SCLogError(
"parse error, ret %" PRId32
", string %s", ret, flowstr);
185 pcre2len =
sizeof(str1);
188 SCLogError(
"pcre2_substring_copy_bynumber failed");
191 args[0] = (
char *)str1;
194 pcre2len =
sizeof(str2);
195 res = pcre2_substring_copy_bynumber(match, 2, (PCRE2_UCHAR8 *)str2, &pcre2len);
197 SCLogError(
"pcre2_substring_copy_bynumber failed");
200 args[1] = (
char *)str2;
203 pcre2len =
sizeof(str3);
204 res = pcre2_substring_copy_bynumber(match, 3, (PCRE2_UCHAR8 *)str3, &pcre2len);
206 SCLogError(
"pcre2_substring_copy_bynumber failed");
209 args[2] = (
char *)str3;
219 for (
int i = 0; i < (ret - 1); i++) {
222 if (strcasecmp(args[i],
"established") == 0) {
224 SCLogError(
"DETECT_FLOW_FLAG_ESTABLISHED flag is already set");
227 SCLogError(
"cannot set DETECT_FLOW_FLAG_ESTABLISHED, "
228 "DETECT_FLOW_FLAG_NOT_ESTABLISHED already set");
231 SCLogError(
"DETECT_FLOW_FLAG_STATELESS already set");
236 }
else if (strcasecmp(args[i],
"not_established") == 0) {
238 SCLogError(
"DETECT_FLOW_FLAG_NOT_ESTABLISHED flag is already set");
241 SCLogError(
"cannot set DETECT_FLOW_FLAG_NOT_ESTABLISHED, "
242 "DETECT_FLOW_FLAG_ESTABLISHED already set");
247 }
else if (strcasecmp(args[i],
"stateless") == 0) {
249 SCLogError(
"DETECT_FLOW_FLAG_STATELESS flag is already set");
252 SCLogError(
"cannot set DETECT_FLOW_FLAG_STATELESS, "
253 "DETECT_FLOW_FLAG_ESTABLISHED already set");
258 }
else if (strcasecmp(args[i],
"to_client") == 0 || strcasecmp(args[i],
"from_server") == 0) {
260 SCLogError(
"cannot set DETECT_FLOW_FLAG_TOCLIENT flag is already set");
263 SCLogError(
"cannot set to_client, DETECT_FLOW_FLAG_TOSERVER already set");
268 }
else if (strcasecmp(args[i],
"to_server") == 0 || strcasecmp(args[i],
"from_client") == 0){
270 SCLogError(
"cannot set DETECT_FLOW_FLAG_TOSERVER flag is already set");
273 SCLogError(
"cannot set to_server, DETECT_FLOW_FLAG_TO_CLIENT flag already set");
278 }
else if (strcasecmp(args[i],
"no_frag") == 0) {
280 SCLogError(
"cannot set no_frag flag is already set");
283 SCLogError(
"cannot set no_frag flag, only_frag already set");
288 }
else if (strcasecmp(args[i],
"only_frag") == 0) {
290 SCLogError(
"cannot set only_frag flag is already set");
293 SCLogError(
"cannot set only_frag flag, no_frag already set");
301 }
else if (strcasecmp(args[i],
"only_stream") == 0) {
303 SCLogError(
"cannot set only_stream flag is already set");
307 "cannot set only_stream flag, DETECT_FLOW_FLAG_NOSTREAM already set");
311 }
else if (strcasecmp(args[i],
"no_stream") == 0) {
313 SCLogError(
"cannot set no_stream flag is already set");
317 "cannot set no_stream flag, DETECT_FLOW_FLAG_ONLYSTREAM already set");
322 SCLogError(
"invalid flow option \"%s\"", args[i]);
327 pcre2_match_data_free(match);
332 pcre2_match_data_free(match);
342 #define SIG_FLAG_BOTH (SIG_FLAG_TOSERVER|SIG_FLAG_TOCLIENT)
383 uint16_t parse_flags = 0;
387 SCLogError(
"A signature may have only one flow option.");
395 bool appendsm =
true;
400 "rule %u means to use both directions, cannot specify a flow direction", s->
id);
404 SCLogError(
"rule %u has flow to_server but a hook to_client", s->
id);
411 "rule %u means to use both directions, cannot specify a flow direction", s->
id);
415 SCLogError(
"rule %u has flow to_client but a hook to_server", s->
id);
477 if (!PrefilterPacketHeaderExtraMatch(
ctx,
p))
482 PrefilterAddSids(&det_ctx->
pmq,
ctx->sigs_array,
ctx->sigs_cnt);
505 PrefilterPacketFlowCompare, PrefilterPacketFlowMatch);
508 static bool PrefilterFlowIsPrefilterable(
const Signature *s)
510 return PrefilterIsPrefilterableById(s,
DETECT_FLOW);
520 static int DetectFlowTestParse01 (
void)
522 uint16_t parsed_flags = 0;
523 DetectFlowData *fd = DetectFlowParse(NULL,
"established", &parsed_flags);
533 static int DetectFlowTestParse02 (
void)
535 uint16_t parsed_flags = 0;
536 DetectFlowData *fd = DetectFlowParse(NULL,
"established", &parsed_flags);
547 static int DetectFlowTestParse03 (
void)
549 uint16_t parsed_flags = 0;
550 DetectFlowData *fd = DetectFlowParse(NULL,
"stateless", &parsed_flags);
560 static int DetectFlowTestParse04 (
void)
562 uint16_t parsed_flags = 0;
563 DetectFlowData *fd = DetectFlowParse(NULL,
"to_client", &parsed_flags);
573 static int DetectFlowTestParse05 (
void)
575 uint16_t parsed_flags = 0;
576 DetectFlowData *fd = DetectFlowParse(NULL,
"to_server", &parsed_flags);
586 static int DetectFlowTestParse06 (
void)
588 uint16_t parsed_flags = 0;
589 DetectFlowData *fd = DetectFlowParse(NULL,
"from_server", &parsed_flags);
599 static int DetectFlowTestParse07 (
void)
601 uint16_t parsed_flags = 0;
602 DetectFlowData *fd = DetectFlowParse(NULL,
"from_client", &parsed_flags);
612 static int DetectFlowTestParse08 (
void)
614 uint16_t parsed_flags = 0;
615 DetectFlowData *fd = DetectFlowParse(NULL,
"established,to_client", &parsed_flags);
625 static int DetectFlowTestParse09 (
void)
627 uint16_t parsed_flags = 0;
628 DetectFlowData *fd = DetectFlowParse(NULL,
"to_client,stateless", &parsed_flags);
640 static int DetectFlowTestParse10 (
void)
642 uint16_t parsed_flags = 0;
643 DetectFlowData *fd = DetectFlowParse(NULL,
"from_server,stateless", &parsed_flags);
655 static int DetectFlowTestParse11 (
void)
657 uint16_t parsed_flags = 0;
658 DetectFlowData *fd = DetectFlowParse(NULL,
" from_server , stateless ", &parsed_flags);
671 static int DetectFlowTestParseNocase01 (
void)
673 uint16_t parsed_flags = 0;
674 DetectFlowData *fd = DetectFlowParse(NULL,
"ESTABLISHED", &parsed_flags);
683 static int DetectFlowTestParseNocase02 (
void)
685 uint16_t parsed_flags = 0;
686 DetectFlowData *fd = DetectFlowParse(NULL,
"ESTABLISHED", &parsed_flags);
697 static int DetectFlowTestParseNocase03 (
void)
699 uint16_t parsed_flags = 0;
700 DetectFlowData *fd = DetectFlowParse(NULL,
"STATELESS", &parsed_flags);
710 static int DetectFlowTestParseNocase04 (
void)
712 uint16_t parsed_flags = 0;
713 DetectFlowData *fd = DetectFlowParse(NULL,
"TO_CLIENT", &parsed_flags);
723 static int DetectFlowTestParseNocase05 (
void)
725 uint16_t parsed_flags = 0;
726 DetectFlowData *fd = DetectFlowParse(NULL,
"TO_SERVER", &parsed_flags);
736 static int DetectFlowTestParseNocase06 (
void)
738 uint16_t parsed_flags = 0;
739 DetectFlowData *fd = DetectFlowParse(NULL,
"FROM_SERVER", &parsed_flags);
749 static int DetectFlowTestParseNocase07 (
void)
751 uint16_t parsed_flags = 0;
752 DetectFlowData *fd = DetectFlowParse(NULL,
"FROM_CLIENT", &parsed_flags);
762 static int DetectFlowTestParseNocase08 (
void)
764 uint16_t parsed_flags = 0;
765 DetectFlowData *fd = DetectFlowParse(NULL,
"ESTABLISHED,TO_CLIENT", &parsed_flags);
777 static int DetectFlowTestParseNocase09 (
void)
779 uint16_t parsed_flags = 0;
780 DetectFlowData *fd = DetectFlowParse(NULL,
"TO_CLIENT,STATELESS", &parsed_flags);
792 static int DetectFlowTestParseNocase10 (
void)
794 uint16_t parsed_flags = 0;
795 DetectFlowData *fd = DetectFlowParse(NULL,
"FROM_SERVER,STATELESS", &parsed_flags);
807 static int DetectFlowTestParseNocase11 (
void)
809 uint16_t parsed_flags = 0;
810 DetectFlowData *fd = DetectFlowParse(NULL,
" FROM_SERVER , STATELESS ", &parsed_flags);
822 static int DetectFlowTestParse12 (
void)
824 uint16_t parsed_flags = 0;
825 DetectFlowData *fd = DetectFlowParse(NULL,
"from_server:stateless", &parsed_flags);
833 static int DetectFlowTestParse13 (
void)
835 uint16_t parsed_flags = 0;
836 DetectFlowData *fd = DetectFlowParse(NULL,
"invalidoptiontest", &parsed_flags);
844 static int DetectFlowTestParse14 (
void)
846 uint16_t parsed_flags = 0;
855 static int DetectFlowTestParse15 (
void)
857 uint16_t parsed_flags = 0;
858 DetectFlowData *fd = DetectFlowParse(NULL,
"established,stateless", &parsed_flags);
866 static int DetectFlowTestParse16 (
void)
868 uint16_t parsed_flags = 0;
869 DetectFlowData *fd = DetectFlowParse(NULL,
"to_client,to_server", &parsed_flags);
878 static int DetectFlowTestParse17 (
void)
880 uint16_t parsed_flags = 0;
881 DetectFlowData *fd = DetectFlowParse(NULL,
"to_client,from_server", &parsed_flags);
889 static int DetectFlowTestParse18 (
void)
891 uint16_t parsed_flags = 0;
893 DetectFlowParse(NULL,
"from_server,established,only_stream", &parsed_flags);
905 static int DetectFlowTestParseNocase18 (
void)
907 uint16_t parsed_flags = 0;
909 DetectFlowParse(NULL,
"FROM_SERVER,ESTABLISHED,ONLY_STREAM", &parsed_flags);
922 static int DetectFlowTestParse19 (
void)
924 uint16_t parsed_flags = 0;
926 DetectFlowParse(NULL,
"from_server,established,only_stream,a", &parsed_flags);
934 static int DetectFlowTestParse20 (
void)
936 uint16_t parsed_flags = 0;
937 DetectFlowData *fd = DetectFlowParse(NULL,
"from_server,established,no_stream", &parsed_flags);
949 static int DetectFlowTestParseNocase20 (
void)
951 uint16_t parsed_flags = 0;
952 DetectFlowData *fd = DetectFlowParse(NULL,
"FROM_SERVER,ESTABLISHED,NO_STREAM", &parsed_flags);
964 static int DetectFlowTestParse21 (
void)
966 uint16_t parsed_flags = 0;
967 DetectFlowData *fd = DetectFlowParse(NULL,
"from_server,a,no_stream", &parsed_flags);
975 static int DetectFlowTestParse22(
void)
977 uint16_t parsed_flags = 0;
978 DetectFlowData *fd = DetectFlowParse(NULL,
"established,not_established", &parsed_flags);
980 fd = DetectFlowParse(NULL,
"not_established,established", &parsed_flags);
985 static int DetectFlowSigTest01(
void)
987 uint8_t *buf = (uint8_t *)
"supernovaduper";
988 uint16_t buflen = strlen((
char *)buf);
998 const char *sig1 =
"alert tcp any any -> any any (msg:\"dummy\"; "
999 "content:\"nova\"; flow:no_stream; sid:1;)";
1027 static int DetectFlowTestParseNotEstablished(
void)
1029 uint16_t parsed_flags = 0;
1030 DetectFlowData *fd = DetectFlowParse(NULL,
"not_established", &parsed_flags);
1040 static int DetectFlowTestParseNoFrag(
void)
1042 uint16_t parsed_flags = 0;
1043 DetectFlowData *fd = DetectFlowParse(NULL,
"no_frag", &parsed_flags);
1053 static int DetectFlowTestParseOnlyFrag(
void)
1055 uint16_t parsed_flags = 0;
1056 DetectFlowData *fd = DetectFlowParse(NULL,
"only_frag", &parsed_flags);
1066 static int DetectFlowTestParseNoFragOnlyFrag(
void)
1068 uint16_t parsed_flags = 0;
1069 DetectFlowData *fd = DetectFlowParse(NULL,
"no_frag,only_frag", &parsed_flags);
1077 static int DetectFlowTestNoFragMatch(
void)
1079 uint16_t parsed_flags = 0;
1080 uint32_t pflags = 0;
1081 DetectFlowData *fd = DetectFlowParse(NULL,
"no_frag", &parsed_flags);
1095 static int DetectFlowTestOnlyFragMatch(
void)
1097 uint16_t parsed_flags = 0;
1098 uint32_t pflags = 0;
1099 DetectFlowData *fd = DetectFlowParse(NULL,
"only_frag", &parsed_flags);
1113 static void DetectFlowRegisterTests(
void)
1126 UtRegisterTest(
"DetectFlowTestParseNocase01", DetectFlowTestParseNocase01);
1127 UtRegisterTest(
"DetectFlowTestParseNocase02", DetectFlowTestParseNocase02);
1128 UtRegisterTest(
"DetectFlowTestParseNocase03", DetectFlowTestParseNocase03);
1129 UtRegisterTest(
"DetectFlowTestParseNocase04", DetectFlowTestParseNocase04);
1130 UtRegisterTest(
"DetectFlowTestParseNocase05", DetectFlowTestParseNocase05);
1131 UtRegisterTest(
"DetectFlowTestParseNocase06", DetectFlowTestParseNocase06);
1132 UtRegisterTest(
"DetectFlowTestParseNocase07", DetectFlowTestParseNocase07);
1133 UtRegisterTest(
"DetectFlowTestParseNocase08", DetectFlowTestParseNocase08);
1134 UtRegisterTest(
"DetectFlowTestParseNocase09", DetectFlowTestParseNocase09);
1135 UtRegisterTest(
"DetectFlowTestParseNocase10", DetectFlowTestParseNocase10);
1136 UtRegisterTest(
"DetectFlowTestParseNocase11", DetectFlowTestParseNocase11);
1144 UtRegisterTest(
"DetectFlowTestParseNocase18", DetectFlowTestParseNocase18);
1147 UtRegisterTest(
"DetectFlowTestParseNocase20", DetectFlowTestParseNocase20);
1151 DetectFlowTestParseNotEstablished);
1152 UtRegisterTest(
"DetectFlowTestParseNoFrag", DetectFlowTestParseNoFrag);
1154 DetectFlowTestParseOnlyFrag);
1156 DetectFlowTestParseNoFragOnlyFrag);
1157 UtRegisterTest(
"DetectFlowTestNoFragMatch", DetectFlowTestNoFragMatch);
1158 UtRegisterTest(
"DetectFlowTestOnlyFragMatch", DetectFlowTestOnlyFragMatch);