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 return strcmp(n,
"request_started") == 0 || strcmp(n,
"response_started") == 0 ||
1135 strcmp(n,
"request_complete") == 0 || strcmp(n,
"response_complete") == 0;
1150 if (strcmp(alproto_name,
"http") == 0)
1151 alproto_name =
"http1";
1152 SCLogDebug(
"alproto %u/%s", a, alproto_name);
1154 const int max_progress_ts =
1156 const int max_progress_tc =
1159 char ts_tx_started[64];
1160 snprintf(ts_tx_started,
sizeof(ts_tx_started),
"%s:request_started:generic", alproto_name);
1163 SCLogDebug(
"- hook %s:%s list %s (%u)", alproto_name,
"request_name", ts_tx_started,
1164 (uint32_t)strlen(ts_tx_started));
1166 char tc_tx_started[64];
1167 snprintf(tc_tx_started,
sizeof(tc_tx_started),
"%s:response_started:generic", alproto_name);
1170 SCLogDebug(
"- hook %s:%s list %s (%u)", alproto_name,
"response_name", tc_tx_started,
1171 (uint32_t)strlen(tc_tx_started));
1173 char ts_tx_complete[64];
1174 snprintf(ts_tx_complete,
sizeof(ts_tx_complete),
"%s:request_complete:generic",
1178 SCLogDebug(
"- hook %s:%s list %s (%u)", alproto_name,
"request_name", ts_tx_complete,
1179 (uint32_t)strlen(ts_tx_complete));
1181 char tc_tx_complete[64];
1182 snprintf(tc_tx_complete,
sizeof(tc_tx_complete),
"%s:response_complete:generic",
1186 SCLogDebug(
"- hook %s:%s list %s (%u)", alproto_name,
"response_name", tc_tx_complete,
1187 (uint32_t)strlen(tc_tx_complete));
1189 for (
int p = 0; p <= max_progress_ts; p++) {
1191 IPPROTO_TCP , a, p, STREAM_TOSERVER);
1192 if (
name != NULL && !IsBuiltIn(
name)) {
1194 snprintf(list_name,
sizeof(list_name),
"%s:%s:generic", alproto_name,
name);
1195 SCLogDebug(
"- hook %s:%s list %s (%u)", alproto_name,
name, list_name,
1196 (uint32_t)strlen(list_name));
1202 for (
int p = 0; p <= max_progress_tc; p++) {
1204 IPPROTO_TCP , a, p, STREAM_TOCLIENT);
1205 if (
name != NULL && !IsBuiltIn(
name)) {
1207 snprintf(list_name,
sizeof(list_name),
"%s:%s:generic", alproto_name,
name);
1208 SCLogDebug(
"- hook %s:%s list %s (%u)", alproto_name,
name, list_name,
1209 (uint32_t)strlen(list_name));
1235 if (strcmp(
str,
"flow_start") == 0) {
1237 }
else if (strcmp(
str,
"pre_flow") == 0) {
1239 }
else if (strcmp(
str,
"pre_stream") == 0) {
1241 }
else if (strcmp(
str,
"all") == 0) {
1254 return "flow_start";
1258 return "pre_stream";
1270 .t.pkt.ph = HookPktFromString(hook_str),
1278 static int SigParseProtoHookPkt(
Signature *s,
const char *proto_hook,
const char *p,
const char *h)
1291 SCLogDebug(
"protocol:%s hook:%s: type:%s parsed hook:%s", p, h,
1301 .t.app.alproto = alproto,
1302 .t.app.app_progress = progress,
1310 static int SigParseProtoHookApp(
Signature *s,
const char *proto_hook,
const char *p,
const char *h)
1312 if (strcmp(h,
"request_started") == 0) {
1316 }
else if (strcmp(h,
"response_started") == 0) {
1320 }
else if (strcmp(h,
"request_complete") == 0) {
1324 }
else if (strcmp(h,
"response_complete") == 0) {
1330 IPPROTO_TCP , s->
alproto, h, STREAM_TOSERVER);
1331 if (progress_ts >= 0) {
1336 IPPROTO_TCP , s->
alproto, h, STREAM_TOCLIENT);
1337 if (progress_tc < 0) {
1345 char generic_hook_name[64];
1346 snprintf(generic_hook_name,
sizeof(generic_hook_name),
"%s:generic", proto_hook);
1349 SCLogError(
"no list registered as %s for hook %s", generic_hook_name, proto_hook);
1354 SCLogDebug(
"protocol:%s hook:%s: type:%s alproto:%u hook:%d", p, h,
1364 printf(
"=========Supported Rule Protocols=========\n");
1381 static int SigParseProto(
Signature *s,
const char *protostr)
1384 if (strlen(protostr) > 32)
1389 const char *p =
proto;
1390 const char *h = NULL;
1392 bool has_hook = strchr(
proto,
':') != NULL;
1394 char *xsaveptr = NULL;
1395 p = strtok_r(
proto,
":", &xsaveptr);
1396 h = strtok_r(NULL,
":", &xsaveptr);
1414 if (SigParseProtoHookApp(s, protostr, p, h) < 0) {
1415 SCLogError(
"protocol \"%s\" does not support hook \"%s\"", p, h);
1422 "in a signature. Either detection for this protocol "
1423 "is not yet supported OR detection has been disabled for "
1424 "protocol through the yaml option "
1425 "app-layer.protocols.%s.detection-enabled",
1429 }
else if (h != NULL) {
1430 SCLogDebug(
"non-app-layer rule with %s:%s", p, h);
1432 if (SigParseProtoHookPkt(s, protostr, p, h) < 0) {
1433 SCLogError(
"protocol \"%s\" does not support hook \"%s\"", p, h);
1462 Signature *s,
const char *portstr,
char flag)
1468 SCLogDebug(
"Port group \"%s\" to be parsed", portstr);
1471 if (strcasecmp(portstr,
"any") == 0)
1475 }
else if (flag == 1) {
1476 if (strcasecmp(portstr,
"any") == 0)
1491 static int SigParseActionRejectValidate(
const char *action)
1493 #ifdef HAVE_LIBNET11
1494 #if defined HAVE_LIBCAP_NG && !defined HAVE_LIBNET_CAPABILITIES
1497 "incompatible with POSIX based capabilities with privs dropping. "
1498 "For rejects to work, run as root/super user.");
1504 "required for action \"%s\" but is not compiled into Suricata",
1514 static uint8_t ActionStringToFlags(
const char *action)
1516 if (strcasecmp(action,
"alert") == 0) {
1518 }
else if (strcasecmp(action,
"drop") == 0) {
1520 }
else if (strcasecmp(action,
"pass") == 0) {
1522 }
else if (strcasecmp(action,
"reject") == 0 ||
1523 strcasecmp(action,
"rejectsrc") == 0)
1525 if (!(SigParseActionRejectValidate(action)))
1528 }
else if (strcasecmp(action,
"rejectdst") == 0) {
1529 if (!(SigParseActionRejectValidate(action)))
1532 }
else if (strcasecmp(action,
"rejectboth") == 0) {
1533 if (!(SigParseActionRejectValidate(action)))
1536 }
else if (strcasecmp(action,
"config") == 0) {
1538 }
else if (strcasecmp(action,
"accept") == 0) {
1541 SCLogError(
"An invalid action \"%s\" was given", action);
1557 static int SigParseAction(
Signature *s,
const char *action_in)
1560 strlcpy(action, action_in,
sizeof(action));
1561 const char *a = action;
1562 const char *o = NULL;
1564 bool has_scope = strchr(action,
':') != NULL;
1566 char *xsaveptr = NULL;
1567 a = strtok_r(action,
":", &xsaveptr);
1568 o = strtok_r(NULL,
":", &xsaveptr);
1572 SCLogError(
"invalid protocol specification '%s'", action_in);
1576 uint8_t
flags = ActionStringToFlags(a);
1582 uint8_t scope_flags = 0;
1584 if (strcmp(o,
"packet") == 0) {
1586 }
else if (strcmp(o,
"flow") == 0) {
1589 SCLogError(
"invalid action scope '%s' in action '%s': only 'packet' and 'flow' "
1596 if (strcmp(o,
"packet") == 0) {
1598 }
else if (strcmp(o,
"hook") == 0) {
1600 }
else if (strcmp(o,
"tx") == 0) {
1602 }
else if (strcmp(o,
"flow") == 0) {
1606 "invalid action scope '%s' in action '%s': only 'packet', 'flow', 'tx' and "
1613 if (strcmp(o,
"packet") == 0) {
1616 SCLogError(
"invalid action scope '%s' in action '%s': only 'packet' allowed", o,
1622 SCLogError(
"invalid action scope '%s' in action '%s': scope only supported for actions "
1623 "'drop', 'pass' and 'reject'",
1631 SCLogError(
"firewall rules require setting an explicit action scope");
1636 SCLogError(
"'accept' action only supported for firewall rules");
1641 SCLogError(
"'pass' action not supported for firewall rules");
1660 static inline int SigParseToken(
char **input,
char *output,
1661 const size_t output_size)
1663 size_t len = *input == NULL ? 0 : strlen(*input);
1669 while (
len && isblank(**input)) {
1674 char *endptr = strpbrk(*input,
" \t\n\r");
1675 if (endptr != NULL) {
1678 strlcpy(output, *input, output_size);
1695 static inline int SigParseList(
char **input,
char *output,
1696 const size_t output_size)
1699 size_t len = *input != NULL ? strlen(*input) : 0;
1705 while (
len && isblank(**input)) {
1711 for (i = 0; i <
len; i++) {
1712 char c = (*input)[i];
1715 }
else if (c ==
']') {
1717 }
else if (c ==
' ') {
1728 strlcpy(output, *input, output_size);
1729 *input = *input + i + 1;
1749 SigParseToken(&index, parser->
action,
sizeof(parser->
action));
1755 SigParseList(&index, parser->
src,
sizeof(parser->
src));
1758 SigParseList(&index, parser->
sp,
sizeof(parser->
sp));
1764 SigParseList(&index, parser->
dst,
sizeof(parser->
dst));
1767 SigParseList(&index, parser->
dp,
sizeof(parser->
dp));
1770 if (index == NULL) {
1774 while (isspace(*index) || *index ==
'(') {
1777 for (
size_t i = strlen(index); i > 0; i--) {
1778 if (isspace(index[i - 1]) || index[i - 1] ==
')') {
1779 index[i - 1] =
'\0';
1791 if (SigParseAction(s, parser->
action) < 0)
1794 if (SigParseProto(s, parser->
protocol) < 0)
1797 if (strcmp(parser->
direction,
"<>") == 0) {
1799 }
else if (strcmp(parser->
direction,
"=>") == 0) {
1801 SCLogError(
"transactional bidirectional rules not supported for firewall rules");
1806 }
else if (strcmp(parser->
direction,
"->") != 0) {
1807 SCLogError(
"\"%s\" is not a valid direction modifier, "
1808 "\"->\" and \"<>\" are supported.",
1835 static inline bool CheckAscii(
const char *
str)
1837 for (
size_t i = 0; i < strlen(
str); i++) {
1838 if (
str[i] < 0x20) {
1840 if (
str[i] == 0x0a ||
str[i] == 0x0d ||
str[i] == 0x09) {
1844 }
else if (
str[i] == 0x7f) {
1868 if (!SCCheckUtf8(sigstr)) {
1873 if (!CheckAscii(sigstr)) {
1874 SCLogError(
"rule contains invalid (control) characters");
1878 int ret = SigParseBasics(
de_ctx, s, sigstr, parser, addrs_direction, requires);
1885 if (strlen(parser->
opts) > 0) {
1886 size_t buffer_size = strlen(parser->
opts) + 1;
1888 char input[buffer_size];
1889 char output[buffer_size];
1890 memset(input, 0x00, buffer_size);
1891 memcpy(input, parser->
opts, strlen(parser->
opts) + 1);
1897 memset(output, 0x00, buffer_size);
1898 ret = SigParseOptions(
de_ctx, s, input, output, buffer_size, requires);
1900 memcpy(input, output, buffer_size);
1932 memset(b, 0,
sizeof(*b));
1980 static void SigMetadataFree(
Signature *s)
1987 if (s == NULL || s->
metadata == NULL) {
1994 next_mdata = mdata->
next;
2025 next_ref = ref->
next;
2079 while (sm != NULL) {
2088 while (sm != NULL) {
2109 if (s->
sp != NULL) {
2112 if (s->
dp != NULL) {
2161 if (s->
alproto == *alprotos) {
2204 }
else if (i == 1) {
2236 if (!AppProtoIsValid(alproto)) {
2260 alproto = AppProtoCommon(s->
alproto, alproto);
2262 SCLogError(
"can't set rule app proto to %s: already set to %s",
2289 if (addr_match4 == NULL) {
2295 addr_match4[idx].
ip =
SCNtohl(da->ip.addr_data32[0]);
2296 addr_match4[idx].
ip2 =
SCNtohl(da->ip2.addr_data32[0]);
2315 if (addr_match6 == NULL) {
2321 addr_match6[idx].
ip[0] =
SCNtohl(da->ip.addr_data32[0]);
2322 addr_match6[idx].
ip[1] =
SCNtohl(da->ip.addr_data32[1]);
2323 addr_match6[idx].
ip[2] =
SCNtohl(da->ip.addr_data32[2]);
2324 addr_match6[idx].
ip[3] =
SCNtohl(da->ip.addr_data32[3]);
2325 addr_match6[idx].
ip2[0] =
SCNtohl(da->ip2.addr_data32[0]);
2326 addr_match6[idx].
ip2[1] =
SCNtohl(da->ip2.addr_data32[1]);
2327 addr_match6[idx].
ip2[2] =
SCNtohl(da->ip2.addr_data32[2]);
2328 addr_match6[idx].
ip2[3] =
SCNtohl(da->ip2.addr_data32[3]);
2341 static void SigBuildAddressMatchArray(
Signature *s)
2358 static int SigMatchListLen(
SigMatch *sm)
2361 for (; sm != NULL; sm = sm->
next)
2372 int len = SigMatchListLen(
head);
2378 FatalError(
"initializing the detection engine failed");
2384 for (; sm != NULL; sm = sm->
next, smd++) {
2424 SCLogDebug(
"s %u: no mpm; prefilter? de_ctx->prefilter_setting %u "
2425 "s->init_data->has_possible_prefilter %s",
2439 prefilter_list =
MIN(prefilter_list, sm->
type);
2449 if (sm->
type == prefilter_list) {
2466 static bool DetectRuleValidateTable(
const Signature *s)
2475 if (kw_tables_supported != 0 && (kw_tables_supported & table_as_flag) == 0) {
2476 SCLogError(
"rule %u uses hook \"%s\", but keyword \"%s\" doesn't support this hook",
2487 SCLogError(
"rule %u is loaded as a firewall rule, but does not specify an "
2495 static void DetectRuleSetTable(
Signature *s)
2528 if (!DetectFirewallRuleValidate(
de_ctx, s))
2534 static int SigValidateCheckBuffers(
2537 bool has_frame =
false;
2538 bool has_app =
false;
2539 bool has_pkt =
false;
2540 bool has_pmatch =
false;
2546 nlists += (nlists > 0);
2550 SCLogError(
"rule %u setup buffer %s but didn't add matches to it", s->
id,
2564 struct BufferVsDir {
2567 } bufdir[nlists + 1];
2568 memset(&bufdir, 0, (nlists + 1) *
sizeof(
struct BufferVsDir));
2582 if (b->
head == NULL) {
2587 has_frame |= bt->
frame;
2593 "specific matches (like dsize, flags, ttl) with stream / "
2594 "state matching by matching on app layer proto (like using "
2595 "http_* keywords).");
2600 for (; app != NULL; app = app->
next) {
2615 bufdir[b->
id].ts += (app->
dir == 0);
2616 bufdir[b->
id].tc += (app->
dir == 1);
2630 SCLogError(
"engine progress value doesn't match hook");
2649 if (has_pmatch && has_frame) {
2650 SCLogError(
"can't mix pure content and frame inspection");
2653 if (has_app && has_frame) {
2654 SCLogError(
"can't mix app-layer buffer and frame inspection");
2657 if (has_pkt && has_frame) {
2658 SCLogError(
"can't mix pkt buffer and frame inspection");
2662 for (
int x = 0; x < nlists; x++) {
2663 if (bufdir[x].
ts == 0 && bufdir[x].tc == 0)
2665 (*ts_excl) += (bufdir[x].ts > 0 && bufdir[x].tc == 0);
2666 (*tc_excl) += (bufdir[x].ts == 0 && bufdir[x].tc > 0);
2667 (*dir_amb) += (bufdir[x].ts > 0 && bufdir[x].tc > 0);
2676 static int SigValidatePacketStream(
const Signature *s)
2680 "tcp-stream or flow:only_stream. Invalidating signature.");
2686 static int SigConsolidateDirection(
2687 Signature *s,
const int ts_excl,
const int tc_excl,
const int dir_amb)
2690 if (!ts_excl || !tc_excl) {
2691 SCLogError(
"rule %u should use both directions, but does not", s->
id);
2695 SCLogError(
"rule %u means to use both directions, cannot have keywords ambiguous about "
2700 }
else if (ts_excl && tc_excl) {
2702 "rule %u mixes keywords with conflicting directions, a transactional rule with => "
2706 }
else if (ts_excl) {
2707 SCLogDebug(
"%u: implied rule direction is toserver", s->
id);
2709 SCLogError(
"rule %u mixes keywords with conflicting directions", s->
id);
2712 }
else if (tc_excl) {
2713 SCLogDebug(
"%u: implied rule direction is toclient", s->
id);
2715 SCLogError(
"rule %u mixes keywords with conflicting directions", s->
id);
2718 }
else if (dir_amb) {
2719 SCLogDebug(
"%u: rule direction cannot be deduced from keywords", s->
id);
2724 static void SigConsolidateTcpBuffer(
Signature *s)
2756 static bool SigInspectsFiles(
const Signature *s)
2767 static int SigValidateFileHandling(
const Signature *s)
2769 if (!SigInspectsFiles(s)) {
2776 "support file matching",
2793 SCLogError(
"No protocol support file matching");
2798 SCLogError(
"protocol HTTP2 doesn't support file name matching");
2804 static bool SigValidateEthernet(
const Signature *s)
2809 SCLogError(
"can't use ports with ether or arp rule");
2817 static bool SigValidateProtoPkthdr(
const Signature *s)
2820 SCLogError(
"protocol 'pkthdr' is for decoder-events only");
2836 static int SigValidateConsolidate(
2841 if (SigValidateFirewall(
de_ctx, s) == 0)
2844 if (SigValidatePacketStream(s) == 0) {
2848 if (!SigValidateEthernet(s)) {
2856 if (SigValidateCheckBuffers(
de_ctx, s, &ts_excl, &tc_excl, &dir_amb) == 0) {
2860 if (SigConsolidateDirection(s, ts_excl, tc_excl, dir_amb) == 0) {
2864 SigConsolidateTcpBuffer(s);
2867 DetectRuleSetTable(s);
2869 if (!SigValidateProtoPkthdr(s)) {
2876 int r = SigValidateFileHandling(s);
2880 if (SigInspectsFiles(s)) {
2885 if (DetectRuleValidateTable(s) ==
false) {
2908 memset(&parser, 0x00,
sizeof(parser));
2913 if (firewall_rule) {
2930 int ret = SigParse(
de_ctx, sig, sigstr, dir, &parser,
true);
2937 }
else if (ret < 0) {
2943 SCLogError(
"Signature missing required value \"sid\".");
2948 ret = SigParse(
de_ctx, sig, sigstr, dir, &parser,
false);
2954 }
else if (ret == -2) {
2957 }
else if (ret < 0) {
2962 if (sig->
prio == -1)
2969 int override_needed = 0;
2973 override_needed = 1;
2975 override_needed = 1;
2979 override_needed = 0;
2988 if (override_needed)
2998 for ( ; sm != NULL; sm = sm->
next) {
3022 SCLogDebug(
"sig %"PRIu32
" SIG_FLAG_APPLAYER: %s, SIG_FLAG_PACKET: %s",
3026 SigBuildAddressMatchArray(sig);
3037 SigSetupPrefilter(
de_ctx, sig);
3040 if (SigValidateConsolidate(
de_ctx, sig, &parser, dir) == 0) {
3059 static bool SigHasSameSourceAndDestination(
const Signature *s)
3101 if (SigHasSameSourceAndDestination(sig)) {
3102 SCLogInfo(
"Rule with ID %u is bidirectional, but source and destination are the same, "
3103 "treating the rule as unidirectional", sig->
id);
3108 if (sig->
next == NULL) {
3138 return SigInitDo(
de_ctx, sigstr,
false);
3143 return SigInitDo(
de_ctx, sigstr,
true);
3152 static void DetectParseDupSigFreeFunc(
void *data)
3168 static uint32_t DetectParseDupSigHashFunc(
HashListTable *ht,
void *data, uint16_t datalen)
3187 static char DetectParseDupSigCompareFunc(
void *data1, uint16_t len1,
void *data2,
3193 if (sw1 == NULL || sw2 == NULL ||
3194 sw1->
s == NULL || sw2->
s == NULL)
3198 if (sw1->
s->
id == sw2->
s->
id && sw1->
s->
gid == sw2->
s->
gid)
return 1;
3214 DetectParseDupSigHashFunc,
3215 DetectParseDupSigCompareFunc,
3216 DetectParseDupSigFreeFunc);
3277 if (sw_dup == NULL) {
3290 (
void *)&sw_tmp, 0);
3302 if (sw->
s->
rev <= sw_dup->
s->
rev) {
3311 if (sw_dup->
s_prev == NULL) {
3319 sw_temp.
s = sw_dup->
s->
next;
3323 if (sw_temp.
s != NULL) {
3325 (
void *)&sw_temp, 0);
3345 sw_temp.
s = sw_dup->
s->
next;
3353 if (sw_temp.
s != NULL) {
3355 (
void *)&sw_temp, 0);
3370 (
void *)&sw_tmp, 0);
3371 if (sw_old->
s != sw_dup->
s) {
3414 int dup_sig = DetectEngineSignatureIsDuplicate(
de_ctx, sig);
3418 SCLogError(
"Duplicate signature \"%s\"", sigstr);
3420 }
else if (dup_sig == 2) {
3422 " so the older sig replaced by this new signature \"%s\"",
3427 if (sig->
next != NULL) {
3444 return (dup_sig == 0 || dup_sig == 2) ? sig : NULL;
3448 if (sig != NULL && sig->
next != NULL) {
3486 int dup_sig = DetectEngineSignatureIsDuplicate(
de_ctx, sig);
3490 SCLogError(
"Duplicate signature \"%s\"", sigstr);
3492 }
else if (dup_sig == 2) {
3494 " so the older sig replaced by this new signature \"%s\"",
3499 if (sig->
next != NULL) {
3516 return (dup_sig == 0 || dup_sig == 2) ? sig : NULL;
3520 if (sig != NULL && sig->
next != NULL) {
3533 int start_offset,
int options)
3535 *match = pcre2_match_data_create_from_pattern(parse_regex->
regex, NULL);
3537 return pcre2_match(parse_regex->
regex, (PCRE2_SPTR8)
str, strlen(
str), options, start_offset,
3538 *match, parse_regex->
context);
3545 pcre2_code_free(r->
regex);
3548 pcre2_match_context_free(r->
context);
3563 g_detect_parse_regex_list = NULL;
3572 FatalError(
"failed to alloc memory for pcre free list");
3575 r->
next = g_detect_parse_regex_list;
3576 g_detect_parse_regex_list = r;
3584 detect_parse->
regex =
3585 pcre2_compile((PCRE2_SPTR8)parse_str, PCRE2_ZERO_TERMINATED, opts, &en, &eo, NULL);
3586 if (detect_parse->
regex == NULL) {
3587 PCRE2_UCHAR errbuffer[256];
3588 pcre2_get_error_message(en, errbuffer,
sizeof(errbuffer));
3589 SCLogError(
"pcre compile of \"%s\" failed at "
3591 parse_str, en, errbuffer);
3594 detect_parse->
context = pcre2_match_context_create(NULL);
3595 if (detect_parse->
context == NULL) {
3596 SCLogError(
"pcre2 could not create match context");
3597 pcre2_code_free(detect_parse->
regex);
3598 detect_parse->
regex = NULL;
3613 if (detect_parse == NULL) {
3617 detect_parse->
regex =
3618 pcre2_compile((PCRE2_SPTR8)parse_str, PCRE2_ZERO_TERMINATED, opts, &en, &eo, NULL);
3619 if (detect_parse->
regex == NULL) {
3620 PCRE2_UCHAR errbuffer[256];
3621 pcre2_get_error_message(en, errbuffer,
sizeof(errbuffer));
3622 SCLogError(
"pcre2 compile of \"%s\" failed at "
3624 parse_str, (
int)eo, errbuffer);
3629 detect_parse->
next = g_detect_parse_regex_list;
3630 g_detect_parse_regex_list = detect_parse;
3631 return detect_parse;
3635 pcre2_match_data *match_data, uint32_t number, PCRE2_UCHAR *buffer, PCRE2_SIZE *bufflen)
3637 int r = pcre2_substring_copy_bynumber(match_data, number, buffer, bufflen);
3638 if (r == PCRE2_ERROR_UNSET) {
3647 pcre2_match_data *match_data, uint32_t number, PCRE2_UCHAR **bufferptr, PCRE2_SIZE *bufflen)
3649 int r = pcre2_substring_get_bynumber(match_data, number, bufferptr, bufflen);
3650 if (r == PCRE2_ERROR_UNSET) {
3673 static int SigParseTest01 (
void)
3682 sig =
SigInit(
de_ctx,
"alert tcp 1.2.3.4 any -> !1.2.3.4 any (msg:\"SigParseTest01\"; sid:1;)");
3692 static int SigParseTest02 (
void)
3707 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;)");
3735 static int SigParseTest03 (
void)
3744 sig =
SigInit(
de_ctx,
"alert tcp 1.2.3.4 any <- !1.2.3.4 any (msg:\"SigParseTest03\"; sid:1;)");
3747 printf(
"expected NULL got sig ptr %p: ",sig);
3756 static int SigParseTest04 (
void)
3765 sig =
SigInit(
de_ctx,
"alert tcp 1.2.3.4 1024: -> !1.2.3.4 1024: (msg:\"SigParseTest04\"; sid:1;)");
3776 static int SigParseTest05 (
void)
3785 sig =
SigInit(
de_ctx,
"alert tcp 1.2.3.4 1024:65536 -> !1.2.3.4 any (msg:\"SigParseTest05\"; sid:1;)");
3789 printf(
"signature didn't fail to parse as we expected: ");
3799 static int SigParseTest06 (
void)
3808 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;)");
3812 printf(
"signature failed to parse: ");
3826 static int SigParseTest07(
void)
3848 static int SigParseTest08(
void)
3871 static int SigParseTest09(
void)
3922 static int SigParseTest10(
void)
3954 static int SigParseTest11(
void)
3965 "drop tcp any any -> any 80 (msg:\"Snort_Inline is blocking the http link\"; sid:1;) ");
3967 printf(
"sig 1 didn't parse: ");
3972 "the http link\"; sid:2;) ");
3974 printf(
"sig 2 didn't parse: ");
3988 static int SigParseTest12(
void)
4000 printf(
"sig 1 should have given an error: ");
4014 static int SigParseTest13(
void)
4026 printf(
"sig 1 invalidated: failure");
4031 printf(
"sig doesn't have stream flag set\n");
4036 printf(
"sig has packet flag set\n");
4051 static int SigParseTest14(
void)
4063 printf(
"sig 1 invalidated: failure");
4068 printf(
"sig doesn't have packet flag set\n");
4073 printf(
"sig has stream flag set\n");
4088 static int SigParseTest15(
void)
4100 printf(
"sig 1 invalidated: failure");
4105 printf(
"sig doesn't have packet flag set\n");
4110 printf(
"sig doesn't have stream flag set\n");
4125 static int SigParseTest16(
void)
4137 printf(
"sig 1 invalidated: failure");
4142 printf(
"sig doesn't have packet flag set\n");
4147 printf(
"sig doesn't have stream flag set\n");
4162 static int SigParseTest17(
void)
4174 printf(
"sig 1 invalidated: failure");
4179 printf(
"sig doesn't have packet flag set\n");
4184 printf(
"sig doesn't have stream flag set\n");
4197 static int SigParseTest18 (
void)
4205 if (
DetectEngineAppendSig(
de_ctx,
"alert tcp 1.2.3.4 any -> !1.2.3.4 any (msg:\"SigParseTest01\"; sid:99999999999999999999;)") != NULL)
4216 static int SigParseTest19 (
void)
4224 if (
DetectEngineAppendSig(
de_ctx,
"alert tcp 1.2.3.4 any -> !1.2.3.4 any (msg:\"SigParseTest01\"; sid:1; gid:99999999999999999999;)") != NULL)
4235 static int SigParseTest20 (
void)
4243 if (
DetectEngineAppendSig(
de_ctx,
"alert tcp 1.2.3.4 any -> !1.2.3.4 any (msg:\"SigParseTest01\"; sid:1; rev:99999999999999999999;)") != NULL)
4254 static int SigParseTest21 (
void)
4273 static int SigParseTest22 (
void)
4281 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)
4294 static int SigParseTest23(
void)
4309 static int SigParseBidirecTest06 (
void)
4329 static int SigParseBidirecTest07 (
void)
4349 static int SigParseBidirecTest08 (
void)
4369 static int SigParseBidirecTest09 (
void)
4389 static int SigParseBidirecTest10 (
void)
4409 static int SigParseBidirecTest11 (
void)
4429 static int SigParseBidirecTest12 (
void)
4449 static int SigParseBidirecTest13 (
void)
4468 static int SigParseBidirecTest14 (
void)
4489 static int SigTestBidirec01 (
void)
4501 if (sig->
next != NULL)
4520 static int SigTestBidirec02 (
void)
4539 if (sig->
next == NULL)
4544 if (copy->
next != NULL)
4565 static int SigTestBidirec03 (
void)
4577 const char *sigs[3];
4578 sigs[0] =
"alert tcp any any -> 192.168.1.1 any (msg:\"SigTestBidirec03 sid 1\"; sid:1;)";
4579 sigs[1] =
"alert tcp any any <> 192.168.1.1 any (msg:\"SigTestBidirec03 sid 2 bidirectional\"; sid:2;)";
4580 sigs[2] =
"alert tcp any any -> 192.168.1.1 any (msg:\"SigTestBidirec03 sid 3\"; sid:3;)";
4587 if (sig->
next == NULL)
4598 uint8_t rawpkt1_ether[] = {
4599 0x00,0x50,0x56,0xea,0x00,0xbd,0x00,0x0c,
4600 0x29,0x40,0xc8,0xb5,0x08,0x00,0x45,0x00,
4601 0x01,0xa8,0xb9,0xbb,0x40,0x00,0x40,0x06,
4602 0xe0,0xbf,0xc0,0xa8,0x1c,0x83,0xc0,0xa8,
4603 0x01,0x01,0xb9,0x0a,0x00,0x50,0x6f,0xa2,
4604 0x92,0xed,0x7b,0xc1,0xd3,0x4d,0x50,0x18,
4605 0x16,0xd0,0xa0,0x6f,0x00,0x00,0x47,0x45,
4606 0x54,0x20,0x2f,0x20,0x48,0x54,0x54,0x50,
4607 0x2f,0x31,0x2e,0x31,0x0d,0x0a,0x48,0x6f,
4608 0x73,0x74,0x3a,0x20,0x31,0x39,0x32,0x2e,
4609 0x31,0x36,0x38,0x2e,0x31,0x2e,0x31,0x0d,
4610 0x0a,0x55,0x73,0x65,0x72,0x2d,0x41,0x67,
4611 0x65,0x6e,0x74,0x3a,0x20,0x4d,0x6f,0x7a,
4612 0x69,0x6c,0x6c,0x61,0x2f,0x35,0x2e,0x30,
4613 0x20,0x28,0x58,0x31,0x31,0x3b,0x20,0x55,
4614 0x3b,0x20,0x4c,0x69,0x6e,0x75,0x78,0x20,
4615 0x78,0x38,0x36,0x5f,0x36,0x34,0x3b,0x20,
4616 0x65,0x6e,0x2d,0x55,0x53,0x3b,0x20,0x72,
4617 0x76,0x3a,0x31,0x2e,0x39,0x2e,0x30,0x2e,
4618 0x31,0x34,0x29,0x20,0x47,0x65,0x63,0x6b,
4619 0x6f,0x2f,0x32,0x30,0x30,0x39,0x30,0x39,
4620 0x30,0x32,0x31,0x37,0x20,0x55,0x62,0x75,
4621 0x6e,0x74,0x75,0x2f,0x39,0x2e,0x30,0x34,
4622 0x20,0x28,0x6a,0x61,0x75,0x6e,0x74,0x79,
4623 0x29,0x20,0x46,0x69,0x72,0x65,0x66,0x6f,
4624 0x78,0x2f,0x33,0x2e,0x30,0x2e,0x31,0x34,
4625 0x0d,0x0a,0x41,0x63,0x63,0x65,0x70,0x74,
4626 0x3a,0x20,0x74,0x65,0x78,0x74,0x2f,0x68,
4627 0x74,0x6d,0x6c,0x2c,0x61,0x70,0x70,0x6c,
4628 0x69,0x63,0x61,0x74,0x69,0x6f,0x6e,0x2f,
4629 0x78,0x68,0x74,0x6d,0x6c,0x2b,0x78,0x6d,
4630 0x6c,0x2c,0x61,0x70,0x70,0x6c,0x69,0x63,
4631 0x61,0x74,0x69,0x6f,0x6e,0x2f,0x78,0x6d,
4632 0x6c,0x3b,0x71,0x3d,0x30,0x2e,0x39,0x2c,
4633 0x2a,0x2f,0x2a,0x3b,0x71,0x3d,0x30,0x2e,
4634 0x38,0x0d,0x0a,0x41,0x63,0x63,0x65,0x70,
4635 0x74,0x2d,0x4c,0x61,0x6e,0x67,0x75,0x61,
4636 0x67,0x65,0x3a,0x20,0x65,0x6e,0x2d,0x75,
4637 0x73,0x2c,0x65,0x6e,0x3b,0x71,0x3d,0x30,
4638 0x2e,0x35,0x0d,0x0a,0x41,0x63,0x63,0x65,
4639 0x70,0x74,0x2d,0x45,0x6e,0x63,0x6f,0x64,
4640 0x69,0x6e,0x67,0x3a,0x20,0x67,0x7a,0x69,
4641 0x70,0x2c,0x64,0x65,0x66,0x6c,0x61,0x74,
4642 0x65,0x0d,0x0a,0x41,0x63,0x63,0x65,0x70,
4643 0x74,0x2d,0x43,0x68,0x61,0x72,0x73,0x65,
4644 0x74,0x3a,0x20,0x49,0x53,0x4f,0x2d,0x38,
4645 0x38,0x35,0x39,0x2d,0x31,0x2c,0x75,0x74,
4646 0x66,0x2d,0x38,0x3b,0x71,0x3d,0x30,0x2e,
4647 0x37,0x2c,0x2a,0x3b,0x71,0x3d,0x30,0x2e,
4648 0x37,0x0d,0x0a,0x4b,0x65,0x65,0x70,0x2d,
4649 0x41,0x6c,0x69,0x76,0x65,0x3a,0x20,0x33,
4650 0x30,0x30,0x0d,0x0a,0x43,0x6f,0x6e,0x6e,
4651 0x65,0x63,0x74,0x69,0x6f,0x6e,0x3a,0x20,
4652 0x6b,0x65,0x65,0x70,0x2d,0x61,0x6c,0x69,
4653 0x76,0x65,0x0d,0x0a,0x0d,0x0a };
4663 uint32_t sids[3] = {1, 2, 3};
4664 uint32_t results[3] = {1, 1, 1};
4680 static int SigTestBidirec04 (
void)
4695 sig =
DetectEngineAppendSig(
de_ctx,
"alert tcp 192.168.1.1 any <> any any (msg:\"SigTestBidirec03 sid 2 bidirectional\"; sid:2;)");
4700 if (sig->
next == NULL)
4712 if (sig->
next == NULL)
4723 uint8_t rawpkt1_ether[] = {
4724 0x00,0x50,0x56,0xea,0x00,0xbd,0x00,0x0c,
4725 0x29,0x40,0xc8,0xb5,0x08,0x00,0x45,0x00,
4726 0x01,0xa8,0xb9,0xbb,0x40,0x00,0x40,0x06,
4727 0xe0,0xbf,0xc0,0xa8,0x1c,0x83,0xc0,0xa8,
4728 0x01,0x01,0xb9,0x0a,0x00,0x50,0x6f,0xa2,
4729 0x92,0xed,0x7b,0xc1,0xd3,0x4d,0x50,0x18,
4730 0x16,0xd0,0xa0,0x6f,0x00,0x00,0x47,0x45,
4731 0x54,0x20,0x2f,0x20,0x48,0x54,0x54,0x50,
4732 0x2f,0x31,0x2e,0x31,0x0d,0x0a,0x48,0x6f,
4733 0x73,0x74,0x3a,0x20,0x31,0x39,0x32,0x2e,
4734 0x31,0x36,0x38,0x2e,0x31,0x2e,0x31,0x0d,
4735 0x0a,0x55,0x73,0x65,0x72,0x2d,0x41,0x67,
4736 0x65,0x6e,0x74,0x3a,0x20,0x4d,0x6f,0x7a,
4737 0x69,0x6c,0x6c,0x61,0x2f,0x35,0x2e,0x30,
4738 0x20,0x28,0x58,0x31,0x31,0x3b,0x20,0x55,
4739 0x3b,0x20,0x4c,0x69,0x6e,0x75,0x78,0x20,
4740 0x78,0x38,0x36,0x5f,0x36,0x34,0x3b,0x20,
4741 0x65,0x6e,0x2d,0x55,0x53,0x3b,0x20,0x72,
4742 0x76,0x3a,0x31,0x2e,0x39,0x2e,0x30,0x2e,
4743 0x31,0x34,0x29,0x20,0x47,0x65,0x63,0x6b,
4744 0x6f,0x2f,0x32,0x30,0x30,0x39,0x30,0x39,
4745 0x30,0x32,0x31,0x37,0x20,0x55,0x62,0x75,
4746 0x6e,0x74,0x75,0x2f,0x39,0x2e,0x30,0x34,
4747 0x20,0x28,0x6a,0x61,0x75,0x6e,0x74,0x79,
4748 0x29,0x20,0x46,0x69,0x72,0x65,0x66,0x6f,
4749 0x78,0x2f,0x33,0x2e,0x30,0x2e,0x31,0x34,
4750 0x0d,0x0a,0x41,0x63,0x63,0x65,0x70,0x74,
4751 0x3a,0x20,0x74,0x65,0x78,0x74,0x2f,0x68,
4752 0x74,0x6d,0x6c,0x2c,0x61,0x70,0x70,0x6c,
4753 0x69,0x63,0x61,0x74,0x69,0x6f,0x6e,0x2f,
4754 0x78,0x68,0x74,0x6d,0x6c,0x2b,0x78,0x6d,
4755 0x6c,0x2c,0x61,0x70,0x70,0x6c,0x69,0x63,
4756 0x61,0x74,0x69,0x6f,0x6e,0x2f,0x78,0x6d,
4757 0x6c,0x3b,0x71,0x3d,0x30,0x2e,0x39,0x2c,
4758 0x2a,0x2f,0x2a,0x3b,0x71,0x3d,0x30,0x2e,
4759 0x38,0x0d,0x0a,0x41,0x63,0x63,0x65,0x70,
4760 0x74,0x2d,0x4c,0x61,0x6e,0x67,0x75,0x61,
4761 0x67,0x65,0x3a,0x20,0x65,0x6e,0x2d,0x75,
4762 0x73,0x2c,0x65,0x6e,0x3b,0x71,0x3d,0x30,
4763 0x2e,0x35,0x0d,0x0a,0x41,0x63,0x63,0x65,
4764 0x70,0x74,0x2d,0x45,0x6e,0x63,0x6f,0x64,
4765 0x69,0x6e,0x67,0x3a,0x20,0x67,0x7a,0x69,
4766 0x70,0x2c,0x64,0x65,0x66,0x6c,0x61,0x74,
4767 0x65,0x0d,0x0a,0x41,0x63,0x63,0x65,0x70,
4768 0x74,0x2d,0x43,0x68,0x61,0x72,0x73,0x65,
4769 0x74,0x3a,0x20,0x49,0x53,0x4f,0x2d,0x38,
4770 0x38,0x35,0x39,0x2d,0x31,0x2c,0x75,0x74,
4771 0x66,0x2d,0x38,0x3b,0x71,0x3d,0x30,0x2e,
4772 0x37,0x2c,0x2a,0x3b,0x71,0x3d,0x30,0x2e,
4773 0x37,0x0d,0x0a,0x4b,0x65,0x65,0x70,0x2d,
4774 0x41,0x6c,0x69,0x76,0x65,0x3a,0x20,0x33,
4775 0x30,0x30,0x0d,0x0a,0x43,0x6f,0x6e,0x6e,
4776 0x65,0x63,0x74,0x69,0x6f,0x6e,0x3a,0x20,
4777 0x6b,0x65,0x65,0x70,0x2d,0x61,0x6c,0x69,
4778 0x76,0x65,0x0d,0x0a,0x0d,0x0a };
4787 memset(&th_v, 0,
sizeof(th_v));
4827 static int SigParseTestNegation01 (
void)
4841 static int SigParseTestNegation02 (
void)
4847 "alert tcp any !any -> any any (msg:\"SigTest41-02 src ip is !any \"; "
4848 "classtype:misc-activity; sid:410002; rev:1;)");
4856 static int SigParseTestNegation03 (
void)
4862 "alert tcp any any -> any [80:!80] (msg:\"SigTest41-03 dst port [80:!80] \"; "
4863 "classtype:misc-activity; sid:410003; rev:1;)");
4871 static int SigParseTestNegation04 (
void)
4882 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;)");
4897 static int SigParseTestNegation05 (
void)
4908 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;)");
4923 static int SigParseTestNegation06 (
void)
4934 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;)");
4950 static int SigParseTestNegation07 (
void)
4956 de_ctx,
"alert tcp any any -> [192.168.0.2,!192.168.0.0/24] any (sid:410006;)");
4965 static int SigParseTestNegation08 (
void)
4977 "alert tcp any any -> [192.168.0.0/16,!192.168.0.0/24] any (sid:410006; rev:1;)");
4992 static int SigParseTestMpm01 (
void)
5001 sig =
SigInit(
de_ctx,
"alert tcp any any -> any any (msg:\"mpm test\"; content:\"abcd\"; sid:1;)");
5003 printf(
"sig failed to init: ");
5008 printf(
"sig doesn't have content list: ");
5023 static int SigParseTestMpm02 (
void)
5032 sig =
SigInit(
de_ctx,
"alert tcp any any -> any any (msg:\"mpm test\"; content:\"abcd\"; content:\"abcdef\"; sid:1;)");
5034 printf(
"sig failed to init: ");
5039 printf(
"sig doesn't have content list: ");
5054 static int SigParseTestAppLayerTLS01(
void)
5065 s =
SigInit(
de_ctx,
"alert tls any any -> any any (msg:\"SigParseTestAppLayerTLS01 \"; sid:410006; rev:1;)");
5067 printf(
"parsing sig failed: ");
5072 printf(
"alproto not set: ");
5089 static int SigParseTestAppLayerTLS02(
void)
5100 s =
SigInit(
de_ctx,
"alert tls any any -> any any (msg:\"SigParseTestAppLayerTLS02 \"; tls.version:1.0; sid:410006; rev:1;)");
5102 printf(
"parsing sig failed: ");
5107 printf(
"alproto not set: ");
5123 static int SigParseTestAppLayerTLS03(
void)
5130 "alert tls any any -> any any (msg:\"SigParseTestAppLayerTLS03 \"; "
5131 "tls.version:2.5; sid:410006; rev:1;)");
5137 static int SigParseTestUnbalancedQuotes01(
void)
5143 "alert http any any -> any any (msg:\"SigParseTestUnbalancedQuotes01\"; "
5144 "pcre:\"/\\/[a-z]+\\.php\\?[a-z]+?=\\d{7}&[a-z]+?=\\d{7,8}$/U\" "
5145 "flowbits:set,et.exploitkitlanding; classtype:trojan-activity; sid:2017078; rev:5;)");
5151 static int SigParseTestContentGtDsize01(
void)
5158 "dsize:21; content:\"0123456789001234567890|00 00|\"; "
5165 static int SigParseTestContentGtDsize02(
void)
5172 "dsize:21; content:\"0123456789|00 00|\"; offset:10; "
5189 static int SigParseBidirWithSameSrcAndDest01(
void)
5206 "alert tcp [1.2.3.4, 5.6.7.8] [80, 81] <> [5.6.7.8, 1.2.3.4] [81, 80] (sid:3;)");
5215 static int SigParseBidirWithSameSrcAndDest02(
void)
5223 de_ctx,
"alert tcp 1.2.3.4 any <> [1.2.3.4, 5.6.7.8, ::1] any (sid:1;)");
5230 de_ctx,
"alert tcp [1.2.3.4, ::1] [80, 81, 82] <> [1.2.3.4, ::1] [80, 81] (sid:2;)");
5237 "alert tcp [1.2.3.4, ::1, ABCD:AAAA::1] [80] <> [1.2.3.4, ::1] [80, 81] (sid:3;)");
5244 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;)");
5251 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;)");
5260 static int SigParseTestActionReject(
void)
5266 de_ctx,
"reject tcp 1.2.3.4 any -> !1.2.3.4 any (msg:\"SigParseTest01\"; sid:1;)");
5267 #ifdef HAVE_LIBNET11
5278 static int SigParseTestActionDrop(
void)
5284 de_ctx,
"drop tcp 1.2.3.4 any -> !1.2.3.4 any (msg:\"SigParseTest01\"; sid:1;)");
5292 static int SigSetMultiAppProto(
void)
5367 static int DetectSetupDirection01(
void)
5372 char *
str = (
char *)
"to_client";
5373 FAIL_IF(DetectSetupDirection(s, &
str,
true) < 0);
5378 static int DetectSetupDirection02(
void)
5382 char *
str = (
char *)
"to_server";
5383 FAIL_IF(DetectSetupDirection(s, &
str,
true) < 0);
5385 str = (
char *)
"to_client";
5386 FAIL_IF(DetectSetupDirection(s, &
str,
true) >= 0);
5392 static int DetectSetupDirection03(
void)
5396 char *
str = (
char *)
"to_client , something";
5397 FAIL_IF(DetectSetupDirection(s, &
str,
false) < 0);
5399 str = (
char *)
"to_client,something";
5400 FAIL_IF(DetectSetupDirection(s, &
str,
false) < 0);
5406 static int DetectSetupDirection04(
void)
5411 char *
str = (
char *)
"to_client_toto";
5412 FAIL_IF(DetectSetupDirection(s, &
str,
true) >= 0);
5414 str = (
char *)
"to_client_toto";
5415 FAIL_IF(DetectSetupDirection(s, &
str,
false) < 0);
5417 str = (
char *)
"to_client,something";
5419 FAIL_IF(DetectSetupDirection(s, &
str,
true) >= 0);
5456 UtRegisterTest(
"SigParseTest21 -- address with space", SigParseTest21);
5457 UtRegisterTest(
"SigParseTest22 -- address with space", SigParseTest22);
5458 UtRegisterTest(
"SigParseTest23 -- carriage return", SigParseTest23);
5473 UtRegisterTest(
"SigParseTestNegation01", SigParseTestNegation01);
5474 UtRegisterTest(
"SigParseTestNegation02", SigParseTestNegation02);
5475 UtRegisterTest(
"SigParseTestNegation03", SigParseTestNegation03);
5476 UtRegisterTest(
"SigParseTestNegation04", SigParseTestNegation04);
5477 UtRegisterTest(
"SigParseTestNegation05", SigParseTestNegation05);
5478 UtRegisterTest(
"SigParseTestNegation06", SigParseTestNegation06);
5479 UtRegisterTest(
"SigParseTestNegation07", SigParseTestNegation07);
5480 UtRegisterTest(
"SigParseTestNegation08", SigParseTestNegation08);
5483 UtRegisterTest(
"SigParseTestAppLayerTLS01", SigParseTestAppLayerTLS01);
5484 UtRegisterTest(
"SigParseTestAppLayerTLS02", SigParseTestAppLayerTLS02);
5485 UtRegisterTest(
"SigParseTestAppLayerTLS03", SigParseTestAppLayerTLS03);
5486 UtRegisterTest(
"SigParseTestUnbalancedQuotes01", SigParseTestUnbalancedQuotes01);
5489 SigParseTestContentGtDsize01);
5491 SigParseTestContentGtDsize02);
5494 SigParseBidirWithSameSrcAndDest01);
5496 SigParseBidirWithSameSrcAndDest02);
5497 UtRegisterTest(
"SigParseTestActionReject", SigParseTestActionReject);
5498 UtRegisterTest(
"SigParseTestActionDrop", SigParseTestActionDrop);
5502 UtRegisterTest(
"DetectSetupDirection01", DetectSetupDirection01);
5503 UtRegisterTest(
"DetectSetupDirection02", DetectSetupDirection02);
5504 UtRegisterTest(
"DetectSetupDirection03", DetectSetupDirection03);
5505 UtRegisterTest(
"DetectSetupDirection04", DetectSetupDirection04);