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) {
2158 if (s->
alproto == *alprotos) {
2201 }
else if (i == 1) {
2233 if (!AppProtoIsValid(alproto)) {
2257 alproto = AppProtoCommon(s->
alproto, alproto);
2259 SCLogError(
"can't set rule app proto to %s: already set to %s",
2286 if (addr_match4 == NULL) {
2292 addr_match4[idx].
ip =
SCNtohl(da->ip.addr_data32[0]);
2293 addr_match4[idx].
ip2 =
SCNtohl(da->ip2.addr_data32[0]);
2312 if (addr_match6 == NULL) {
2318 addr_match6[idx].
ip[0] =
SCNtohl(da->ip.addr_data32[0]);
2319 addr_match6[idx].
ip[1] =
SCNtohl(da->ip.addr_data32[1]);
2320 addr_match6[idx].
ip[2] =
SCNtohl(da->ip.addr_data32[2]);
2321 addr_match6[idx].
ip[3] =
SCNtohl(da->ip.addr_data32[3]);
2322 addr_match6[idx].
ip2[0] =
SCNtohl(da->ip2.addr_data32[0]);
2323 addr_match6[idx].
ip2[1] =
SCNtohl(da->ip2.addr_data32[1]);
2324 addr_match6[idx].
ip2[2] =
SCNtohl(da->ip2.addr_data32[2]);
2325 addr_match6[idx].
ip2[3] =
SCNtohl(da->ip2.addr_data32[3]);
2338 static void SigBuildAddressMatchArray(
Signature *s)
2355 static int SigMatchListLen(
SigMatch *sm)
2358 for (; sm != NULL; sm = sm->
next)
2369 int len = SigMatchListLen(
head);
2375 FatalError(
"initializing the detection engine failed");
2381 for (; sm != NULL; sm = sm->
next, smd++) {
2421 SCLogDebug(
"s %u: no mpm; prefilter? de_ctx->prefilter_setting %u "
2422 "s->init_data->has_possible_prefilter %s",
2436 prefilter_list =
MIN(prefilter_list, sm->
type);
2446 if (sm->
type == prefilter_list) {
2463 static bool DetectRuleValidateTable(
const Signature *s)
2472 if (kw_tables_supported != 0 && (kw_tables_supported & table_as_flag) == 0) {
2473 SCLogError(
"rule %u uses hook \"%s\", but keyword \"%s\" doesn't support this hook",
2484 SCLogError(
"rule %u is loaded as a firewall rule, but does not specify an "
2492 static void DetectRuleSetTable(
Signature *s)
2525 if (!DetectFirewallRuleValidate(
de_ctx, s))
2531 static int SigValidateCheckBuffers(
2534 bool has_frame =
false;
2535 bool has_app =
false;
2536 bool has_pkt =
false;
2537 bool has_pmatch =
false;
2543 nlists += (nlists > 0);
2547 SCLogError(
"rule %u setup buffer %s but didn't add matches to it", s->
id,
2561 struct BufferVsDir {
2564 } bufdir[nlists + 1];
2565 memset(&bufdir, 0, (nlists + 1) *
sizeof(
struct BufferVsDir));
2579 if (b->
head == NULL) {
2584 has_frame |= bt->
frame;
2590 "specific matches (like dsize, flags, ttl) with stream / "
2591 "state matching by matching on app layer proto (like using "
2592 "http_* keywords).");
2597 for (; app != NULL; app = app->
next) {
2612 bufdir[b->
id].ts += (app->
dir == 0);
2613 bufdir[b->
id].tc += (app->
dir == 1);
2627 SCLogError(
"engine progress value doesn't match hook");
2646 if (has_pmatch && has_frame) {
2647 SCLogError(
"can't mix pure content and frame inspection");
2650 if (has_app && has_frame) {
2651 SCLogError(
"can't mix app-layer buffer and frame inspection");
2654 if (has_pkt && has_frame) {
2655 SCLogError(
"can't mix pkt buffer and frame inspection");
2659 for (
int x = 0; x < nlists; x++) {
2660 if (bufdir[x].
ts == 0 && bufdir[x].tc == 0)
2662 (*ts_excl) += (bufdir[x].ts > 0 && bufdir[x].tc == 0);
2663 (*tc_excl) += (bufdir[x].ts == 0 && bufdir[x].tc > 0);
2664 (*dir_amb) += (bufdir[x].ts > 0 && bufdir[x].tc > 0);
2673 static int SigValidatePacketStream(
const Signature *s)
2677 "tcp-stream or flow:only_stream. Invalidating signature.");
2683 static int SigConsolidateDirection(
2684 Signature *s,
const int ts_excl,
const int tc_excl,
const int dir_amb)
2687 if (!ts_excl || !tc_excl) {
2688 SCLogError(
"rule %u should use both directions, but does not", s->
id);
2692 SCLogError(
"rule %u means to use both directions, cannot have keywords ambiguous about "
2697 }
else if (ts_excl && tc_excl) {
2699 "rule %u mixes keywords with conflicting directions, a transactional rule with => "
2703 }
else if (ts_excl) {
2704 SCLogDebug(
"%u: implied rule direction is toserver", s->
id);
2706 SCLogError(
"rule %u mixes keywords with conflicting directions", s->
id);
2709 }
else if (tc_excl) {
2710 SCLogDebug(
"%u: implied rule direction is toclient", s->
id);
2712 SCLogError(
"rule %u mixes keywords with conflicting directions", s->
id);
2715 }
else if (dir_amb) {
2716 SCLogDebug(
"%u: rule direction cannot be deduced from keywords", s->
id);
2721 static void SigConsolidateTcpBuffer(
Signature *s)
2727 if (s->
proto.
proto[IPPROTO_TCP / 8] & (1 << (IPPROTO_TCP % 8))) {
2753 static bool SigInspectsFiles(
const Signature *s)
2764 static int SigValidateFileHandling(
const Signature *s)
2766 if (!SigInspectsFiles(s)) {
2773 "support file matching",
2790 SCLogError(
"No protocol support file matching");
2795 SCLogError(
"protocol HTTP2 doesn't support file name matching");
2811 static int SigValidateConsolidate(
2816 if (SigValidateFirewall(
de_ctx, s) == 0)
2819 if (SigValidatePacketStream(s) == 0) {
2827 if (SigValidateCheckBuffers(
de_ctx, s, &ts_excl, &tc_excl, &dir_amb) == 0) {
2831 if (SigConsolidateDirection(s, ts_excl, tc_excl, dir_amb) == 0) {
2835 SigConsolidateTcpBuffer(s);
2838 DetectRuleSetTable(s);
2840 int r = SigValidateFileHandling(s);
2844 if (SigInspectsFiles(s)) {
2849 if (DetectRuleValidateTable(s) ==
false) {
2872 memset(&parser, 0x00,
sizeof(parser));
2877 if (firewall_rule) {
2894 int ret = SigParse(
de_ctx, sig, sigstr, dir, &parser,
true);
2901 }
else if (ret < 0) {
2907 SCLogError(
"Signature missing required value \"sid\".");
2912 ret = SigParse(
de_ctx, sig, sigstr, dir, &parser,
false);
2918 }
else if (ret == -2) {
2921 }
else if (ret < 0) {
2926 if (sig->
prio == -1)
2933 int override_needed = 0;
2937 override_needed = 1;
2939 override_needed = 1;
2941 for (s = 0; s <
sizeof(sig->
proto.
proto); s++) {
2943 override_needed = 0;
2952 if (override_needed)
2962 for ( ; sm != NULL; sm = sm->
next) {
2986 SCLogDebug(
"sig %"PRIu32
" SIG_FLAG_APPLAYER: %s, SIG_FLAG_PACKET: %s",
2990 SigBuildAddressMatchArray(sig);
3001 SigSetupPrefilter(
de_ctx, sig);
3004 if (SigValidateConsolidate(
de_ctx, sig, &parser, dir) == 0) {
3023 static bool SigHasSameSourceAndDestination(
const Signature *s)
3065 if (SigHasSameSourceAndDestination(sig)) {
3066 SCLogInfo(
"Rule with ID %u is bidirectional, but source and destination are the same, "
3067 "treating the rule as unidirectional", sig->
id);
3072 if (sig->
next == NULL) {
3102 return SigInitDo(
de_ctx, sigstr,
false);
3107 return SigInitDo(
de_ctx, sigstr,
true);
3116 static void DetectParseDupSigFreeFunc(
void *data)
3132 static uint32_t DetectParseDupSigHashFunc(
HashListTable *ht,
void *data, uint16_t datalen)
3151 static char DetectParseDupSigCompareFunc(
void *data1, uint16_t len1,
void *data2,
3157 if (sw1 == NULL || sw2 == NULL ||
3158 sw1->
s == NULL || sw2->
s == NULL)
3162 if (sw1->
s->
id == sw2->
s->
id && sw1->
s->
gid == sw2->
s->
gid)
return 1;
3178 DetectParseDupSigHashFunc,
3179 DetectParseDupSigCompareFunc,
3180 DetectParseDupSigFreeFunc);
3241 if (sw_dup == NULL) {
3254 (
void *)&sw_tmp, 0);
3266 if (sw->
s->
rev <= sw_dup->
s->
rev) {
3275 if (sw_dup->
s_prev == NULL) {
3283 sw_temp.
s = sw_dup->
s->
next;
3287 if (sw_temp.
s != NULL) {
3289 (
void *)&sw_temp, 0);
3309 sw_temp.
s = sw_dup->
s->
next;
3317 if (sw_temp.
s != NULL) {
3319 (
void *)&sw_temp, 0);
3334 (
void *)&sw_tmp, 0);
3335 if (sw_old->
s != sw_dup->
s) {
3378 int dup_sig = DetectEngineSignatureIsDuplicate(
de_ctx, sig);
3382 SCLogError(
"Duplicate signature \"%s\"", sigstr);
3384 }
else if (dup_sig == 2) {
3386 " so the older sig replaced by this new signature \"%s\"",
3391 if (sig->
next != NULL) {
3408 return (dup_sig == 0 || dup_sig == 2) ? sig : NULL;
3412 if (sig != NULL && sig->
next != NULL) {
3450 int dup_sig = DetectEngineSignatureIsDuplicate(
de_ctx, sig);
3454 SCLogError(
"Duplicate signature \"%s\"", sigstr);
3456 }
else if (dup_sig == 2) {
3458 " so the older sig replaced by this new signature \"%s\"",
3463 if (sig->
next != NULL) {
3480 return (dup_sig == 0 || dup_sig == 2) ? sig : NULL;
3484 if (sig != NULL && sig->
next != NULL) {
3497 int start_offset,
int options)
3499 *match = pcre2_match_data_create_from_pattern(parse_regex->
regex, NULL);
3501 return pcre2_match(parse_regex->
regex, (PCRE2_SPTR8)
str, strlen(
str), options, start_offset,
3502 *match, parse_regex->
context);
3509 pcre2_code_free(r->
regex);
3512 pcre2_match_context_free(r->
context);
3527 g_detect_parse_regex_list = NULL;
3536 FatalError(
"failed to alloc memory for pcre free list");
3539 r->
next = g_detect_parse_regex_list;
3540 g_detect_parse_regex_list = r;
3548 detect_parse->
regex =
3549 pcre2_compile((PCRE2_SPTR8)parse_str, PCRE2_ZERO_TERMINATED, opts, &en, &eo, NULL);
3550 if (detect_parse->
regex == NULL) {
3551 PCRE2_UCHAR errbuffer[256];
3552 pcre2_get_error_message(en, errbuffer,
sizeof(errbuffer));
3553 SCLogError(
"pcre compile of \"%s\" failed at "
3555 parse_str, en, errbuffer);
3558 detect_parse->
context = pcre2_match_context_create(NULL);
3559 if (detect_parse->
context == NULL) {
3560 SCLogError(
"pcre2 could not create match context");
3561 pcre2_code_free(detect_parse->
regex);
3562 detect_parse->
regex = NULL;
3577 if (detect_parse == NULL) {
3581 detect_parse->
regex =
3582 pcre2_compile((PCRE2_SPTR8)parse_str, PCRE2_ZERO_TERMINATED, opts, &en, &eo, NULL);
3583 if (detect_parse->
regex == NULL) {
3584 PCRE2_UCHAR errbuffer[256];
3585 pcre2_get_error_message(en, errbuffer,
sizeof(errbuffer));
3586 SCLogError(
"pcre2 compile of \"%s\" failed at "
3588 parse_str, (
int)eo, errbuffer);
3593 detect_parse->
next = g_detect_parse_regex_list;
3594 g_detect_parse_regex_list = detect_parse;
3595 return detect_parse;
3599 pcre2_match_data *match_data, uint32_t number, PCRE2_UCHAR *buffer, PCRE2_SIZE *bufflen)
3601 int r = pcre2_substring_copy_bynumber(match_data, number, buffer, bufflen);
3602 if (r == PCRE2_ERROR_UNSET) {
3611 pcre2_match_data *match_data, uint32_t number, PCRE2_UCHAR **bufferptr, PCRE2_SIZE *bufflen)
3613 int r = pcre2_substring_get_bynumber(match_data, number, bufferptr, bufflen);
3614 if (r == PCRE2_ERROR_UNSET) {
3637 static int SigParseTest01 (
void)
3646 sig =
SigInit(
de_ctx,
"alert tcp 1.2.3.4 any -> !1.2.3.4 any (msg:\"SigParseTest01\"; sid:1;)");
3656 static int SigParseTest02 (
void)
3671 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;)");
3699 static int SigParseTest03 (
void)
3708 sig =
SigInit(
de_ctx,
"alert tcp 1.2.3.4 any <- !1.2.3.4 any (msg:\"SigParseTest03\"; sid:1;)");
3711 printf(
"expected NULL got sig ptr %p: ",sig);
3720 static int SigParseTest04 (
void)
3729 sig =
SigInit(
de_ctx,
"alert tcp 1.2.3.4 1024: -> !1.2.3.4 1024: (msg:\"SigParseTest04\"; sid:1;)");
3740 static int SigParseTest05 (
void)
3749 sig =
SigInit(
de_ctx,
"alert tcp 1.2.3.4 1024:65536 -> !1.2.3.4 any (msg:\"SigParseTest05\"; sid:1;)");
3753 printf(
"signature didn't fail to parse as we expected: ");
3763 static int SigParseTest06 (
void)
3772 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;)");
3776 printf(
"signature failed to parse: ");
3790 static int SigParseTest07(
void)
3812 static int SigParseTest08(
void)
3835 static int SigParseTest09(
void)
3886 static int SigParseTest10(
void)
3918 static int SigParseTest11(
void)
3929 "drop tcp any any -> any 80 (msg:\"Snort_Inline is blocking the http link\"; sid:1;) ");
3931 printf(
"sig 1 didn't parse: ");
3936 "the http link\"; sid:2;) ");
3938 printf(
"sig 2 didn't parse: ");
3952 static int SigParseTest12(
void)
3964 printf(
"sig 1 should have given an error: ");
3978 static int SigParseTest13(
void)
3990 printf(
"sig 1 invalidated: failure");
3995 printf(
"sig doesn't have stream flag set\n");
4000 printf(
"sig has packet flag set\n");
4015 static int SigParseTest14(
void)
4027 printf(
"sig 1 invalidated: failure");
4032 printf(
"sig doesn't have packet flag set\n");
4037 printf(
"sig has stream flag set\n");
4052 static int SigParseTest15(
void)
4064 printf(
"sig 1 invalidated: failure");
4069 printf(
"sig doesn't have packet flag set\n");
4074 printf(
"sig doesn't have stream flag set\n");
4089 static int SigParseTest16(
void)
4101 printf(
"sig 1 invalidated: failure");
4106 printf(
"sig doesn't have packet flag set\n");
4111 printf(
"sig doesn't have stream flag set\n");
4126 static int SigParseTest17(
void)
4138 printf(
"sig 1 invalidated: failure");
4143 printf(
"sig doesn't have packet flag set\n");
4148 printf(
"sig doesn't have stream flag set\n");
4161 static int SigParseTest18 (
void)
4169 if (
DetectEngineAppendSig(
de_ctx,
"alert tcp 1.2.3.4 any -> !1.2.3.4 any (msg:\"SigParseTest01\"; sid:99999999999999999999;)") != NULL)
4180 static int SigParseTest19 (
void)
4188 if (
DetectEngineAppendSig(
de_ctx,
"alert tcp 1.2.3.4 any -> !1.2.3.4 any (msg:\"SigParseTest01\"; sid:1; gid:99999999999999999999;)") != NULL)
4199 static int SigParseTest20 (
void)
4207 if (
DetectEngineAppendSig(
de_ctx,
"alert tcp 1.2.3.4 any -> !1.2.3.4 any (msg:\"SigParseTest01\"; sid:1; rev:99999999999999999999;)") != NULL)
4218 static int SigParseTest21 (
void)
4237 static int SigParseTest22 (
void)
4245 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)
4258 static int SigParseTest23(
void)
4273 static int SigParseBidirecTest06 (
void)
4293 static int SigParseBidirecTest07 (
void)
4313 static int SigParseBidirecTest08 (
void)
4333 static int SigParseBidirecTest09 (
void)
4353 static int SigParseBidirecTest10 (
void)
4373 static int SigParseBidirecTest11 (
void)
4393 static int SigParseBidirecTest12 (
void)
4413 static int SigParseBidirecTest13 (
void)
4432 static int SigParseBidirecTest14 (
void)
4453 static int SigTestBidirec01 (
void)
4465 if (sig->
next != NULL)
4484 static int SigTestBidirec02 (
void)
4503 if (sig->
next == NULL)
4508 if (copy->
next != NULL)
4529 static int SigTestBidirec03 (
void)
4541 const char *sigs[3];
4542 sigs[0] =
"alert tcp any any -> 192.168.1.1 any (msg:\"SigTestBidirec03 sid 1\"; sid:1;)";
4543 sigs[1] =
"alert tcp any any <> 192.168.1.1 any (msg:\"SigTestBidirec03 sid 2 bidirectional\"; sid:2;)";
4544 sigs[2] =
"alert tcp any any -> 192.168.1.1 any (msg:\"SigTestBidirec03 sid 3\"; sid:3;)";
4551 if (sig->
next == NULL)
4562 uint8_t rawpkt1_ether[] = {
4563 0x00,0x50,0x56,0xea,0x00,0xbd,0x00,0x0c,
4564 0x29,0x40,0xc8,0xb5,0x08,0x00,0x45,0x00,
4565 0x01,0xa8,0xb9,0xbb,0x40,0x00,0x40,0x06,
4566 0xe0,0xbf,0xc0,0xa8,0x1c,0x83,0xc0,0xa8,
4567 0x01,0x01,0xb9,0x0a,0x00,0x50,0x6f,0xa2,
4568 0x92,0xed,0x7b,0xc1,0xd3,0x4d,0x50,0x18,
4569 0x16,0xd0,0xa0,0x6f,0x00,0x00,0x47,0x45,
4570 0x54,0x20,0x2f,0x20,0x48,0x54,0x54,0x50,
4571 0x2f,0x31,0x2e,0x31,0x0d,0x0a,0x48,0x6f,
4572 0x73,0x74,0x3a,0x20,0x31,0x39,0x32,0x2e,
4573 0x31,0x36,0x38,0x2e,0x31,0x2e,0x31,0x0d,
4574 0x0a,0x55,0x73,0x65,0x72,0x2d,0x41,0x67,
4575 0x65,0x6e,0x74,0x3a,0x20,0x4d,0x6f,0x7a,
4576 0x69,0x6c,0x6c,0x61,0x2f,0x35,0x2e,0x30,
4577 0x20,0x28,0x58,0x31,0x31,0x3b,0x20,0x55,
4578 0x3b,0x20,0x4c,0x69,0x6e,0x75,0x78,0x20,
4579 0x78,0x38,0x36,0x5f,0x36,0x34,0x3b,0x20,
4580 0x65,0x6e,0x2d,0x55,0x53,0x3b,0x20,0x72,
4581 0x76,0x3a,0x31,0x2e,0x39,0x2e,0x30,0x2e,
4582 0x31,0x34,0x29,0x20,0x47,0x65,0x63,0x6b,
4583 0x6f,0x2f,0x32,0x30,0x30,0x39,0x30,0x39,
4584 0x30,0x32,0x31,0x37,0x20,0x55,0x62,0x75,
4585 0x6e,0x74,0x75,0x2f,0x39,0x2e,0x30,0x34,
4586 0x20,0x28,0x6a,0x61,0x75,0x6e,0x74,0x79,
4587 0x29,0x20,0x46,0x69,0x72,0x65,0x66,0x6f,
4588 0x78,0x2f,0x33,0x2e,0x30,0x2e,0x31,0x34,
4589 0x0d,0x0a,0x41,0x63,0x63,0x65,0x70,0x74,
4590 0x3a,0x20,0x74,0x65,0x78,0x74,0x2f,0x68,
4591 0x74,0x6d,0x6c,0x2c,0x61,0x70,0x70,0x6c,
4592 0x69,0x63,0x61,0x74,0x69,0x6f,0x6e,0x2f,
4593 0x78,0x68,0x74,0x6d,0x6c,0x2b,0x78,0x6d,
4594 0x6c,0x2c,0x61,0x70,0x70,0x6c,0x69,0x63,
4595 0x61,0x74,0x69,0x6f,0x6e,0x2f,0x78,0x6d,
4596 0x6c,0x3b,0x71,0x3d,0x30,0x2e,0x39,0x2c,
4597 0x2a,0x2f,0x2a,0x3b,0x71,0x3d,0x30,0x2e,
4598 0x38,0x0d,0x0a,0x41,0x63,0x63,0x65,0x70,
4599 0x74,0x2d,0x4c,0x61,0x6e,0x67,0x75,0x61,
4600 0x67,0x65,0x3a,0x20,0x65,0x6e,0x2d,0x75,
4601 0x73,0x2c,0x65,0x6e,0x3b,0x71,0x3d,0x30,
4602 0x2e,0x35,0x0d,0x0a,0x41,0x63,0x63,0x65,
4603 0x70,0x74,0x2d,0x45,0x6e,0x63,0x6f,0x64,
4604 0x69,0x6e,0x67,0x3a,0x20,0x67,0x7a,0x69,
4605 0x70,0x2c,0x64,0x65,0x66,0x6c,0x61,0x74,
4606 0x65,0x0d,0x0a,0x41,0x63,0x63,0x65,0x70,
4607 0x74,0x2d,0x43,0x68,0x61,0x72,0x73,0x65,
4608 0x74,0x3a,0x20,0x49,0x53,0x4f,0x2d,0x38,
4609 0x38,0x35,0x39,0x2d,0x31,0x2c,0x75,0x74,
4610 0x66,0x2d,0x38,0x3b,0x71,0x3d,0x30,0x2e,
4611 0x37,0x2c,0x2a,0x3b,0x71,0x3d,0x30,0x2e,
4612 0x37,0x0d,0x0a,0x4b,0x65,0x65,0x70,0x2d,
4613 0x41,0x6c,0x69,0x76,0x65,0x3a,0x20,0x33,
4614 0x30,0x30,0x0d,0x0a,0x43,0x6f,0x6e,0x6e,
4615 0x65,0x63,0x74,0x69,0x6f,0x6e,0x3a,0x20,
4616 0x6b,0x65,0x65,0x70,0x2d,0x61,0x6c,0x69,
4617 0x76,0x65,0x0d,0x0a,0x0d,0x0a };
4627 uint32_t sids[3] = {1, 2, 3};
4628 uint32_t results[3] = {1, 1, 1};
4644 static int SigTestBidirec04 (
void)
4659 sig =
DetectEngineAppendSig(
de_ctx,
"alert tcp 192.168.1.1 any <> any any (msg:\"SigTestBidirec03 sid 2 bidirectional\"; sid:2;)");
4664 if (sig->
next == NULL)
4676 if (sig->
next == NULL)
4687 uint8_t rawpkt1_ether[] = {
4688 0x00,0x50,0x56,0xea,0x00,0xbd,0x00,0x0c,
4689 0x29,0x40,0xc8,0xb5,0x08,0x00,0x45,0x00,
4690 0x01,0xa8,0xb9,0xbb,0x40,0x00,0x40,0x06,
4691 0xe0,0xbf,0xc0,0xa8,0x1c,0x83,0xc0,0xa8,
4692 0x01,0x01,0xb9,0x0a,0x00,0x50,0x6f,0xa2,
4693 0x92,0xed,0x7b,0xc1,0xd3,0x4d,0x50,0x18,
4694 0x16,0xd0,0xa0,0x6f,0x00,0x00,0x47,0x45,
4695 0x54,0x20,0x2f,0x20,0x48,0x54,0x54,0x50,
4696 0x2f,0x31,0x2e,0x31,0x0d,0x0a,0x48,0x6f,
4697 0x73,0x74,0x3a,0x20,0x31,0x39,0x32,0x2e,
4698 0x31,0x36,0x38,0x2e,0x31,0x2e,0x31,0x0d,
4699 0x0a,0x55,0x73,0x65,0x72,0x2d,0x41,0x67,
4700 0x65,0x6e,0x74,0x3a,0x20,0x4d,0x6f,0x7a,
4701 0x69,0x6c,0x6c,0x61,0x2f,0x35,0x2e,0x30,
4702 0x20,0x28,0x58,0x31,0x31,0x3b,0x20,0x55,
4703 0x3b,0x20,0x4c,0x69,0x6e,0x75,0x78,0x20,
4704 0x78,0x38,0x36,0x5f,0x36,0x34,0x3b,0x20,
4705 0x65,0x6e,0x2d,0x55,0x53,0x3b,0x20,0x72,
4706 0x76,0x3a,0x31,0x2e,0x39,0x2e,0x30,0x2e,
4707 0x31,0x34,0x29,0x20,0x47,0x65,0x63,0x6b,
4708 0x6f,0x2f,0x32,0x30,0x30,0x39,0x30,0x39,
4709 0x30,0x32,0x31,0x37,0x20,0x55,0x62,0x75,
4710 0x6e,0x74,0x75,0x2f,0x39,0x2e,0x30,0x34,
4711 0x20,0x28,0x6a,0x61,0x75,0x6e,0x74,0x79,
4712 0x29,0x20,0x46,0x69,0x72,0x65,0x66,0x6f,
4713 0x78,0x2f,0x33,0x2e,0x30,0x2e,0x31,0x34,
4714 0x0d,0x0a,0x41,0x63,0x63,0x65,0x70,0x74,
4715 0x3a,0x20,0x74,0x65,0x78,0x74,0x2f,0x68,
4716 0x74,0x6d,0x6c,0x2c,0x61,0x70,0x70,0x6c,
4717 0x69,0x63,0x61,0x74,0x69,0x6f,0x6e,0x2f,
4718 0x78,0x68,0x74,0x6d,0x6c,0x2b,0x78,0x6d,
4719 0x6c,0x2c,0x61,0x70,0x70,0x6c,0x69,0x63,
4720 0x61,0x74,0x69,0x6f,0x6e,0x2f,0x78,0x6d,
4721 0x6c,0x3b,0x71,0x3d,0x30,0x2e,0x39,0x2c,
4722 0x2a,0x2f,0x2a,0x3b,0x71,0x3d,0x30,0x2e,
4723 0x38,0x0d,0x0a,0x41,0x63,0x63,0x65,0x70,
4724 0x74,0x2d,0x4c,0x61,0x6e,0x67,0x75,0x61,
4725 0x67,0x65,0x3a,0x20,0x65,0x6e,0x2d,0x75,
4726 0x73,0x2c,0x65,0x6e,0x3b,0x71,0x3d,0x30,
4727 0x2e,0x35,0x0d,0x0a,0x41,0x63,0x63,0x65,
4728 0x70,0x74,0x2d,0x45,0x6e,0x63,0x6f,0x64,
4729 0x69,0x6e,0x67,0x3a,0x20,0x67,0x7a,0x69,
4730 0x70,0x2c,0x64,0x65,0x66,0x6c,0x61,0x74,
4731 0x65,0x0d,0x0a,0x41,0x63,0x63,0x65,0x70,
4732 0x74,0x2d,0x43,0x68,0x61,0x72,0x73,0x65,
4733 0x74,0x3a,0x20,0x49,0x53,0x4f,0x2d,0x38,
4734 0x38,0x35,0x39,0x2d,0x31,0x2c,0x75,0x74,
4735 0x66,0x2d,0x38,0x3b,0x71,0x3d,0x30,0x2e,
4736 0x37,0x2c,0x2a,0x3b,0x71,0x3d,0x30,0x2e,
4737 0x37,0x0d,0x0a,0x4b,0x65,0x65,0x70,0x2d,
4738 0x41,0x6c,0x69,0x76,0x65,0x3a,0x20,0x33,
4739 0x30,0x30,0x0d,0x0a,0x43,0x6f,0x6e,0x6e,
4740 0x65,0x63,0x74,0x69,0x6f,0x6e,0x3a,0x20,
4741 0x6b,0x65,0x65,0x70,0x2d,0x61,0x6c,0x69,
4742 0x76,0x65,0x0d,0x0a,0x0d,0x0a };
4751 memset(&th_v, 0,
sizeof(th_v));
4791 static int SigParseTestNegation01 (
void)
4805 static int SigParseTestNegation02 (
void)
4811 "alert tcp any !any -> any any (msg:\"SigTest41-02 src ip is !any \"; "
4812 "classtype:misc-activity; sid:410002; rev:1;)");
4820 static int SigParseTestNegation03 (
void)
4826 "alert tcp any any -> any [80:!80] (msg:\"SigTest41-03 dst port [80:!80] \"; "
4827 "classtype:misc-activity; sid:410003; rev:1;)");
4835 static int SigParseTestNegation04 (
void)
4846 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;)");
4861 static int SigParseTestNegation05 (
void)
4872 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;)");
4887 static int SigParseTestNegation06 (
void)
4898 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;)");
4914 static int SigParseTestNegation07 (
void)
4920 de_ctx,
"alert tcp any any -> [192.168.0.2,!192.168.0.0/24] any (sid:410006;)");
4929 static int SigParseTestNegation08 (
void)
4941 "alert tcp any any -> [192.168.0.0/16,!192.168.0.0/24] any (sid:410006; rev:1;)");
4956 static int SigParseTestMpm01 (
void)
4965 sig =
SigInit(
de_ctx,
"alert tcp any any -> any any (msg:\"mpm test\"; content:\"abcd\"; sid:1;)");
4967 printf(
"sig failed to init: ");
4972 printf(
"sig doesn't have content list: ");
4987 static int SigParseTestMpm02 (
void)
4996 sig =
SigInit(
de_ctx,
"alert tcp any any -> any any (msg:\"mpm test\"; content:\"abcd\"; content:\"abcdef\"; sid:1;)");
4998 printf(
"sig failed to init: ");
5003 printf(
"sig doesn't have content list: ");
5018 static int SigParseTestAppLayerTLS01(
void)
5029 s =
SigInit(
de_ctx,
"alert tls any any -> any any (msg:\"SigParseTestAppLayerTLS01 \"; sid:410006; rev:1;)");
5031 printf(
"parsing sig failed: ");
5036 printf(
"alproto not set: ");
5053 static int SigParseTestAppLayerTLS02(
void)
5064 s =
SigInit(
de_ctx,
"alert tls any any -> any any (msg:\"SigParseTestAppLayerTLS02 \"; tls.version:1.0; sid:410006; rev:1;)");
5066 printf(
"parsing sig failed: ");
5071 printf(
"alproto not set: ");
5087 static int SigParseTestAppLayerTLS03(
void)
5094 "alert tls any any -> any any (msg:\"SigParseTestAppLayerTLS03 \"; "
5095 "tls.version:2.5; sid:410006; rev:1;)");
5101 static int SigParseTestUnbalancedQuotes01(
void)
5107 "alert http any any -> any any (msg:\"SigParseTestUnbalancedQuotes01\"; "
5108 "pcre:\"/\\/[a-z]+\\.php\\?[a-z]+?=\\d{7}&[a-z]+?=\\d{7,8}$/U\" "
5109 "flowbits:set,et.exploitkitlanding; classtype:trojan-activity; sid:2017078; rev:5;)");
5115 static int SigParseTestContentGtDsize01(
void)
5122 "dsize:21; content:\"0123456789001234567890|00 00|\"; "
5129 static int SigParseTestContentGtDsize02(
void)
5136 "dsize:21; content:\"0123456789|00 00|\"; offset:10; "
5153 static int SigParseBidirWithSameSrcAndDest01(
void)
5170 "alert tcp [1.2.3.4, 5.6.7.8] [80, 81] <> [5.6.7.8, 1.2.3.4] [81, 80] (sid:3;)");
5179 static int SigParseBidirWithSameSrcAndDest02(
void)
5187 de_ctx,
"alert tcp 1.2.3.4 any <> [1.2.3.4, 5.6.7.8, ::1] any (sid:1;)");
5194 de_ctx,
"alert tcp [1.2.3.4, ::1] [80, 81, 82] <> [1.2.3.4, ::1] [80, 81] (sid:2;)");
5201 "alert tcp [1.2.3.4, ::1, ABCD:AAAA::1] [80] <> [1.2.3.4, ::1] [80, 81] (sid:3;)");
5208 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;)");
5215 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;)");
5224 static int SigParseTestActionReject(
void)
5230 de_ctx,
"reject tcp 1.2.3.4 any -> !1.2.3.4 any (msg:\"SigParseTest01\"; sid:1;)");
5231 #ifdef HAVE_LIBNET11
5242 static int SigParseTestActionDrop(
void)
5248 de_ctx,
"drop tcp 1.2.3.4 any -> !1.2.3.4 any (msg:\"SigParseTest01\"; sid:1;)");
5256 static int SigSetMultiAppProto(
void)
5331 static int DetectSetupDirection01(
void)
5336 char *
str = (
char *)
"to_client";
5337 FAIL_IF(DetectSetupDirection(s, &
str,
true) < 0);
5342 static int DetectSetupDirection02(
void)
5346 char *
str = (
char *)
"to_server";
5347 FAIL_IF(DetectSetupDirection(s, &
str,
true) < 0);
5349 str = (
char *)
"to_client";
5350 FAIL_IF(DetectSetupDirection(s, &
str,
true) >= 0);
5356 static int DetectSetupDirection03(
void)
5360 char *
str = (
char *)
"to_client , something";
5361 FAIL_IF(DetectSetupDirection(s, &
str,
false) < 0);
5363 str = (
char *)
"to_client,something";
5364 FAIL_IF(DetectSetupDirection(s, &
str,
false) < 0);
5370 static int DetectSetupDirection04(
void)
5375 char *
str = (
char *)
"to_client_toto";
5376 FAIL_IF(DetectSetupDirection(s, &
str,
true) >= 0);
5378 str = (
char *)
"to_client_toto";
5379 FAIL_IF(DetectSetupDirection(s, &
str,
false) < 0);
5381 str = (
char *)
"to_client,something";
5383 FAIL_IF(DetectSetupDirection(s, &
str,
true) >= 0);
5420 UtRegisterTest(
"SigParseTest21 -- address with space", SigParseTest21);
5421 UtRegisterTest(
"SigParseTest22 -- address with space", SigParseTest22);
5422 UtRegisterTest(
"SigParseTest23 -- carriage return", SigParseTest23);
5437 UtRegisterTest(
"SigParseTestNegation01", SigParseTestNegation01);
5438 UtRegisterTest(
"SigParseTestNegation02", SigParseTestNegation02);
5439 UtRegisterTest(
"SigParseTestNegation03", SigParseTestNegation03);
5440 UtRegisterTest(
"SigParseTestNegation04", SigParseTestNegation04);
5441 UtRegisterTest(
"SigParseTestNegation05", SigParseTestNegation05);
5442 UtRegisterTest(
"SigParseTestNegation06", SigParseTestNegation06);
5443 UtRegisterTest(
"SigParseTestNegation07", SigParseTestNegation07);
5444 UtRegisterTest(
"SigParseTestNegation08", SigParseTestNegation08);
5447 UtRegisterTest(
"SigParseTestAppLayerTLS01", SigParseTestAppLayerTLS01);
5448 UtRegisterTest(
"SigParseTestAppLayerTLS02", SigParseTestAppLayerTLS02);
5449 UtRegisterTest(
"SigParseTestAppLayerTLS03", SigParseTestAppLayerTLS03);
5450 UtRegisterTest(
"SigParseTestUnbalancedQuotes01", SigParseTestUnbalancedQuotes01);
5453 SigParseTestContentGtDsize01);
5455 SigParseTestContentGtDsize02);
5458 SigParseBidirWithSameSrcAndDest01);
5460 SigParseBidirWithSameSrcAndDest02);
5461 UtRegisterTest(
"SigParseTestActionReject", SigParseTestActionReject);
5462 UtRegisterTest(
"SigParseTestActionDrop", SigParseTestActionDrop);
5466 UtRegisterTest(
"DetectSetupDirection01", DetectSetupDirection01);
5467 UtRegisterTest(
"DetectSetupDirection02", DetectSetupDirection02);
5468 UtRegisterTest(
"DetectSetupDirection03", DetectSetupDirection03);
5469 UtRegisterTest(
"DetectSetupDirection04", DetectSetupDirection04);