83 static void SigMatchTransferSigMatchAcrossLists(
SigMatch *sm,
114 #define CASE_CODE_STRING(E, S) case E: return S; break
125 #undef CASE_CODE_STRING
129 #define CASE_CODE(E) case E: return #E
147 Signature *s,
const char *arg,
int sm_type,
int sm_list,
153 if (arg != NULL && strcmp(arg,
"") != 0) {
162 "with a sticky buffer still set. Reset sticky buffer "
163 "with pkt_data before using the modifier.",
177 "found inside the rule without a content context. "
178 "Please use a \"content\" keyword before using the "
186 "be used with the rawbytes rule keyword",
192 "be used with the replace rule keyword",
231 bool reuse_buffer =
false;
244 SCLogError(
"failed to expand rule buffer array");
253 SCLogDebug(
"idx %u list %d set up curbuf %p s->init_data->buffer_index %u",
294 if (sm->
ctx != NULL) {
305 ptrdiff_t
offset = e - table;
319 if (st->
name != NULL) {
351 if (strcmp(
str,
"all") == 0) {
363 char *xsaveptr = NULL;
364 char *key = strtok_r(copy,
",", &xsaveptr);
365 while (key != NULL) {
371 "argument '%s' not found",
374 key = strtok_r(NULL,
",", &xsaveptr);
401 SCLogDebug(
"s:%p new:%p list:%d: %s, s->init_data->list_set %s s->init_data->list %d", s,
new,
435 SCLogDebug(
"reusing buffer %u as it isn't multi-capable", x);
445 SCLogError(
"failed to expand rule buffer array");
475 SCLogDebug(
"appended %s to list %d, rule pos %u (s->init_data->list %d)",
494 if (sm->
prev != NULL)
496 if (sm->
next != NULL)
538 if (sm_last == NULL || sm_new->
idx > sm_last->
idx)
550 if (sm_last == NULL || sm_new->
idx > sm_last->
idx)
572 SCLogDebug(
"skip x %u s->init_data->list %d (int)s->init_data->buffers[x].id %d", x,
581 for (sm_type = va_arg(ap,
int); sm_type != -1; sm_type = va_arg(ap,
int)) {
585 if (sm_last == NULL || sm_new->
idx > sm_last->
idx)
602 for (sm_type = va_arg(ap,
int); sm_type != -1; sm_type = va_arg(ap,
int))
607 if (sm_last == NULL || sm_new->
idx > sm_last->
idx)
632 va_start(ap, sm_list);
634 for (sm_type = va_arg(ap,
int); sm_type != -1; sm_type = va_arg(ap,
int))
636 sm_new = SigMatchGetLastSMByType(sm_list, sm_type);
639 if (sm_last == NULL || sm_new->
idx > sm_last->
idx)
670 va_start(ap, list_id);
672 for (sm_type = va_arg(ap,
int); sm_type != -1; sm_type = va_arg(ap,
int)) {
676 if (sm_last == NULL || sm_new->
idx > sm_last->
idx)
688 va_start(ap, list_id);
690 for (sm_type = va_arg(ap,
int); sm_type != -1; sm_type = va_arg(ap,
int)) {
691 sm_new = SigMatchGetLastSMByType(sm_list, sm_type);
694 if (sm_last == NULL || sm_new->
idx > sm_last->
idx)
717 if (sm_last == NULL || sm_new->
idx > sm_last->
idx)
725 if (sm_last == NULL || sm_new->
idx > sm_last->
idx)
732 static void SigMatchTransferSigMatchAcrossLists(
SigMatch *sm,
738 if (sm->
prev != NULL)
740 if (sm->
next != NULL)
743 if (sm == *src_sm_list)
744 *src_sm_list = sm->
next;
745 if (sm == *src_sm_list_tail)
746 *src_sm_list_tail = sm->
prev;
748 if (*dst_sm_list == NULL) {
750 *dst_sm_list_tail = sm;
758 *dst_sm_list_tail = sm;
785 SCLogError(
"Unable to find the sm in any of the "
799 static int DetectSetupDirection(
Signature *s,
char **
str,
bool only_dir)
802 if (strncmp(*
str,
"to_client", strlen(
"to_client")) == 0) {
803 *
str += strlen(
"to_client");
805 while (**
str && isblank(**
str)) {
811 SCLogError(
"unknown option: only accepts to_server or to_client");
821 while (**
str && isblank(**
str)) {
833 }
else if (strncmp(*
str,
"to_server", strlen(
"to_server")) == 0) {
834 *
str += strlen(
"to_server");
836 while (**
str && isblank(**
str)) {
842 SCLogError(
"unknown option: only accepts to_server or to_client");
852 while (**
str && isblank(**
str)) {
864 }
else if (only_dir) {
865 SCLogError(
"unknown option: only accepts to_server or to_client");
872 size_t output_size,
bool requires)
875 char *optname = NULL;
876 char *optvalue = NULL;
879 while (isblank(*optstr)) {
884 char *optend = optstr;
886 optend = strchr(optend,
';');
887 if (optend == NULL) {
891 else if (optend > optstr && *(optend -1 ) ==
'\\') {
900 char *optvalptr = strchr(optstr,
':');
902 *(optvalptr++) =
'\0';
905 for (
size_t i = strlen(optvalptr); i > 0; i--) {
906 if (isblank(optvalptr[i - 1])) {
907 optvalptr[i - 1] =
'\0';
913 optvalue = optvalptr;
917 for (
size_t i = strlen(optstr); i > 0; i--) {
918 if (isblank(optstr[i - 1])) {
919 optstr[i - 1] =
'\0';
928 bool requires_only = strcasecmp(optname,
"requires") == 0 || strcasecmp(optname,
"sid") == 0;
929 if ((requires && !requires_only) || (!requires && requires_only)) {
934 st = SigTableGet(optname);
935 if (st == NULL || st->
Setup == NULL) {
936 SCLogError(
"unknown rule keyword '%s'.", optname);
941 if (optvalue == NULL || strlen(optvalue) == 0) {
943 "invalid formatting or malformed option to %s keyword: '%s'", optname, optstr);
947 if (optvalue && strlen(optvalue)) {
948 SCLogError(
"unexpected option to %s keyword: '%s'", optname, optstr);
958 #define URL "https://suricata.io/our-story/deprecation-policy/"
961 "and will be removed soon. See %s",
965 "and will be removed soon. Use '%s' instead. "
974 if (optvalue != NULL && strlen(optvalue) > 0) {
975 size_t ovlen = strlen(optvalue);
976 char *ptr = optvalue;
986 SCLogError(
"invalid formatting or malformed option to %s keyword: \'%s\'", optname,
992 SCLogWarning(
"keyword \'%s\' has not been tested for firewall rules", optname);
1009 SCLogError(
"invalid formatting or malformed option to %s keyword: \'%s\'", optname,
1015 SCLogError(
"invalid formatting to %s keyword: "
1016 "value must be double quoted \'%s\'",
1022 && ovlen && *ptr ==
'"')
1024 for (; ovlen > 0; ovlen--) {
1025 if (isblank(ptr[ovlen - 1])) {
1026 ptr[ovlen - 1] =
'\0';
1031 if (ovlen && ptr[ovlen - 1] !=
'"') {
1032 SCLogError(
"bad option value formatting (possible missing semicolon) "
1033 "for keyword %s: \'%s\'",
1041 ptr[ovlen - 1] =
'\0';
1046 "for keyword %s: \'%s\'",
1053 "quotes on %s keyword that doesn't support them: \'%s\'", optname, optstr);
1071 if (setup_ret < 0) {
1075 if (setup_ret == -2) {
1087 if (strlen(optend) > 0) {
1088 strlcpy(output, optend, output_size);
1103 Signature *s,
const char *addrstr,
char flag)
1105 SCLogDebug(
"Address Group \"%s\" to be parsed now", addrstr);
1109 if (strcasecmp(addrstr,
"any") == 0)
1117 if (strcasecmp(addrstr,
"any") == 0)
1132 static bool IsBuiltIn(
const char *n)
1134 if (strcmp(n,
"request_started") == 0 || strcmp(n,
"response_started") == 0) {
1137 if (strcmp(n,
"request_complete") == 0 || strcmp(n,
"response_complete") == 0) {
1155 if (strcmp(alproto_name,
"http") == 0)
1156 alproto_name =
"http1";
1157 SCLogDebug(
"alproto %u/%s", a, alproto_name);
1159 const int max_progress_ts =
1161 const int max_progress_tc =
1164 char ts_tx_started[64];
1165 snprintf(ts_tx_started,
sizeof(ts_tx_started),
"%s:request_started:generic", alproto_name);
1168 SCLogDebug(
"- hook %s:%s list %s (%u)", alproto_name,
"request_name", ts_tx_started,
1169 (uint32_t)strlen(ts_tx_started));
1171 char tc_tx_started[64];
1172 snprintf(tc_tx_started,
sizeof(tc_tx_started),
"%s:response_started:generic", alproto_name);
1175 SCLogDebug(
"- hook %s:%s list %s (%u)", alproto_name,
"response_name", tc_tx_started,
1176 (uint32_t)strlen(tc_tx_started));
1178 char ts_tx_complete[64];
1179 snprintf(ts_tx_complete,
sizeof(ts_tx_complete),
"%s:request_complete:generic",
1183 SCLogDebug(
"- hook %s:%s list %s (%u)", alproto_name,
"request_name", ts_tx_complete,
1184 (uint32_t)strlen(ts_tx_complete));
1186 char tc_tx_complete[64];
1187 snprintf(tc_tx_complete,
sizeof(tc_tx_complete),
"%s:response_complete:generic",
1191 SCLogDebug(
"- hook %s:%s list %s (%u)", alproto_name,
"response_name", tc_tx_complete,
1192 (uint32_t)strlen(tc_tx_complete));
1194 for (
int p = 0; p <= max_progress_ts; p++) {
1196 IPPROTO_TCP , a, p, STREAM_TOSERVER);
1197 if (
name != NULL && !IsBuiltIn(
name)) {
1199 snprintf(list_name,
sizeof(list_name),
"%s:%s:generic", alproto_name,
name);
1200 SCLogDebug(
"- hook %s:%s list %s (%u)", alproto_name,
name, list_name,
1201 (uint32_t)strlen(list_name));
1207 for (
int p = 0; p <= max_progress_tc; p++) {
1209 IPPROTO_TCP , a, p, STREAM_TOCLIENT);
1210 if (
name != NULL && !IsBuiltIn(
name)) {
1212 snprintf(list_name,
sizeof(list_name),
"%s:%s:generic", alproto_name,
name);
1213 SCLogDebug(
"- hook %s:%s list %s (%u)", alproto_name,
name, list_name,
1214 (uint32_t)strlen(list_name));
1240 if (strcmp(
str,
"flow_start") == 0) {
1242 }
else if (strcmp(
str,
"pre_flow") == 0) {
1244 }
else if (strcmp(
str,
"pre_stream") == 0) {
1246 }
else if (strcmp(
str,
"all") == 0) {
1259 return "flow_start";
1263 return "pre_stream";
1275 .t.pkt.ph = HookPktFromString(hook_str),
1283 static int SigParseProtoHookPkt(
Signature *s,
const char *proto_hook,
const char *p,
const char *h)
1296 SCLogDebug(
"protocol:%s hook:%s: type:%s parsed hook:%s", p, h,
1306 .t.app.alproto = alproto,
1307 .t.app.app_progress = progress,
1315 static int SigParseProtoHookApp(
Signature *s,
const char *proto_hook,
const char *p,
const char *h)
1317 if (strcmp(h,
"request_started") == 0) {
1321 }
else if (strcmp(h,
"response_started") == 0) {
1325 }
else if (strcmp(h,
"request_complete") == 0) {
1329 }
else if (strcmp(h,
"response_complete") == 0) {
1335 IPPROTO_TCP , s->
alproto, h, STREAM_TOSERVER);
1336 if (progress_ts >= 0) {
1341 IPPROTO_TCP , s->
alproto, h, STREAM_TOCLIENT);
1342 if (progress_tc < 0) {
1350 char generic_hook_name[64];
1351 snprintf(generic_hook_name,
sizeof(generic_hook_name),
"%s:generic", proto_hook);
1354 SCLogError(
"no list registered as %s for hook %s", generic_hook_name, proto_hook);
1359 SCLogDebug(
"protocol:%s hook:%s: type:%s alproto:%u hook:%d", p, h,
1369 printf(
"=========Supported Rule Protocols=========\n");
1386 static int SigParseProto(
Signature *s,
const char *protostr)
1389 if (strlen(protostr) > 32)
1394 const char *p =
proto;
1395 const char *h = NULL;
1397 bool has_hook = strchr(
proto,
':') != NULL;
1399 char *xsaveptr = NULL;
1400 p = strtok_r(
proto,
":", &xsaveptr);
1401 h = strtok_r(NULL,
":", &xsaveptr);
1419 if (SigParseProtoHookApp(s, protostr, p, h) < 0) {
1420 SCLogError(
"protocol \"%s\" does not support hook \"%s\"", p, h);
1427 "in a signature. Either detection for this protocol "
1428 "is not yet supported OR detection has been disabled for "
1429 "protocol through the yaml option "
1430 "app-layer.protocols.%s.detection-enabled",
1434 }
else if (h != NULL) {
1435 SCLogDebug(
"non-app-layer rule with %s:%s", p, h);
1437 if (SigParseProtoHookPkt(s, protostr, p, h) < 0) {
1438 SCLogError(
"protocol \"%s\" does not support hook \"%s\"", p, h);
1467 Signature *s,
const char *portstr,
char flag)
1473 SCLogDebug(
"Port group \"%s\" to be parsed", portstr);
1476 if (strcasecmp(portstr,
"any") == 0)
1480 }
else if (flag == 1) {
1481 if (strcasecmp(portstr,
"any") == 0)
1496 static int SigParseActionRejectValidate(
const char *action)
1498 #ifdef HAVE_LIBNET11
1499 #if defined HAVE_LIBCAP_NG && !defined HAVE_LIBNET_CAPABILITIES
1502 "incompatible with POSIX based capabilities with privs dropping. "
1503 "For rejects to work, run as root/super user.");
1509 "required for action \"%s\" but is not compiled into Suricata",
1519 static uint8_t ActionStringToFlags(
const char *action)
1521 if (strcasecmp(action,
"alert") == 0) {
1523 }
else if (strcasecmp(action,
"drop") == 0) {
1525 }
else if (strcasecmp(action,
"pass") == 0) {
1527 }
else if (strcasecmp(action,
"reject") == 0 ||
1528 strcasecmp(action,
"rejectsrc") == 0)
1530 if (!(SigParseActionRejectValidate(action)))
1533 }
else if (strcasecmp(action,
"rejectdst") == 0) {
1534 if (!(SigParseActionRejectValidate(action)))
1537 }
else if (strcasecmp(action,
"rejectboth") == 0) {
1538 if (!(SigParseActionRejectValidate(action)))
1541 }
else if (strcasecmp(action,
"config") == 0) {
1543 }
else if (strcasecmp(action,
"accept") == 0) {
1546 SCLogError(
"An invalid action \"%s\" was given", action);
1562 static int SigParseAction(
Signature *s,
const char *action_in)
1565 strlcpy(action, action_in,
sizeof(action));
1566 const char *a = action;
1567 const char *o = NULL;
1569 bool has_scope = strchr(action,
':') != NULL;
1571 char *xsaveptr = NULL;
1572 a = strtok_r(action,
":", &xsaveptr);
1573 o = strtok_r(NULL,
":", &xsaveptr);
1577 SCLogError(
"invalid protocol specification '%s'", action_in);
1581 uint8_t
flags = ActionStringToFlags(a);
1587 uint8_t scope_flags = 0;
1589 if (strcmp(o,
"packet") == 0) {
1591 }
else if (strcmp(o,
"flow") == 0) {
1594 SCLogError(
"invalid action scope '%s' in action '%s': only 'packet' and 'flow' "
1601 if (strcmp(o,
"packet") == 0) {
1603 }
else if (strcmp(o,
"hook") == 0) {
1605 }
else if (strcmp(o,
"tx") == 0) {
1607 }
else if (strcmp(o,
"flow") == 0) {
1611 "invalid action scope '%s' in action '%s': only 'packet', 'flow', 'tx' and "
1618 if (strcmp(o,
"packet") == 0) {
1621 SCLogError(
"invalid action scope '%s' in action '%s': only 'packet' allowed", o,
1627 SCLogError(
"invalid action scope '%s' in action '%s': scope only supported for actions "
1628 "'drop', 'pass' and 'reject'",
1636 SCLogError(
"firewall rules require setting an explicit action scope");
1641 SCLogError(
"'accept' action only supported for firewall rules");
1646 SCLogError(
"'pass' action not supported for firewall rules");
1665 static inline int SigParseToken(
char **input,
char *output,
1666 const size_t output_size)
1668 size_t len = *input == NULL ? 0 : strlen(*input);
1674 while (
len && isblank(**input)) {
1679 char *endptr = strpbrk(*input,
" \t\n\r");
1680 if (endptr != NULL) {
1683 strlcpy(output, *input, output_size);
1700 static inline int SigParseList(
char **input,
char *output,
1701 const size_t output_size)
1704 size_t len = *input != NULL ? strlen(*input) : 0;
1710 while (
len && isblank(**input)) {
1716 for (i = 0; i <
len; i++) {
1717 char c = (*input)[i];
1720 }
else if (c ==
']') {
1722 }
else if (c ==
' ') {
1733 strlcpy(output, *input, output_size);
1734 *input = *input + i + 1;
1754 SigParseToken(&index, parser->
action,
sizeof(parser->
action));
1760 SigParseList(&index, parser->
src,
sizeof(parser->
src));
1763 SigParseList(&index, parser->
sp,
sizeof(parser->
sp));
1769 SigParseList(&index, parser->
dst,
sizeof(parser->
dst));
1772 SigParseList(&index, parser->
dp,
sizeof(parser->
dp));
1775 if (index == NULL) {
1779 while (isspace(*index) || *index ==
'(') {
1782 for (
size_t i = strlen(index); i > 0; i--) {
1783 if (isspace(index[i - 1]) || index[i - 1] ==
')') {
1784 index[i - 1] =
'\0';
1796 if (SigParseAction(s, parser->
action) < 0)
1799 if (SigParseProto(s, parser->
protocol) < 0)
1802 if (strcmp(parser->
direction,
"<>") == 0) {
1804 }
else if (strcmp(parser->
direction,
"=>") == 0) {
1806 SCLogError(
"transactional bidirectional rules not supported for firewall rules");
1811 }
else if (strcmp(parser->
direction,
"->") != 0) {
1812 SCLogError(
"\"%s\" is not a valid direction modifier, "
1813 "\"->\" and \"<>\" are supported.",
1840 static inline bool CheckAscii(
const char *
str)
1842 for (
size_t i = 0; i < strlen(
str); i++) {
1843 if (
str[i] < 0x20) {
1845 if (
str[i] == 0x0a ||
str[i] == 0x0d ||
str[i] == 0x09) {
1849 }
else if (
str[i] == 0x7f) {
1873 if (!SCCheckUtf8(sigstr)) {
1878 if (!CheckAscii(sigstr)) {
1879 SCLogError(
"rule contains invalid (control) characters");
1883 int ret = SigParseBasics(
de_ctx, s, sigstr, parser, addrs_direction, requires);
1890 if (strlen(parser->
opts) > 0) {
1891 size_t buffer_size = strlen(parser->
opts) + 1;
1893 char input[buffer_size];
1894 char output[buffer_size];
1895 memset(input, 0x00, buffer_size);
1896 memcpy(input, parser->
opts, strlen(parser->
opts) + 1);
1902 memset(output, 0x00, buffer_size);
1903 ret = SigParseOptions(
de_ctx, s, input, output, buffer_size, requires);
1905 memcpy(input, output, buffer_size);
1937 memset(b, 0,
sizeof(*b));
1985 static void SigMetadataFree(
Signature *s)
1992 if (s == NULL || s->
metadata == NULL) {
1999 next_mdata = mdata->
next;
2030 next_ref = ref->
next;
2084 while (sm != NULL) {
2093 while (sm != NULL) {
2114 if (s->
sp != NULL) {
2117 if (s->
dp != NULL) {
2163 if (s->
alproto == *alprotos) {
2206 }
else if (i == 1) {
2238 if (!AppProtoIsValid(alproto)) {
2262 alproto = AppProtoCommon(s->
alproto, alproto);
2264 SCLogError(
"can't set rule app proto to %s: already set to %s",
2291 if (addr_match4 == NULL) {
2297 addr_match4[idx].
ip =
SCNtohl(da->ip.addr_data32[0]);
2298 addr_match4[idx].
ip2 =
SCNtohl(da->ip2.addr_data32[0]);
2317 if (addr_match6 == NULL) {
2323 addr_match6[idx].
ip[0] =
SCNtohl(da->ip.addr_data32[0]);
2324 addr_match6[idx].
ip[1] =
SCNtohl(da->ip.addr_data32[1]);
2325 addr_match6[idx].
ip[2] =
SCNtohl(da->ip.addr_data32[2]);
2326 addr_match6[idx].
ip[3] =
SCNtohl(da->ip.addr_data32[3]);
2327 addr_match6[idx].
ip2[0] =
SCNtohl(da->ip2.addr_data32[0]);
2328 addr_match6[idx].
ip2[1] =
SCNtohl(da->ip2.addr_data32[1]);
2329 addr_match6[idx].
ip2[2] =
SCNtohl(da->ip2.addr_data32[2]);
2330 addr_match6[idx].
ip2[3] =
SCNtohl(da->ip2.addr_data32[3]);
2343 static void SigBuildAddressMatchArray(
Signature *s)
2360 static int SigMatchListLen(
SigMatch *sm)
2363 for (; sm != NULL; sm = sm->
next)
2374 int len = SigMatchListLen(
head);
2380 FatalError(
"initializing the detection engine failed");
2386 for (; sm != NULL; sm = sm->
next, smd++) {
2426 SCLogDebug(
"s %u: no mpm; prefilter? de_ctx->prefilter_setting %u "
2427 "s->init_data->has_possible_prefilter %s",
2441 prefilter_list =
MIN(prefilter_list, sm->
type);
2451 if (sm->
type == prefilter_list) {
2468 static bool DetectRuleValidateTable(
const Signature *s)
2477 if (kw_tables_supported != 0 && (kw_tables_supported & table_as_flag) == 0) {
2478 SCLogError(
"rule %u uses hook \"%s\", but keyword \"%s\" doesn't support this hook",
2489 SCLogError(
"rule %u is loaded as a firewall rule, but does not specify an "
2497 static void DetectRuleSetTable(
Signature *s)
2530 if (!DetectFirewallRuleValidate(
de_ctx, s))
2536 static int SigValidateCheckBuffers(
2539 bool has_frame =
false;
2540 bool has_app =
false;
2541 bool has_pkt =
false;
2542 bool has_pmatch =
false;
2548 nlists += (nlists > 0);
2552 SCLogError(
"rule %u setup buffer %s but didn't add matches to it", s->
id,
2566 struct BufferVsDir {
2569 } bufdir[nlists + 1];
2570 memset(&bufdir, 0, (nlists + 1) *
sizeof(
struct BufferVsDir));
2584 if (b->
head == NULL) {
2589 has_frame |= bt->
frame;
2595 "specific matches (like dsize, flags, ttl) with stream / "
2596 "state matching by matching on app layer proto (like using "
2597 "http_* keywords).");
2602 for (; app != NULL; app = app->
next) {
2617 bufdir[b->
id].ts += (app->
dir == 0);
2618 bufdir[b->
id].tc += (app->
dir == 1);
2632 SCLogError(
"engine progress value doesn't match hook");
2651 if (has_pmatch && has_frame) {
2652 SCLogError(
"can't mix pure content and frame inspection");
2655 if (has_app && has_frame) {
2656 SCLogError(
"can't mix app-layer buffer and frame inspection");
2659 if (has_pkt && has_frame) {
2660 SCLogError(
"can't mix pkt buffer and frame inspection");
2664 for (
int x = 0; x < nlists; x++) {
2665 if (bufdir[x].
ts == 0 && bufdir[x].tc == 0)
2667 (*ts_excl) += (bufdir[x].ts > 0 && bufdir[x].tc == 0);
2668 (*tc_excl) += (bufdir[x].ts == 0 && bufdir[x].tc > 0);
2669 (*dir_amb) += (bufdir[x].ts > 0 && bufdir[x].tc > 0);
2678 static int SigValidatePacketStream(
const Signature *s)
2682 "tcp-stream or flow:only_stream. Invalidating signature.");
2688 static int SigConsolidateDirection(
2689 Signature *s,
const int ts_excl,
const int tc_excl,
const int dir_amb)
2692 if (!ts_excl || !tc_excl) {
2693 SCLogError(
"rule %u should use both directions, but does not", s->
id);
2697 SCLogError(
"rule %u means to use both directions, cannot have keywords ambiguous about "
2702 }
else if (ts_excl && tc_excl) {
2704 "rule %u mixes keywords with conflicting directions, a transactional rule with => "
2708 }
else if (ts_excl) {
2709 SCLogDebug(
"%u: implied rule direction is toserver", s->
id);
2711 SCLogError(
"rule %u mixes keywords with conflicting directions", s->
id);
2714 }
else if (tc_excl) {
2715 SCLogDebug(
"%u: implied rule direction is toclient", s->
id);
2717 SCLogError(
"rule %u mixes keywords with conflicting directions", s->
id);
2720 }
else if (dir_amb) {
2721 SCLogDebug(
"%u: rule direction cannot be deduced from keywords", s->
id);
2726 static void SigConsolidateTcpBuffer(
Signature *s)
2732 if (s->
proto.
proto[IPPROTO_TCP / 8] & (1 << (IPPROTO_TCP % 8))) {
2758 static bool SigInspectsFiles(
const Signature *s)
2769 static int SigValidateFileHandling(
const Signature *s)
2771 if (!SigInspectsFiles(s)) {
2778 "support file matching",
2795 SCLogError(
"No protocol support file matching");
2800 SCLogError(
"protocol HTTP2 doesn't support file name matching");
2816 static int SigValidateConsolidate(
2821 if (SigValidateFirewall(
de_ctx, s) == 0)
2824 if (SigValidatePacketStream(s) == 0) {
2832 if (SigValidateCheckBuffers(
de_ctx, s, &ts_excl, &tc_excl, &dir_amb) == 0) {
2836 if (SigConsolidateDirection(s, ts_excl, tc_excl, dir_amb) == 0) {
2840 SigConsolidateTcpBuffer(s);
2843 DetectRuleSetTable(s);
2845 int r = SigValidateFileHandling(s);
2849 if (SigInspectsFiles(s)) {
2854 if (DetectRuleValidateTable(s) ==
false) {
2877 memset(&parser, 0x00,
sizeof(parser));
2882 if (firewall_rule) {
2899 int ret = SigParse(
de_ctx, sig, sigstr, dir, &parser,
true);
2906 }
else if (ret < 0) {
2912 SCLogError(
"Signature missing required value \"sid\".");
2917 ret = SigParse(
de_ctx, sig, sigstr, dir, &parser,
false);
2923 }
else if (ret == -2) {
2926 }
else if (ret < 0) {
2931 if (sig->
prio == -1)
2938 int override_needed = 0;
2942 override_needed = 1;
2944 override_needed = 1;
2946 for (s = 0; s <
sizeof(sig->
proto.
proto); s++) {
2948 override_needed = 0;
2957 if (override_needed)
2967 for ( ; sm != NULL; sm = sm->
next) {
2991 SCLogDebug(
"sig %"PRIu32
" SIG_FLAG_APPLAYER: %s, SIG_FLAG_PACKET: %s",
2995 SigBuildAddressMatchArray(sig);
3006 SigSetupPrefilter(
de_ctx, sig);
3009 if (SigValidateConsolidate(
de_ctx, sig, &parser, dir) == 0) {
3028 static bool SigHasSameSourceAndDestination(
const Signature *s)
3070 if (SigHasSameSourceAndDestination(sig)) {
3071 SCLogInfo(
"Rule with ID %u is bidirectional, but source and destination are the same, "
3072 "treating the rule as unidirectional", sig->
id);
3077 if (sig->
next == NULL) {
3107 return SigInitDo(
de_ctx, sigstr,
false);
3112 return SigInitDo(
de_ctx, sigstr,
true);
3121 static void DetectParseDupSigFreeFunc(
void *data)
3137 static uint32_t DetectParseDupSigHashFunc(
HashListTable *ht,
void *data, uint16_t datalen)
3156 static char DetectParseDupSigCompareFunc(
void *data1, uint16_t len1,
void *data2,
3162 if (sw1 == NULL || sw2 == NULL ||
3163 sw1->
s == NULL || sw2->
s == NULL)
3167 if (sw1->
s->
id == sw2->
s->
id && sw1->
s->
gid == sw2->
s->
gid)
return 1;
3183 DetectParseDupSigHashFunc,
3184 DetectParseDupSigCompareFunc,
3185 DetectParseDupSigFreeFunc);
3246 if (sw_dup == NULL) {
3259 (
void *)&sw_tmp, 0);
3271 if (sw->
s->
rev <= sw_dup->
s->
rev) {
3280 if (sw_dup->
s_prev == NULL) {
3288 sw_temp.
s = sw_dup->
s->
next;
3292 if (sw_temp.
s != NULL) {
3294 (
void *)&sw_temp, 0);
3314 sw_temp.
s = sw_dup->
s->
next;
3322 if (sw_temp.
s != NULL) {
3324 (
void *)&sw_temp, 0);
3339 (
void *)&sw_tmp, 0);
3340 if (sw_old->
s != sw_dup->
s) {
3383 int dup_sig = DetectEngineSignatureIsDuplicate(
de_ctx, sig);
3387 SCLogError(
"Duplicate signature \"%s\"", sigstr);
3389 }
else if (dup_sig == 2) {
3391 " so the older sig replaced by this new signature \"%s\"",
3396 if (sig->
next != NULL) {
3413 return (dup_sig == 0 || dup_sig == 2) ? sig : NULL;
3417 if (sig != NULL && sig->
next != NULL) {
3455 int dup_sig = DetectEngineSignatureIsDuplicate(
de_ctx, sig);
3459 SCLogError(
"Duplicate signature \"%s\"", sigstr);
3461 }
else if (dup_sig == 2) {
3463 " so the older sig replaced by this new signature \"%s\"",
3468 if (sig->
next != NULL) {
3485 return (dup_sig == 0 || dup_sig == 2) ? sig : NULL;
3489 if (sig != NULL && sig->
next != NULL) {
3502 int start_offset,
int options)
3504 *match = pcre2_match_data_create_from_pattern(parse_regex->
regex, NULL);
3506 return pcre2_match(parse_regex->
regex, (PCRE2_SPTR8)
str, strlen(
str), options, start_offset,
3507 *match, parse_regex->
context);
3514 pcre2_code_free(r->
regex);
3517 pcre2_match_context_free(r->
context);
3532 g_detect_parse_regex_list = NULL;
3541 FatalError(
"failed to alloc memory for pcre free list");
3544 r->
next = g_detect_parse_regex_list;
3545 g_detect_parse_regex_list = r;
3553 detect_parse->
regex =
3554 pcre2_compile((PCRE2_SPTR8)parse_str, PCRE2_ZERO_TERMINATED, opts, &en, &eo, NULL);
3555 if (detect_parse->
regex == NULL) {
3556 PCRE2_UCHAR errbuffer[256];
3557 pcre2_get_error_message(en, errbuffer,
sizeof(errbuffer));
3558 SCLogError(
"pcre compile of \"%s\" failed at "
3560 parse_str, en, errbuffer);
3563 detect_parse->
context = pcre2_match_context_create(NULL);
3564 if (detect_parse->
context == NULL) {
3565 SCLogError(
"pcre2 could not create match context");
3566 pcre2_code_free(detect_parse->
regex);
3567 detect_parse->
regex = NULL;
3582 if (detect_parse == NULL) {
3586 detect_parse->
regex =
3587 pcre2_compile((PCRE2_SPTR8)parse_str, PCRE2_ZERO_TERMINATED, opts, &en, &eo, NULL);
3588 if (detect_parse->
regex == NULL) {
3589 PCRE2_UCHAR errbuffer[256];
3590 pcre2_get_error_message(en, errbuffer,
sizeof(errbuffer));
3591 SCLogError(
"pcre2 compile of \"%s\" failed at "
3593 parse_str, (
int)eo, errbuffer);
3598 detect_parse->
next = g_detect_parse_regex_list;
3599 g_detect_parse_regex_list = detect_parse;
3600 return detect_parse;
3604 pcre2_match_data *match_data, uint32_t number, PCRE2_UCHAR *buffer, PCRE2_SIZE *bufflen)
3606 int r = pcre2_substring_copy_bynumber(match_data, number, buffer, bufflen);
3607 if (r == PCRE2_ERROR_UNSET) {
3616 pcre2_match_data *match_data, uint32_t number, PCRE2_UCHAR **bufferptr, PCRE2_SIZE *bufflen)
3618 int r = pcre2_substring_get_bynumber(match_data, number, bufferptr, bufflen);
3619 if (r == PCRE2_ERROR_UNSET) {
3642 static int SigParseTest01 (
void)
3651 sig =
SigInit(
de_ctx,
"alert tcp 1.2.3.4 any -> !1.2.3.4 any (msg:\"SigParseTest01\"; sid:1;)");
3661 static int SigParseTest02 (
void)
3676 sig =
SigInit(
de_ctx,
"alert tcp any !21:902 -> any any (msg:\"ET MALWARE Suspicious 220 Banner on Local Port\"; content:\"220\"; offset:0; depth:4; pcre:\"/220[- ]/\"; sid:2003055; rev:4;)");
3704 static int SigParseTest03 (
void)
3713 sig =
SigInit(
de_ctx,
"alert tcp 1.2.3.4 any <- !1.2.3.4 any (msg:\"SigParseTest03\"; sid:1;)");
3716 printf(
"expected NULL got sig ptr %p: ",sig);
3725 static int SigParseTest04 (
void)
3734 sig =
SigInit(
de_ctx,
"alert tcp 1.2.3.4 1024: -> !1.2.3.4 1024: (msg:\"SigParseTest04\"; sid:1;)");
3745 static int SigParseTest05 (
void)
3754 sig =
SigInit(
de_ctx,
"alert tcp 1.2.3.4 1024:65536 -> !1.2.3.4 any (msg:\"SigParseTest05\"; sid:1;)");
3758 printf(
"signature didn't fail to parse as we expected: ");
3768 static int SigParseTest06 (
void)
3777 sig =
SigInit(
de_ctx,
"alert tcp any any -> any any (flow:to_server; content:\"GET\"; nocase; http_method; uricontent:\"/uri/\"; nocase; content:\"Host|3A| abc\"; nocase; sid:1; rev:1;)");
3781 printf(
"signature failed to parse: ");
3795 static int SigParseTest07(
void)
3817 static int SigParseTest08(
void)
3840 static int SigParseTest09(
void)
3891 static int SigParseTest10(
void)
3923 static int SigParseTest11(
void)
3934 "drop tcp any any -> any 80 (msg:\"Snort_Inline is blocking the http link\"; sid:1;) ");
3936 printf(
"sig 1 didn't parse: ");
3941 "the http link\"; sid:2;) ");
3943 printf(
"sig 2 didn't parse: ");
3957 static int SigParseTest12(
void)
3969 printf(
"sig 1 should have given an error: ");
3983 static int SigParseTest13(
void)
3995 printf(
"sig 1 invalidated: failure");
4000 printf(
"sig doesn't have stream flag set\n");
4005 printf(
"sig has packet flag set\n");
4020 static int SigParseTest14(
void)
4032 printf(
"sig 1 invalidated: failure");
4037 printf(
"sig doesn't have packet flag set\n");
4042 printf(
"sig has stream flag set\n");
4057 static int SigParseTest15(
void)
4069 printf(
"sig 1 invalidated: failure");
4074 printf(
"sig doesn't have packet flag set\n");
4079 printf(
"sig doesn't have stream flag set\n");
4094 static int SigParseTest16(
void)
4106 printf(
"sig 1 invalidated: failure");
4111 printf(
"sig doesn't have packet flag set\n");
4116 printf(
"sig doesn't have stream flag set\n");
4131 static int SigParseTest17(
void)
4143 printf(
"sig 1 invalidated: failure");
4148 printf(
"sig doesn't have packet flag set\n");
4153 printf(
"sig doesn't have stream flag set\n");
4166 static int SigParseTest18 (
void)
4174 if (
DetectEngineAppendSig(
de_ctx,
"alert tcp 1.2.3.4 any -> !1.2.3.4 any (msg:\"SigParseTest01\"; sid:99999999999999999999;)") != NULL)
4185 static int SigParseTest19 (
void)
4193 if (
DetectEngineAppendSig(
de_ctx,
"alert tcp 1.2.3.4 any -> !1.2.3.4 any (msg:\"SigParseTest01\"; sid:1; gid:99999999999999999999;)") != NULL)
4204 static int SigParseTest20 (
void)
4212 if (
DetectEngineAppendSig(
de_ctx,
"alert tcp 1.2.3.4 any -> !1.2.3.4 any (msg:\"SigParseTest01\"; sid:1; rev:99999999999999999999;)") != NULL)
4223 static int SigParseTest21 (
void)
4242 static int SigParseTest22 (
void)
4250 if (
DetectEngineAppendSig(
de_ctx,
"alert tcp [10.10.10.0/24, !10.10.10.247] any -> [10.10.10.0/24, !10.10.10.247] any (sid:1;)") == NULL)
4263 static int SigParseTest23(
void)
4278 static int SigParseBidirecTest06 (
void)
4298 static int SigParseBidirecTest07 (
void)
4318 static int SigParseBidirecTest08 (
void)
4338 static int SigParseBidirecTest09 (
void)
4358 static int SigParseBidirecTest10 (
void)
4378 static int SigParseBidirecTest11 (
void)
4398 static int SigParseBidirecTest12 (
void)
4418 static int SigParseBidirecTest13 (
void)
4437 static int SigParseBidirecTest14 (
void)
4458 static int SigTestBidirec01 (
void)
4470 if (sig->
next != NULL)
4489 static int SigTestBidirec02 (
void)
4508 if (sig->
next == NULL)
4513 if (copy->
next != NULL)
4534 static int SigTestBidirec03 (
void)
4546 const char *sigs[3];
4547 sigs[0] =
"alert tcp any any -> 192.168.1.1 any (msg:\"SigTestBidirec03 sid 1\"; sid:1;)";
4548 sigs[1] =
"alert tcp any any <> 192.168.1.1 any (msg:\"SigTestBidirec03 sid 2 bidirectional\"; sid:2;)";
4549 sigs[2] =
"alert tcp any any -> 192.168.1.1 any (msg:\"SigTestBidirec03 sid 3\"; sid:3;)";
4556 if (sig->
next == NULL)
4567 uint8_t rawpkt1_ether[] = {
4568 0x00,0x50,0x56,0xea,0x00,0xbd,0x00,0x0c,
4569 0x29,0x40,0xc8,0xb5,0x08,0x00,0x45,0x00,
4570 0x01,0xa8,0xb9,0xbb,0x40,0x00,0x40,0x06,
4571 0xe0,0xbf,0xc0,0xa8,0x1c,0x83,0xc0,0xa8,
4572 0x01,0x01,0xb9,0x0a,0x00,0x50,0x6f,0xa2,
4573 0x92,0xed,0x7b,0xc1,0xd3,0x4d,0x50,0x18,
4574 0x16,0xd0,0xa0,0x6f,0x00,0x00,0x47,0x45,
4575 0x54,0x20,0x2f,0x20,0x48,0x54,0x54,0x50,
4576 0x2f,0x31,0x2e,0x31,0x0d,0x0a,0x48,0x6f,
4577 0x73,0x74,0x3a,0x20,0x31,0x39,0x32,0x2e,
4578 0x31,0x36,0x38,0x2e,0x31,0x2e,0x31,0x0d,
4579 0x0a,0x55,0x73,0x65,0x72,0x2d,0x41,0x67,
4580 0x65,0x6e,0x74,0x3a,0x20,0x4d,0x6f,0x7a,
4581 0x69,0x6c,0x6c,0x61,0x2f,0x35,0x2e,0x30,
4582 0x20,0x28,0x58,0x31,0x31,0x3b,0x20,0x55,
4583 0x3b,0x20,0x4c,0x69,0x6e,0x75,0x78,0x20,
4584 0x78,0x38,0x36,0x5f,0x36,0x34,0x3b,0x20,
4585 0x65,0x6e,0x2d,0x55,0x53,0x3b,0x20,0x72,
4586 0x76,0x3a,0x31,0x2e,0x39,0x2e,0x30,0x2e,
4587 0x31,0x34,0x29,0x20,0x47,0x65,0x63,0x6b,
4588 0x6f,0x2f,0x32,0x30,0x30,0x39,0x30,0x39,
4589 0x30,0x32,0x31,0x37,0x20,0x55,0x62,0x75,
4590 0x6e,0x74,0x75,0x2f,0x39,0x2e,0x30,0x34,
4591 0x20,0x28,0x6a,0x61,0x75,0x6e,0x74,0x79,
4592 0x29,0x20,0x46,0x69,0x72,0x65,0x66,0x6f,
4593 0x78,0x2f,0x33,0x2e,0x30,0x2e,0x31,0x34,
4594 0x0d,0x0a,0x41,0x63,0x63,0x65,0x70,0x74,
4595 0x3a,0x20,0x74,0x65,0x78,0x74,0x2f,0x68,
4596 0x74,0x6d,0x6c,0x2c,0x61,0x70,0x70,0x6c,
4597 0x69,0x63,0x61,0x74,0x69,0x6f,0x6e,0x2f,
4598 0x78,0x68,0x74,0x6d,0x6c,0x2b,0x78,0x6d,
4599 0x6c,0x2c,0x61,0x70,0x70,0x6c,0x69,0x63,
4600 0x61,0x74,0x69,0x6f,0x6e,0x2f,0x78,0x6d,
4601 0x6c,0x3b,0x71,0x3d,0x30,0x2e,0x39,0x2c,
4602 0x2a,0x2f,0x2a,0x3b,0x71,0x3d,0x30,0x2e,
4603 0x38,0x0d,0x0a,0x41,0x63,0x63,0x65,0x70,
4604 0x74,0x2d,0x4c,0x61,0x6e,0x67,0x75,0x61,
4605 0x67,0x65,0x3a,0x20,0x65,0x6e,0x2d,0x75,
4606 0x73,0x2c,0x65,0x6e,0x3b,0x71,0x3d,0x30,
4607 0x2e,0x35,0x0d,0x0a,0x41,0x63,0x63,0x65,
4608 0x70,0x74,0x2d,0x45,0x6e,0x63,0x6f,0x64,
4609 0x69,0x6e,0x67,0x3a,0x20,0x67,0x7a,0x69,
4610 0x70,0x2c,0x64,0x65,0x66,0x6c,0x61,0x74,
4611 0x65,0x0d,0x0a,0x41,0x63,0x63,0x65,0x70,
4612 0x74,0x2d,0x43,0x68,0x61,0x72,0x73,0x65,
4613 0x74,0x3a,0x20,0x49,0x53,0x4f,0x2d,0x38,
4614 0x38,0x35,0x39,0x2d,0x31,0x2c,0x75,0x74,
4615 0x66,0x2d,0x38,0x3b,0x71,0x3d,0x30,0x2e,
4616 0x37,0x2c,0x2a,0x3b,0x71,0x3d,0x30,0x2e,
4617 0x37,0x0d,0x0a,0x4b,0x65,0x65,0x70,0x2d,
4618 0x41,0x6c,0x69,0x76,0x65,0x3a,0x20,0x33,
4619 0x30,0x30,0x0d,0x0a,0x43,0x6f,0x6e,0x6e,
4620 0x65,0x63,0x74,0x69,0x6f,0x6e,0x3a,0x20,
4621 0x6b,0x65,0x65,0x70,0x2d,0x61,0x6c,0x69,
4622 0x76,0x65,0x0d,0x0a,0x0d,0x0a };
4632 uint32_t sids[3] = {1, 2, 3};
4633 uint32_t results[3] = {1, 1, 1};
4649 static int SigTestBidirec04 (
void)
4664 sig =
DetectEngineAppendSig(
de_ctx,
"alert tcp 192.168.1.1 any <> any any (msg:\"SigTestBidirec03 sid 2 bidirectional\"; sid:2;)");
4669 if (sig->
next == NULL)
4681 if (sig->
next == NULL)
4692 uint8_t rawpkt1_ether[] = {
4693 0x00,0x50,0x56,0xea,0x00,0xbd,0x00,0x0c,
4694 0x29,0x40,0xc8,0xb5,0x08,0x00,0x45,0x00,
4695 0x01,0xa8,0xb9,0xbb,0x40,0x00,0x40,0x06,
4696 0xe0,0xbf,0xc0,0xa8,0x1c,0x83,0xc0,0xa8,
4697 0x01,0x01,0xb9,0x0a,0x00,0x50,0x6f,0xa2,
4698 0x92,0xed,0x7b,0xc1,0xd3,0x4d,0x50,0x18,
4699 0x16,0xd0,0xa0,0x6f,0x00,0x00,0x47,0x45,
4700 0x54,0x20,0x2f,0x20,0x48,0x54,0x54,0x50,
4701 0x2f,0x31,0x2e,0x31,0x0d,0x0a,0x48,0x6f,
4702 0x73,0x74,0x3a,0x20,0x31,0x39,0x32,0x2e,
4703 0x31,0x36,0x38,0x2e,0x31,0x2e,0x31,0x0d,
4704 0x0a,0x55,0x73,0x65,0x72,0x2d,0x41,0x67,
4705 0x65,0x6e,0x74,0x3a,0x20,0x4d,0x6f,0x7a,
4706 0x69,0x6c,0x6c,0x61,0x2f,0x35,0x2e,0x30,
4707 0x20,0x28,0x58,0x31,0x31,0x3b,0x20,0x55,
4708 0x3b,0x20,0x4c,0x69,0x6e,0x75,0x78,0x20,
4709 0x78,0x38,0x36,0x5f,0x36,0x34,0x3b,0x20,
4710 0x65,0x6e,0x2d,0x55,0x53,0x3b,0x20,0x72,
4711 0x76,0x3a,0x31,0x2e,0x39,0x2e,0x30,0x2e,
4712 0x31,0x34,0x29,0x20,0x47,0x65,0x63,0x6b,
4713 0x6f,0x2f,0x32,0x30,0x30,0x39,0x30,0x39,
4714 0x30,0x32,0x31,0x37,0x20,0x55,0x62,0x75,
4715 0x6e,0x74,0x75,0x2f,0x39,0x2e,0x30,0x34,
4716 0x20,0x28,0x6a,0x61,0x75,0x6e,0x74,0x79,
4717 0x29,0x20,0x46,0x69,0x72,0x65,0x66,0x6f,
4718 0x78,0x2f,0x33,0x2e,0x30,0x2e,0x31,0x34,
4719 0x0d,0x0a,0x41,0x63,0x63,0x65,0x70,0x74,
4720 0x3a,0x20,0x74,0x65,0x78,0x74,0x2f,0x68,
4721 0x74,0x6d,0x6c,0x2c,0x61,0x70,0x70,0x6c,
4722 0x69,0x63,0x61,0x74,0x69,0x6f,0x6e,0x2f,
4723 0x78,0x68,0x74,0x6d,0x6c,0x2b,0x78,0x6d,
4724 0x6c,0x2c,0x61,0x70,0x70,0x6c,0x69,0x63,
4725 0x61,0x74,0x69,0x6f,0x6e,0x2f,0x78,0x6d,
4726 0x6c,0x3b,0x71,0x3d,0x30,0x2e,0x39,0x2c,
4727 0x2a,0x2f,0x2a,0x3b,0x71,0x3d,0x30,0x2e,
4728 0x38,0x0d,0x0a,0x41,0x63,0x63,0x65,0x70,
4729 0x74,0x2d,0x4c,0x61,0x6e,0x67,0x75,0x61,
4730 0x67,0x65,0x3a,0x20,0x65,0x6e,0x2d,0x75,
4731 0x73,0x2c,0x65,0x6e,0x3b,0x71,0x3d,0x30,
4732 0x2e,0x35,0x0d,0x0a,0x41,0x63,0x63,0x65,
4733 0x70,0x74,0x2d,0x45,0x6e,0x63,0x6f,0x64,
4734 0x69,0x6e,0x67,0x3a,0x20,0x67,0x7a,0x69,
4735 0x70,0x2c,0x64,0x65,0x66,0x6c,0x61,0x74,
4736 0x65,0x0d,0x0a,0x41,0x63,0x63,0x65,0x70,
4737 0x74,0x2d,0x43,0x68,0x61,0x72,0x73,0x65,
4738 0x74,0x3a,0x20,0x49,0x53,0x4f,0x2d,0x38,
4739 0x38,0x35,0x39,0x2d,0x31,0x2c,0x75,0x74,
4740 0x66,0x2d,0x38,0x3b,0x71,0x3d,0x30,0x2e,
4741 0x37,0x2c,0x2a,0x3b,0x71,0x3d,0x30,0x2e,
4742 0x37,0x0d,0x0a,0x4b,0x65,0x65,0x70,0x2d,
4743 0x41,0x6c,0x69,0x76,0x65,0x3a,0x20,0x33,
4744 0x30,0x30,0x0d,0x0a,0x43,0x6f,0x6e,0x6e,
4745 0x65,0x63,0x74,0x69,0x6f,0x6e,0x3a,0x20,
4746 0x6b,0x65,0x65,0x70,0x2d,0x61,0x6c,0x69,
4747 0x76,0x65,0x0d,0x0a,0x0d,0x0a };
4756 memset(&th_v, 0,
sizeof(th_v));
4796 static int SigParseTestNegation01 (
void)
4810 static int SigParseTestNegation02 (
void)
4816 "alert tcp any !any -> any any (msg:\"SigTest41-02 src ip is !any \"; "
4817 "classtype:misc-activity; sid:410002; rev:1;)");
4825 static int SigParseTestNegation03 (
void)
4831 "alert tcp any any -> any [80:!80] (msg:\"SigTest41-03 dst port [80:!80] \"; "
4832 "classtype:misc-activity; sid:410003; rev:1;)");
4840 static int SigParseTestNegation04 (
void)
4851 s =
SigInit(
de_ctx,
"alert tcp any any -> any [80,!80] (msg:\"SigTest41-03 dst port [80:!80] \"; classtype:misc-activity; sid:410003; rev:1;)");
4866 static int SigParseTestNegation05 (
void)
4877 s =
SigInit(
de_ctx,
"alert tcp any any -> [192.168.0.2,!192.168.0.2] any (msg:\"SigTest41-04 dst ip [192.168.0.2,!192.168.0.2] \"; classtype:misc-activity; sid:410004; rev:1;)");
4892 static int SigParseTestNegation06 (
void)
4903 s =
SigInit(
de_ctx,
"alert tcp any any -> any [100:1000,!1:20000] (msg:\"SigTest41-05 dst port [100:1000,!1:20000] \"; classtype:misc-activity; sid:410005; rev:1;)");
4919 static int SigParseTestNegation07 (
void)
4925 de_ctx,
"alert tcp any any -> [192.168.0.2,!192.168.0.0/24] any (sid:410006;)");
4934 static int SigParseTestNegation08 (
void)
4946 "alert tcp any any -> [192.168.0.0/16,!192.168.0.0/24] any (sid:410006; rev:1;)");
4961 static int SigParseTestMpm01 (
void)
4970 sig =
SigInit(
de_ctx,
"alert tcp any any -> any any (msg:\"mpm test\"; content:\"abcd\"; sid:1;)");
4972 printf(
"sig failed to init: ");
4977 printf(
"sig doesn't have content list: ");
4992 static int SigParseTestMpm02 (
void)
5001 sig =
SigInit(
de_ctx,
"alert tcp any any -> any any (msg:\"mpm test\"; content:\"abcd\"; content:\"abcdef\"; sid:1;)");
5003 printf(
"sig failed to init: ");
5008 printf(
"sig doesn't have content list: ");
5023 static int SigParseTestAppLayerTLS01(
void)
5034 s =
SigInit(
de_ctx,
"alert tls any any -> any any (msg:\"SigParseTestAppLayerTLS01 \"; sid:410006; rev:1;)");
5036 printf(
"parsing sig failed: ");
5041 printf(
"alproto not set: ");
5058 static int SigParseTestAppLayerTLS02(
void)
5069 s =
SigInit(
de_ctx,
"alert tls any any -> any any (msg:\"SigParseTestAppLayerTLS02 \"; tls.version:1.0; sid:410006; rev:1;)");
5071 printf(
"parsing sig failed: ");
5076 printf(
"alproto not set: ");
5092 static int SigParseTestAppLayerTLS03(
void)
5099 "alert tls any any -> any any (msg:\"SigParseTestAppLayerTLS03 \"; "
5100 "tls.version:2.5; sid:410006; rev:1;)");
5106 static int SigParseTestUnbalancedQuotes01(
void)
5112 "alert http any any -> any any (msg:\"SigParseTestUnbalancedQuotes01\"; "
5113 "pcre:\"/\\/[a-z]+\\.php\\?[a-z]+?=\\d{7}&[a-z]+?=\\d{7,8}$/U\" "
5114 "flowbits:set,et.exploitkitlanding; classtype:trojan-activity; sid:2017078; rev:5;)");
5120 static int SigParseTestContentGtDsize01(
void)
5127 "dsize:21; content:\"0123456789001234567890|00 00|\"; "
5134 static int SigParseTestContentGtDsize02(
void)
5141 "dsize:21; content:\"0123456789|00 00|\"; offset:10; "
5158 static int SigParseBidirWithSameSrcAndDest01(
void)
5175 "alert tcp [1.2.3.4, 5.6.7.8] [80, 81] <> [5.6.7.8, 1.2.3.4] [81, 80] (sid:3;)");
5184 static int SigParseBidirWithSameSrcAndDest02(
void)
5192 de_ctx,
"alert tcp 1.2.3.4 any <> [1.2.3.4, 5.6.7.8, ::1] any (sid:1;)");
5199 de_ctx,
"alert tcp [1.2.3.4, ::1] [80, 81, 82] <> [1.2.3.4, ::1] [80, 81] (sid:2;)");
5206 "alert tcp [1.2.3.4, ::1, ABCD:AAAA::1] [80] <> [1.2.3.4, ::1] [80, 81] (sid:3;)");
5213 de_ctx,
"alert tcp [!1.2.3.4, 1.2.3.0/24] any <> [1.2.3.0/24, !1.2.3.4] any (sid:4;)");
5220 de_ctx,
"alert tcp [1.2.3.4, 1.2.3.0/24] any <> [1.2.3.0/24, !1.2.3.4] any (sid:5;)");
5229 static int SigParseTestActionReject(
void)
5235 de_ctx,
"reject tcp 1.2.3.4 any -> !1.2.3.4 any (msg:\"SigParseTest01\"; sid:1;)");
5236 #ifdef HAVE_LIBNET11
5247 static int SigParseTestActionDrop(
void)
5253 de_ctx,
"drop tcp 1.2.3.4 any -> !1.2.3.4 any (msg:\"SigParseTest01\"; sid:1;)");
5261 static int SigSetMultiAppProto(
void)
5336 static int DetectSetupDirection01(
void)
5341 char *
str = (
char *)
"to_client";
5342 FAIL_IF(DetectSetupDirection(s, &
str,
true) < 0);
5347 static int DetectSetupDirection02(
void)
5351 char *
str = (
char *)
"to_server";
5352 FAIL_IF(DetectSetupDirection(s, &
str,
true) < 0);
5354 str = (
char *)
"to_client";
5355 FAIL_IF(DetectSetupDirection(s, &
str,
true) >= 0);
5361 static int DetectSetupDirection03(
void)
5365 char *
str = (
char *)
"to_client , something";
5366 FAIL_IF(DetectSetupDirection(s, &
str,
false) < 0);
5368 str = (
char *)
"to_client,something";
5369 FAIL_IF(DetectSetupDirection(s, &
str,
false) < 0);
5375 static int DetectSetupDirection04(
void)
5380 char *
str = (
char *)
"to_client_toto";
5381 FAIL_IF(DetectSetupDirection(s, &
str,
true) >= 0);
5383 str = (
char *)
"to_client_toto";
5384 FAIL_IF(DetectSetupDirection(s, &
str,
false) < 0);
5386 str = (
char *)
"to_client,something";
5388 FAIL_IF(DetectSetupDirection(s, &
str,
true) >= 0);
5425 UtRegisterTest(
"SigParseTest21 -- address with space", SigParseTest21);
5426 UtRegisterTest(
"SigParseTest22 -- address with space", SigParseTest22);
5427 UtRegisterTest(
"SigParseTest23 -- carriage return", SigParseTest23);
5442 UtRegisterTest(
"SigParseTestNegation01", SigParseTestNegation01);
5443 UtRegisterTest(
"SigParseTestNegation02", SigParseTestNegation02);
5444 UtRegisterTest(
"SigParseTestNegation03", SigParseTestNegation03);
5445 UtRegisterTest(
"SigParseTestNegation04", SigParseTestNegation04);
5446 UtRegisterTest(
"SigParseTestNegation05", SigParseTestNegation05);
5447 UtRegisterTest(
"SigParseTestNegation06", SigParseTestNegation06);
5448 UtRegisterTest(
"SigParseTestNegation07", SigParseTestNegation07);
5449 UtRegisterTest(
"SigParseTestNegation08", SigParseTestNegation08);
5452 UtRegisterTest(
"SigParseTestAppLayerTLS01", SigParseTestAppLayerTLS01);
5453 UtRegisterTest(
"SigParseTestAppLayerTLS02", SigParseTestAppLayerTLS02);
5454 UtRegisterTest(
"SigParseTestAppLayerTLS03", SigParseTestAppLayerTLS03);
5455 UtRegisterTest(
"SigParseTestUnbalancedQuotes01", SigParseTestUnbalancedQuotes01);
5458 SigParseTestContentGtDsize01);
5460 SigParseTestContentGtDsize02);
5463 SigParseBidirWithSameSrcAndDest01);
5465 SigParseBidirWithSameSrcAndDest02);
5466 UtRegisterTest(
"SigParseTestActionReject", SigParseTestActionReject);
5467 UtRegisterTest(
"SigParseTestActionDrop", SigParseTestActionDrop);
5471 UtRegisterTest(
"DetectSetupDirection01", DetectSetupDirection01);
5472 UtRegisterTest(
"DetectSetupDirection02", DetectSetupDirection02);
5473 UtRegisterTest(
"DetectSetupDirection03", DetectSetupDirection03);
5474 UtRegisterTest(
"DetectSetupDirection04", DetectSetupDirection04);