47 #define PARSE_REGEX "^\\s*([A-z_]+)\\s*(?:,\\s*([A-z_]+))?\\s*(?:,\\s*([A-z_]+))?\\s*$"
55 static void DetectFlowRegisterTests(
void);
60 static bool PrefilterFlowIsPrefilterable(
const Signature *s);
93 static inline int FlowMatch(
const uint32_t pflags,
const uint8_t pflowflags,
const uint16_t dflags,
94 const uint16_t match_cnt)
120 return (match_cnt ==
cnt) ? 1 : 0;
154 SCLogDebug(
"returning %" PRId32
" fd->match_cnt %" PRId32
" fd->flags 0x%02X p->flowflags 0x%02X",
173 char *args[3] = {NULL,NULL,NULL};
176 char str1[16] =
"", str2[16] =
"", str3[16] =
"";
177 pcre2_match_data *match = NULL;
180 if (ret < 1 || ret > 4) {
181 SCLogError(
"parse error, ret %" PRId32
", string %s", ret, flowstr);
186 pcre2len =
sizeof(str1);
189 SCLogError(
"pcre2_substring_copy_bynumber failed");
192 args[0] = (
char *)str1;
195 pcre2len =
sizeof(str2);
196 res = pcre2_substring_copy_bynumber(match, 2, (PCRE2_UCHAR8 *)str2, &pcre2len);
198 SCLogError(
"pcre2_substring_copy_bynumber failed");
201 args[1] = (
char *)str2;
204 pcre2len =
sizeof(str3);
205 res = pcre2_substring_copy_bynumber(match, 3, (PCRE2_UCHAR8 *)str3, &pcre2len);
207 SCLogError(
"pcre2_substring_copy_bynumber failed");
210 args[2] = (
char *)str3;
220 for (
int i = 0; i < (ret - 1); i++) {
223 if (strcasecmp(args[i],
"established") == 0) {
225 SCLogError(
"DETECT_FLOW_FLAG_ESTABLISHED flag is already set");
228 SCLogError(
"cannot set DETECT_FLOW_FLAG_ESTABLISHED, "
229 "DETECT_FLOW_FLAG_NOT_ESTABLISHED already set");
232 SCLogError(
"DETECT_FLOW_FLAG_STATELESS already set");
237 }
else if (strcasecmp(args[i],
"not_established") == 0) {
239 SCLogError(
"DETECT_FLOW_FLAG_NOT_ESTABLISHED flag is already set");
242 SCLogError(
"cannot set DETECT_FLOW_FLAG_NOT_ESTABLISHED, "
243 "DETECT_FLOW_FLAG_ESTABLISHED already set");
248 }
else if (strcasecmp(args[i],
"stateless") == 0) {
250 SCLogError(
"DETECT_FLOW_FLAG_STATELESS flag is already set");
253 SCLogError(
"cannot set DETECT_FLOW_FLAG_STATELESS, "
254 "DETECT_FLOW_FLAG_ESTABLISHED already set");
259 }
else if (strcasecmp(args[i],
"to_client") == 0 || strcasecmp(args[i],
"from_server") == 0) {
261 SCLogError(
"cannot set DETECT_FLOW_FLAG_TOCLIENT flag is already set");
264 SCLogError(
"cannot set to_client, DETECT_FLOW_FLAG_TOSERVER already set");
269 }
else if (strcasecmp(args[i],
"to_server") == 0 || strcasecmp(args[i],
"from_client") == 0){
271 SCLogError(
"cannot set DETECT_FLOW_FLAG_TOSERVER flag is already set");
274 SCLogError(
"cannot set to_server, DETECT_FLOW_FLAG_TO_CLIENT flag already set");
279 }
else if (strcasecmp(args[i],
"no_frag") == 0) {
281 SCLogError(
"cannot set no_frag flag is already set");
284 SCLogError(
"cannot set no_frag flag, only_frag already set");
289 }
else if (strcasecmp(args[i],
"only_frag") == 0) {
291 SCLogError(
"cannot set only_frag flag is already set");
294 SCLogError(
"cannot set only_frag flag, no_frag already set");
302 }
else if (strcasecmp(args[i],
"only_stream") == 0) {
304 SCLogError(
"cannot set only_stream flag is already set");
308 "cannot set only_stream flag, DETECT_FLOW_FLAG_NOSTREAM already set");
312 }
else if (strcasecmp(args[i],
"no_stream") == 0) {
314 SCLogError(
"cannot set no_stream flag is already set");
318 "cannot set no_stream flag, DETECT_FLOW_FLAG_ONLYSTREAM already set");
323 SCLogError(
"invalid flow option \"%s\"", args[i]);
328 pcre2_match_data_free(match);
333 pcre2_match_data_free(match);
343 #define SIG_FLAG_BOTH (SIG_FLAG_TOSERVER|SIG_FLAG_TOCLIENT)
384 uint16_t parse_flags = 0;
388 SCLogError(
"A signature may have only one flow option.");
396 bool appendsm =
true;
401 "rule %u means to use both directions, cannot specify a flow direction", s->
id);
405 SCLogError(
"rule %u has flow to_server but a hook to_client", s->
id);
412 "rule %u means to use both directions, cannot specify a flow direction", s->
id);
416 SCLogError(
"rule %u has flow to_client but a hook to_server", s->
id);
478 if (!PrefilterPacketHeaderExtraMatch(
ctx, p))
483 PrefilterAddSids(&det_ctx->
pmq,
ctx->sigs_array,
ctx->sigs_cnt);
509 PrefilterPacketFlowCompare, PrefilterPacketFlowMatch);
512 static bool PrefilterFlowIsPrefilterable(
const Signature *s)
531 static int DetectFlowTestParse01 (
void)
533 uint16_t parsed_flags = 0;
534 DetectFlowData *fd = DetectFlowParse(NULL,
"established", &parsed_flags);
544 static int DetectFlowTestParse02 (
void)
546 uint16_t parsed_flags = 0;
547 DetectFlowData *fd = DetectFlowParse(NULL,
"established", &parsed_flags);
558 static int DetectFlowTestParse03 (
void)
560 uint16_t parsed_flags = 0;
561 DetectFlowData *fd = DetectFlowParse(NULL,
"stateless", &parsed_flags);
571 static int DetectFlowTestParse04 (
void)
573 uint16_t parsed_flags = 0;
574 DetectFlowData *fd = DetectFlowParse(NULL,
"to_client", &parsed_flags);
584 static int DetectFlowTestParse05 (
void)
586 uint16_t parsed_flags = 0;
587 DetectFlowData *fd = DetectFlowParse(NULL,
"to_server", &parsed_flags);
597 static int DetectFlowTestParse06 (
void)
599 uint16_t parsed_flags = 0;
600 DetectFlowData *fd = DetectFlowParse(NULL,
"from_server", &parsed_flags);
610 static int DetectFlowTestParse07 (
void)
612 uint16_t parsed_flags = 0;
613 DetectFlowData *fd = DetectFlowParse(NULL,
"from_client", &parsed_flags);
623 static int DetectFlowTestParse08 (
void)
625 uint16_t parsed_flags = 0;
626 DetectFlowData *fd = DetectFlowParse(NULL,
"established,to_client", &parsed_flags);
636 static int DetectFlowTestParse09 (
void)
638 uint16_t parsed_flags = 0;
639 DetectFlowData *fd = DetectFlowParse(NULL,
"to_client,stateless", &parsed_flags);
651 static int DetectFlowTestParse10 (
void)
653 uint16_t parsed_flags = 0;
654 DetectFlowData *fd = DetectFlowParse(NULL,
"from_server,stateless", &parsed_flags);
666 static int DetectFlowTestParse11 (
void)
668 uint16_t parsed_flags = 0;
669 DetectFlowData *fd = DetectFlowParse(NULL,
" from_server , stateless ", &parsed_flags);
682 static int DetectFlowTestParseNocase01 (
void)
684 uint16_t parsed_flags = 0;
685 DetectFlowData *fd = DetectFlowParse(NULL,
"ESTABLISHED", &parsed_flags);
694 static int DetectFlowTestParseNocase02 (
void)
696 uint16_t parsed_flags = 0;
697 DetectFlowData *fd = DetectFlowParse(NULL,
"ESTABLISHED", &parsed_flags);
708 static int DetectFlowTestParseNocase03 (
void)
710 uint16_t parsed_flags = 0;
711 DetectFlowData *fd = DetectFlowParse(NULL,
"STATELESS", &parsed_flags);
721 static int DetectFlowTestParseNocase04 (
void)
723 uint16_t parsed_flags = 0;
724 DetectFlowData *fd = DetectFlowParse(NULL,
"TO_CLIENT", &parsed_flags);
734 static int DetectFlowTestParseNocase05 (
void)
736 uint16_t parsed_flags = 0;
737 DetectFlowData *fd = DetectFlowParse(NULL,
"TO_SERVER", &parsed_flags);
747 static int DetectFlowTestParseNocase06 (
void)
749 uint16_t parsed_flags = 0;
750 DetectFlowData *fd = DetectFlowParse(NULL,
"FROM_SERVER", &parsed_flags);
760 static int DetectFlowTestParseNocase07 (
void)
762 uint16_t parsed_flags = 0;
763 DetectFlowData *fd = DetectFlowParse(NULL,
"FROM_CLIENT", &parsed_flags);
773 static int DetectFlowTestParseNocase08 (
void)
775 uint16_t parsed_flags = 0;
776 DetectFlowData *fd = DetectFlowParse(NULL,
"ESTABLISHED,TO_CLIENT", &parsed_flags);
788 static int DetectFlowTestParseNocase09 (
void)
790 uint16_t parsed_flags = 0;
791 DetectFlowData *fd = DetectFlowParse(NULL,
"TO_CLIENT,STATELESS", &parsed_flags);
803 static int DetectFlowTestParseNocase10 (
void)
805 uint16_t parsed_flags = 0;
806 DetectFlowData *fd = DetectFlowParse(NULL,
"FROM_SERVER,STATELESS", &parsed_flags);
818 static int DetectFlowTestParseNocase11 (
void)
820 uint16_t parsed_flags = 0;
821 DetectFlowData *fd = DetectFlowParse(NULL,
" FROM_SERVER , STATELESS ", &parsed_flags);
833 static int DetectFlowTestParse12 (
void)
835 uint16_t parsed_flags = 0;
836 DetectFlowData *fd = DetectFlowParse(NULL,
"from_server:stateless", &parsed_flags);
844 static int DetectFlowTestParse13 (
void)
846 uint16_t parsed_flags = 0;
847 DetectFlowData *fd = DetectFlowParse(NULL,
"invalidoptiontest", &parsed_flags);
855 static int DetectFlowTestParse14 (
void)
857 uint16_t parsed_flags = 0;
866 static int DetectFlowTestParse15 (
void)
868 uint16_t parsed_flags = 0;
869 DetectFlowData *fd = DetectFlowParse(NULL,
"established,stateless", &parsed_flags);
877 static int DetectFlowTestParse16 (
void)
879 uint16_t parsed_flags = 0;
880 DetectFlowData *fd = DetectFlowParse(NULL,
"to_client,to_server", &parsed_flags);
889 static int DetectFlowTestParse17 (
void)
891 uint16_t parsed_flags = 0;
892 DetectFlowData *fd = DetectFlowParse(NULL,
"to_client,from_server", &parsed_flags);
900 static int DetectFlowTestParse18 (
void)
902 uint16_t parsed_flags = 0;
904 DetectFlowParse(NULL,
"from_server,established,only_stream", &parsed_flags);
916 static int DetectFlowTestParseNocase18 (
void)
918 uint16_t parsed_flags = 0;
920 DetectFlowParse(NULL,
"FROM_SERVER,ESTABLISHED,ONLY_STREAM", &parsed_flags);
933 static int DetectFlowTestParse19 (
void)
935 uint16_t parsed_flags = 0;
937 DetectFlowParse(NULL,
"from_server,established,only_stream,a", &parsed_flags);
945 static int DetectFlowTestParse20 (
void)
947 uint16_t parsed_flags = 0;
948 DetectFlowData *fd = DetectFlowParse(NULL,
"from_server,established,no_stream", &parsed_flags);
960 static int DetectFlowTestParseNocase20 (
void)
962 uint16_t parsed_flags = 0;
963 DetectFlowData *fd = DetectFlowParse(NULL,
"FROM_SERVER,ESTABLISHED,NO_STREAM", &parsed_flags);
975 static int DetectFlowTestParse21 (
void)
977 uint16_t parsed_flags = 0;
978 DetectFlowData *fd = DetectFlowParse(NULL,
"from_server,a,no_stream", &parsed_flags);
986 static int DetectFlowTestParse22(
void)
988 uint16_t parsed_flags = 0;
989 DetectFlowData *fd = DetectFlowParse(NULL,
"established,not_established", &parsed_flags);
991 fd = DetectFlowParse(NULL,
"not_established,established", &parsed_flags);
996 static int DetectFlowSigTest01(
void)
998 uint8_t *buf = (uint8_t *)
"supernovaduper";
999 uint16_t buflen = strlen((
char *)buf);
1003 memset(&th_v, 0,
sizeof(th_v));
1008 const char *sig1 =
"alert tcp any any -> any any (msg:\"dummy\"; "
1009 "content:\"nova\"; flow:no_stream; sid:1;)";
1037 static int DetectFlowTestParseNotEstablished(
void)
1039 uint16_t parsed_flags = 0;
1040 DetectFlowData *fd = DetectFlowParse(NULL,
"not_established", &parsed_flags);
1050 static int DetectFlowTestParseNoFrag(
void)
1052 uint16_t parsed_flags = 0;
1053 DetectFlowData *fd = DetectFlowParse(NULL,
"no_frag", &parsed_flags);
1063 static int DetectFlowTestParseOnlyFrag(
void)
1065 uint16_t parsed_flags = 0;
1066 DetectFlowData *fd = DetectFlowParse(NULL,
"only_frag", &parsed_flags);
1076 static int DetectFlowTestParseNoFragOnlyFrag(
void)
1078 uint16_t parsed_flags = 0;
1079 DetectFlowData *fd = DetectFlowParse(NULL,
"no_frag,only_frag", &parsed_flags);
1087 static int DetectFlowTestNoFragMatch(
void)
1089 uint16_t parsed_flags = 0;
1090 uint32_t pflags = 0;
1091 DetectFlowData *fd = DetectFlowParse(NULL,
"no_frag", &parsed_flags);
1105 static int DetectFlowTestOnlyFragMatch(
void)
1107 uint16_t parsed_flags = 0;
1108 uint32_t pflags = 0;
1109 DetectFlowData *fd = DetectFlowParse(NULL,
"only_frag", &parsed_flags);
1123 static void DetectFlowRegisterTests(
void)
1136 UtRegisterTest(
"DetectFlowTestParseNocase01", DetectFlowTestParseNocase01);
1137 UtRegisterTest(
"DetectFlowTestParseNocase02", DetectFlowTestParseNocase02);
1138 UtRegisterTest(
"DetectFlowTestParseNocase03", DetectFlowTestParseNocase03);
1139 UtRegisterTest(
"DetectFlowTestParseNocase04", DetectFlowTestParseNocase04);
1140 UtRegisterTest(
"DetectFlowTestParseNocase05", DetectFlowTestParseNocase05);
1141 UtRegisterTest(
"DetectFlowTestParseNocase06", DetectFlowTestParseNocase06);
1142 UtRegisterTest(
"DetectFlowTestParseNocase07", DetectFlowTestParseNocase07);
1143 UtRegisterTest(
"DetectFlowTestParseNocase08", DetectFlowTestParseNocase08);
1144 UtRegisterTest(
"DetectFlowTestParseNocase09", DetectFlowTestParseNocase09);
1145 UtRegisterTest(
"DetectFlowTestParseNocase10", DetectFlowTestParseNocase10);
1146 UtRegisterTest(
"DetectFlowTestParseNocase11", DetectFlowTestParseNocase11);
1154 UtRegisterTest(
"DetectFlowTestParseNocase18", DetectFlowTestParseNocase18);
1157 UtRegisterTest(
"DetectFlowTestParseNocase20", DetectFlowTestParseNocase20);
1161 DetectFlowTestParseNotEstablished);
1162 UtRegisterTest(
"DetectFlowTestParseNoFrag", DetectFlowTestParseNoFrag);
1164 DetectFlowTestParseOnlyFrag);
1166 DetectFlowTestParseNoFragOnlyFrag);
1167 UtRegisterTest(
"DetectFlowTestNoFragMatch", DetectFlowTestNoFragMatch);
1168 UtRegisterTest(
"DetectFlowTestOnlyFragMatch", DetectFlowTestOnlyFragMatch);