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) {
352 if (strcmp(
str,
"all") == 0) {
364 char *xsaveptr = NULL;
365 char *key = strtok_r(copy,
",", &xsaveptr);
366 while (key != NULL) {
372 "argument '%s' not found",
375 key = strtok_r(NULL,
",", &xsaveptr);
402 SCLogDebug(
"s:%p new:%p list:%d: %s, s->init_data->list_set %s s->init_data->list %d", s,
new,
436 SCLogDebug(
"reusing buffer %u as it isn't multi-capable", x);
446 SCLogError(
"failed to expand rule buffer array");
476 SCLogDebug(
"appended %s to list %d, rule pos %u (s->init_data->list %d)",
495 if (sm->
prev != NULL)
497 if (sm->
next != NULL)
539 if (sm_last == NULL || sm_new->
idx > sm_last->
idx)
551 if (sm_last == NULL || sm_new->
idx > sm_last->
idx)
573 SCLogDebug(
"skip x %u s->init_data->list %d (int)s->init_data->buffers[x].id %d", x,
582 for (sm_type = va_arg(ap,
int); sm_type != -1; sm_type = va_arg(ap,
int)) {
586 if (sm_last == NULL || sm_new->
idx > sm_last->
idx)
603 for (sm_type = va_arg(ap,
int); sm_type != -1; sm_type = va_arg(ap,
int))
608 if (sm_last == NULL || sm_new->
idx > sm_last->
idx)
633 va_start(ap, sm_list);
635 for (sm_type = va_arg(ap,
int); sm_type != -1; sm_type = va_arg(ap,
int))
637 sm_new = SigMatchGetLastSMByType(sm_list, sm_type);
640 if (sm_last == NULL || sm_new->
idx > sm_last->
idx)
671 va_start(ap, list_id);
673 for (sm_type = va_arg(ap,
int); sm_type != -1; sm_type = va_arg(ap,
int)) {
677 if (sm_last == NULL || sm_new->
idx > sm_last->
idx)
689 va_start(ap, list_id);
691 for (sm_type = va_arg(ap,
int); sm_type != -1; sm_type = va_arg(ap,
int)) {
692 sm_new = SigMatchGetLastSMByType(sm_list, sm_type);
695 if (sm_last == NULL || sm_new->
idx > sm_last->
idx)
718 if (sm_last == NULL || sm_new->
idx > sm_last->
idx)
726 if (sm_last == NULL || sm_new->
idx > sm_last->
idx)
733 static void SigMatchTransferSigMatchAcrossLists(
SigMatch *sm,
739 if (sm->
prev != NULL)
741 if (sm->
next != NULL)
744 if (sm == *src_sm_list)
745 *src_sm_list = sm->
next;
746 if (sm == *src_sm_list_tail)
747 *src_sm_list_tail = sm->
prev;
749 if (*dst_sm_list == NULL) {
751 *dst_sm_list_tail = sm;
759 *dst_sm_list_tail = sm;
786 SCLogError(
"Unable to find the sm in any of the "
800 static int DetectSetupDirection(
Signature *s,
char **
str,
bool only_dir)
803 if (strncmp(*
str,
"to_client", strlen(
"to_client")) == 0) {
804 *
str += strlen(
"to_client");
806 while (**
str && isblank(**
str)) {
812 SCLogError(
"unknown option: only accepts to_server or to_client");
822 while (**
str && isblank(**
str)) {
834 }
else if (strncmp(*
str,
"to_server", strlen(
"to_server")) == 0) {
835 *
str += strlen(
"to_server");
837 while (**
str && isblank(**
str)) {
843 SCLogError(
"unknown option: only accepts to_server or to_client");
853 while (**
str && isblank(**
str)) {
865 }
else if (only_dir) {
866 SCLogError(
"unknown option: only accepts to_server or to_client");
873 size_t output_size,
bool requires)
876 char *optname = NULL;
877 char *optvalue = NULL;
880 while (isblank(*optstr)) {
885 char *optend = optstr;
887 optend = strchr(optend,
';');
888 if (optend == NULL) {
892 else if (optend > optstr && *(optend -1 ) ==
'\\') {
901 char *optvalptr = strchr(optstr,
':');
903 *(optvalptr++) =
'\0';
906 for (
size_t i = strlen(optvalptr); i > 0; i--) {
907 if (isblank(optvalptr[i - 1])) {
908 optvalptr[i - 1] =
'\0';
914 optvalue = optvalptr;
918 for (
size_t i = strlen(optstr); i > 0; i--) {
919 if (isblank(optstr[i - 1])) {
920 optstr[i - 1] =
'\0';
929 bool requires_only = strcasecmp(optname,
"requires") == 0 || strcasecmp(optname,
"sid") == 0;
930 if ((requires && !requires_only) || (!requires && requires_only)) {
935 st = SigTableGet(optname);
936 if (st == NULL || st->
Setup == NULL) {
937 SCLogError(
"unknown rule keyword '%s'.", optname);
942 if (optvalue == NULL || strlen(optvalue) == 0) {
944 "invalid formatting or malformed option to %s keyword: '%s'", optname, optstr);
948 if (optvalue && strlen(optvalue)) {
949 SCLogError(
"unexpected option to %s keyword: '%s'", optname, optstr);
959 #define URL "https://suricata.io/our-story/deprecation-policy/"
962 "and will be removed soon. See %s",
966 "and will be removed soon. Use '%s' instead. "
975 if (optvalue != NULL && strlen(optvalue) > 0) {
976 size_t ovlen = strlen(optvalue);
977 char *ptr = optvalue;
987 SCLogError(
"invalid formatting or malformed option to %s keyword: \'%s\'", optname,
993 SCLogWarning(
"keyword \'%s\' has not been tested for firewall rules", optname);
1010 SCLogError(
"invalid formatting or malformed option to %s keyword: \'%s\'", optname,
1016 SCLogError(
"invalid formatting to %s keyword: "
1017 "value must be double quoted \'%s\'",
1023 && ovlen && *ptr ==
'"')
1025 for (; ovlen > 0; ovlen--) {
1026 if (isblank(ptr[ovlen - 1])) {
1027 ptr[ovlen - 1] =
'\0';
1032 if (ovlen && ptr[ovlen - 1] !=
'"') {
1033 SCLogError(
"bad option value formatting (possible missing semicolon) "
1034 "for keyword %s: \'%s\'",
1042 ptr[ovlen - 1] =
'\0';
1047 "for keyword %s: \'%s\'",
1054 "quotes on %s keyword that doesn't support them: \'%s\'", optname, optstr);
1072 if (setup_ret < 0) {
1076 if (setup_ret == -2) {
1088 if (strlen(optend) > 0) {
1089 strlcpy(output, optend, output_size);
1104 Signature *s,
const char *addrstr,
char flag)
1106 SCLogDebug(
"Address Group \"%s\" to be parsed now", addrstr);
1110 if (strcasecmp(addrstr,
"any") == 0)
1118 if (strcasecmp(addrstr,
"any") == 0)
1133 static bool IsBuiltIn(
const char *n)
1135 if (strcmp(n,
"request_started") == 0 || strcmp(n,
"response_started") == 0) {
1138 if (strcmp(n,
"request_complete") == 0 || strcmp(n,
"response_complete") == 0) {
1156 if (strcmp(alproto_name,
"http") == 0)
1157 alproto_name =
"http1";
1158 SCLogDebug(
"alproto %u/%s", a, alproto_name);
1160 const int max_progress_ts =
1162 const int max_progress_tc =
1165 char ts_tx_started[64];
1166 snprintf(ts_tx_started,
sizeof(ts_tx_started),
"%s:request_started:generic", alproto_name);
1169 SCLogDebug(
"- hook %s:%s list %s (%u)", alproto_name,
"request_name", ts_tx_started,
1170 (uint32_t)strlen(ts_tx_started));
1172 char tc_tx_started[64];
1173 snprintf(tc_tx_started,
sizeof(tc_tx_started),
"%s:response_started:generic", alproto_name);
1176 SCLogDebug(
"- hook %s:%s list %s (%u)", alproto_name,
"response_name", tc_tx_started,
1177 (uint32_t)strlen(tc_tx_started));
1179 char ts_tx_complete[64];
1180 snprintf(ts_tx_complete,
sizeof(ts_tx_complete),
"%s:request_complete:generic",
1184 SCLogDebug(
"- hook %s:%s list %s (%u)", alproto_name,
"request_name", ts_tx_complete,
1185 (uint32_t)strlen(ts_tx_complete));
1187 char tc_tx_complete[64];
1188 snprintf(tc_tx_complete,
sizeof(tc_tx_complete),
"%s:response_complete:generic",
1192 SCLogDebug(
"- hook %s:%s list %s (%u)", alproto_name,
"response_name", tc_tx_complete,
1193 (uint32_t)strlen(tc_tx_complete));
1195 for (
int p = 0; p <= max_progress_ts; p++) {
1197 IPPROTO_TCP , a, p, STREAM_TOSERVER);
1198 if (
name != NULL && !IsBuiltIn(
name)) {
1200 snprintf(list_name,
sizeof(list_name),
"%s:%s:generic", alproto_name,
name);
1201 SCLogDebug(
"- hook %s:%s list %s (%u)", alproto_name,
name, list_name,
1202 (uint32_t)strlen(list_name));
1208 for (
int p = 0; p <= max_progress_tc; p++) {
1210 IPPROTO_TCP , a, p, STREAM_TOCLIENT);
1211 if (
name != NULL && !IsBuiltIn(
name)) {
1213 snprintf(list_name,
sizeof(list_name),
"%s:%s:generic", alproto_name,
name);
1214 SCLogDebug(
"- hook %s:%s list %s (%u)", alproto_name,
name, list_name,
1215 (uint32_t)strlen(list_name));
1241 if (strcmp(
str,
"flow_start") == 0) {
1243 }
else if (strcmp(
str,
"pre_flow") == 0) {
1245 }
else if (strcmp(
str,
"pre_stream") == 0) {
1247 }
else if (strcmp(
str,
"all") == 0) {
1260 return "flow_start";
1264 return "pre_stream";
1276 .t.pkt.ph = HookPktFromString(hook_str),
1284 static int SigParseProtoHookPkt(
Signature *s,
const char *proto_hook,
const char *p,
const char *h)
1297 SCLogDebug(
"protocol:%s hook:%s: type:%s parsed hook:%s", p, h,
1307 .t.app.alproto = alproto,
1308 .t.app.app_progress = progress,
1316 static int SigParseProtoHookApp(
Signature *s,
const char *proto_hook,
const char *p,
const char *h)
1318 if (strcmp(h,
"request_started") == 0) {
1322 }
else if (strcmp(h,
"response_started") == 0) {
1326 }
else if (strcmp(h,
"request_complete") == 0) {
1330 }
else if (strcmp(h,
"response_complete") == 0) {
1336 IPPROTO_TCP , s->
alproto, h, STREAM_TOSERVER);
1337 if (progress_ts >= 0) {
1342 IPPROTO_TCP , s->
alproto, h, STREAM_TOCLIENT);
1343 if (progress_tc < 0) {
1351 char generic_hook_name[64];
1352 snprintf(generic_hook_name,
sizeof(generic_hook_name),
"%s:generic", proto_hook);
1355 SCLogError(
"no list registered as %s for hook %s", generic_hook_name, proto_hook);
1360 SCLogDebug(
"protocol:%s hook:%s: type:%s alproto:%u hook:%d", p, h,
1370 printf(
"=========Supported Rule Protocols=========\n");
1387 static int SigParseProto(
Signature *s,
const char *protostr)
1390 if (strlen(protostr) > 32)
1395 const char *p =
proto;
1396 const char *h = NULL;
1398 bool has_hook = strchr(
proto,
':') != NULL;
1400 char *xsaveptr = NULL;
1401 p = strtok_r(
proto,
":", &xsaveptr);
1402 h = strtok_r(NULL,
":", &xsaveptr);
1420 if (SigParseProtoHookApp(s, protostr, p, h) < 0) {
1421 SCLogError(
"protocol \"%s\" does not support hook \"%s\"", p, h);
1428 "in a signature. Either detection for this protocol "
1429 "is not yet supported OR detection has been disabled for "
1430 "protocol through the yaml option "
1431 "app-layer.protocols.%s.detection-enabled",
1435 }
else if (h != NULL) {
1436 SCLogDebug(
"non-app-layer rule with %s:%s", p, h);
1438 if (SigParseProtoHookPkt(s, protostr, p, h) < 0) {
1439 SCLogError(
"protocol \"%s\" does not support hook \"%s\"", p, h);
1468 Signature *s,
const char *portstr,
char flag)
1474 SCLogDebug(
"Port group \"%s\" to be parsed", portstr);
1477 if (strcasecmp(portstr,
"any") == 0)
1481 }
else if (flag == 1) {
1482 if (strcasecmp(portstr,
"any") == 0)
1497 static int SigParseActionRejectValidate(
const char *action)
1499 #ifdef HAVE_LIBNET11
1500 #if defined HAVE_LIBCAP_NG && !defined HAVE_LIBNET_CAPABILITIES
1503 "incompatible with POSIX based capabilities with privs dropping. "
1504 "For rejects to work, run as root/super user.");
1510 "required for action \"%s\" but is not compiled into Suricata",
1520 static uint8_t ActionStringToFlags(
const char *action)
1522 if (strcasecmp(action,
"alert") == 0) {
1524 }
else if (strcasecmp(action,
"drop") == 0) {
1526 }
else if (strcasecmp(action,
"pass") == 0) {
1528 }
else if (strcasecmp(action,
"reject") == 0 ||
1529 strcasecmp(action,
"rejectsrc") == 0)
1531 if (!(SigParseActionRejectValidate(action)))
1534 }
else if (strcasecmp(action,
"rejectdst") == 0) {
1535 if (!(SigParseActionRejectValidate(action)))
1538 }
else if (strcasecmp(action,
"rejectboth") == 0) {
1539 if (!(SigParseActionRejectValidate(action)))
1542 }
else if (strcasecmp(action,
"config") == 0) {
1544 }
else if (strcasecmp(action,
"accept") == 0) {
1547 SCLogError(
"An invalid action \"%s\" was given", action);
1563 static int SigParseAction(
Signature *s,
const char *action_in)
1566 strlcpy(action, action_in,
sizeof(action));
1567 const char *a = action;
1568 const char *o = NULL;
1570 bool has_scope = strchr(action,
':') != NULL;
1572 char *xsaveptr = NULL;
1573 a = strtok_r(action,
":", &xsaveptr);
1574 o = strtok_r(NULL,
":", &xsaveptr);
1578 SCLogError(
"invalid protocol specification '%s'", action_in);
1582 uint8_t
flags = ActionStringToFlags(a);
1588 uint8_t scope_flags = 0;
1590 if (strcmp(o,
"packet") == 0) {
1592 }
else if (strcmp(o,
"flow") == 0) {
1595 SCLogError(
"invalid action scope '%s' in action '%s': only 'packet' and 'flow' "
1602 if (strcmp(o,
"packet") == 0) {
1604 }
else if (strcmp(o,
"hook") == 0) {
1606 }
else if (strcmp(o,
"tx") == 0) {
1608 }
else if (strcmp(o,
"flow") == 0) {
1612 "invalid action scope '%s' in action '%s': only 'packet', 'flow', 'tx' and "
1619 if (strcmp(o,
"packet") == 0) {
1622 SCLogError(
"invalid action scope '%s' in action '%s': only 'packet' allowed", o,
1628 SCLogError(
"invalid action scope '%s' in action '%s': scope only supported for actions "
1629 "'drop', 'pass' and 'reject'",
1637 SCLogError(
"firewall rules require setting an explicit action scope");
1642 SCLogError(
"'accept' action only supported for firewall rules");
1647 SCLogError(
"'pass' action not supported for firewall rules");
1666 static inline int SigParseToken(
char **input,
char *output,
1667 const size_t output_size)
1669 size_t len = *input == NULL ? 0 : strlen(*input);
1675 while (
len && isblank(**input)) {
1680 char *endptr = strpbrk(*input,
" \t\n\r");
1681 if (endptr != NULL) {
1684 strlcpy(output, *input, output_size);
1701 static inline int SigParseList(
char **input,
char *output,
1702 const size_t output_size)
1705 size_t len = *input != NULL ? strlen(*input) : 0;
1711 while (
len && isblank(**input)) {
1717 for (i = 0; i <
len; i++) {
1718 char c = (*input)[i];
1721 }
else if (c ==
']') {
1723 }
else if (c ==
' ') {
1734 strlcpy(output, *input, output_size);
1735 *input = *input + i + 1;
1755 SigParseToken(&index, parser->
action,
sizeof(parser->
action));
1761 SigParseList(&index, parser->
src,
sizeof(parser->
src));
1764 SigParseList(&index, parser->
sp,
sizeof(parser->
sp));
1770 SigParseList(&index, parser->
dst,
sizeof(parser->
dst));
1773 SigParseList(&index, parser->
dp,
sizeof(parser->
dp));
1776 if (index == NULL) {
1780 while (isspace(*index) || *index ==
'(') {
1783 for (
size_t i = strlen(index); i > 0; i--) {
1784 if (isspace(index[i - 1]) || index[i - 1] ==
')') {
1785 index[i - 1] =
'\0';
1797 if (SigParseAction(s, parser->
action) < 0)
1800 if (SigParseProto(s, parser->
protocol) < 0)
1803 if (strcmp(parser->
direction,
"<>") == 0) {
1805 }
else if (strcmp(parser->
direction,
"=>") == 0) {
1807 SCLogError(
"transactional bidirectional rules not supported for firewall rules");
1812 }
else if (strcmp(parser->
direction,
"->") != 0) {
1813 SCLogError(
"\"%s\" is not a valid direction modifier, "
1814 "\"->\" and \"<>\" are supported.",
1841 static inline bool CheckAscii(
const char *
str)
1843 for (
size_t i = 0; i < strlen(
str); i++) {
1844 if (
str[i] < 0x20) {
1846 if (
str[i] == 0x0a ||
str[i] == 0x0d ||
str[i] == 0x09) {
1850 }
else if (
str[i] == 0x7f) {
1874 if (!SCCheckUtf8(sigstr)) {
1879 if (!CheckAscii(sigstr)) {
1880 SCLogError(
"rule contains invalid (control) characters");
1884 int ret = SigParseBasics(
de_ctx, s, sigstr, parser, addrs_direction, requires);
1891 if (strlen(parser->
opts) > 0) {
1892 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)
4821 s =
SigInit(
de_ctx,
"alert tcp any !any -> any any (msg:\"SigTest41-02 src ip is !any \"; classtype:misc-activity; sid:410002; rev:1;)");
4836 static int SigParseTestNegation03 (
void)
4847 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;)");
4862 static int SigParseTestNegation04 (
void)
4873 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;)");
4888 static int SigParseTestNegation05 (
void)
4899 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;)");
4914 static int SigParseTestNegation06 (
void)
4925 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;)");
4941 static int SigParseTestNegation07 (
void)
4947 de_ctx,
"alert tcp any any -> [192.168.0.2,!192.168.0.0/24] any (sid:410006;)");
4956 static int SigParseTestNegation08 (
void)
4968 "alert tcp any any -> [192.168.0.0/16,!192.168.0.0/24] any (sid:410006; rev:1;)");
4983 static int SigParseTestMpm01 (
void)
4992 sig =
SigInit(
de_ctx,
"alert tcp any any -> any any (msg:\"mpm test\"; content:\"abcd\"; sid:1;)");
4994 printf(
"sig failed to init: ");
4999 printf(
"sig doesn't have content list: ");
5014 static int SigParseTestMpm02 (
void)
5023 sig =
SigInit(
de_ctx,
"alert tcp any any -> any any (msg:\"mpm test\"; content:\"abcd\"; content:\"abcdef\"; sid:1;)");
5025 printf(
"sig failed to init: ");
5030 printf(
"sig doesn't have content list: ");
5045 static int SigParseTestAppLayerTLS01(
void)
5056 s =
SigInit(
de_ctx,
"alert tls any any -> any any (msg:\"SigParseTestAppLayerTLS01 \"; sid:410006; rev:1;)");
5058 printf(
"parsing sig failed: ");
5063 printf(
"alproto not set: ");
5080 static int SigParseTestAppLayerTLS02(
void)
5091 s =
SigInit(
de_ctx,
"alert tls any any -> any any (msg:\"SigParseTestAppLayerTLS02 \"; tls.version:1.0; sid:410006; rev:1;)");
5093 printf(
"parsing sig failed: ");
5098 printf(
"alproto not set: ");
5114 static int SigParseTestAppLayerTLS03(
void)
5125 s =
SigInit(
de_ctx,
"alert tls any any -> any any (msg:\"SigParseTestAppLayerTLS03 \"; tls.version:2.5; sid:410006; rev:1;)");
5138 static int SigParseTestUnbalancedQuotes01(
void)
5144 "alert http any any -> any any (msg:\"SigParseTestUnbalancedQuotes01\"; "
5145 "pcre:\"/\\/[a-z]+\\.php\\?[a-z]+?=\\d{7}&[a-z]+?=\\d{7,8}$/U\" "
5146 "flowbits:set,et.exploitkitlanding; classtype:trojan-activity; sid:2017078; rev:5;)");
5152 static int SigParseTestContentGtDsize01(
void)
5159 "dsize:21; content:\"0123456789001234567890|00 00|\"; "
5166 static int SigParseTestContentGtDsize02(
void)
5173 "dsize:21; content:\"0123456789|00 00|\"; offset:10; "
5190 static int SigParseBidirWithSameSrcAndDest01(
void)
5207 "alert tcp [1.2.3.4, 5.6.7.8] [80, 81] <> [5.6.7.8, 1.2.3.4] [81, 80] (sid:3;)");
5216 static int SigParseBidirWithSameSrcAndDest02(
void)
5224 de_ctx,
"alert tcp 1.2.3.4 any <> [1.2.3.4, 5.6.7.8, ::1] any (sid:1;)");
5231 de_ctx,
"alert tcp [1.2.3.4, ::1] [80, 81, 82] <> [1.2.3.4, ::1] [80, 81] (sid:2;)");
5238 "alert tcp [1.2.3.4, ::1, ABCD:AAAA::1] [80] <> [1.2.3.4, ::1] [80, 81] (sid:3;)");
5245 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;)");
5252 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;)");
5261 static int SigParseTestActionReject(
void)
5267 de_ctx,
"reject tcp 1.2.3.4 any -> !1.2.3.4 any (msg:\"SigParseTest01\"; sid:1;)");
5268 #ifdef HAVE_LIBNET11
5279 static int SigParseTestActionDrop(
void)
5285 de_ctx,
"drop tcp 1.2.3.4 any -> !1.2.3.4 any (msg:\"SigParseTest01\"; sid:1;)");
5293 static int SigSetMultiAppProto(
void)
5368 static int DetectSetupDirection01(
void)
5373 char *
str = (
char *)
"to_client";
5374 FAIL_IF(DetectSetupDirection(s, &
str,
true) < 0);
5379 static int DetectSetupDirection02(
void)
5383 char *
str = (
char *)
"to_server";
5384 FAIL_IF(DetectSetupDirection(s, &
str,
true) < 0);
5386 str = (
char *)
"to_client";
5387 FAIL_IF(DetectSetupDirection(s, &
str,
true) >= 0);
5393 static int DetectSetupDirection03(
void)
5397 char *
str = (
char *)
"to_client , something";
5398 FAIL_IF(DetectSetupDirection(s, &
str,
false) < 0);
5400 str = (
char *)
"to_client,something";
5401 FAIL_IF(DetectSetupDirection(s, &
str,
false) < 0);
5407 static int DetectSetupDirection04(
void)
5412 char *
str = (
char *)
"to_client_toto";
5413 FAIL_IF(DetectSetupDirection(s, &
str,
true) >= 0);
5415 str = (
char *)
"to_client_toto";
5416 FAIL_IF(DetectSetupDirection(s, &
str,
false) < 0);
5418 str = (
char *)
"to_client,something";
5420 FAIL_IF(DetectSetupDirection(s, &
str,
true) >= 0);
5457 UtRegisterTest(
"SigParseTest21 -- address with space", SigParseTest21);
5458 UtRegisterTest(
"SigParseTest22 -- address with space", SigParseTest22);
5459 UtRegisterTest(
"SigParseTest23 -- carriage return", SigParseTest23);
5474 UtRegisterTest(
"SigParseTestNegation01", SigParseTestNegation01);
5475 UtRegisterTest(
"SigParseTestNegation02", SigParseTestNegation02);
5476 UtRegisterTest(
"SigParseTestNegation03", SigParseTestNegation03);
5477 UtRegisterTest(
"SigParseTestNegation04", SigParseTestNegation04);
5478 UtRegisterTest(
"SigParseTestNegation05", SigParseTestNegation05);
5479 UtRegisterTest(
"SigParseTestNegation06", SigParseTestNegation06);
5480 UtRegisterTest(
"SigParseTestNegation07", SigParseTestNegation07);
5481 UtRegisterTest(
"SigParseTestNegation08", SigParseTestNegation08);
5484 UtRegisterTest(
"SigParseTestAppLayerTLS01", SigParseTestAppLayerTLS01);
5485 UtRegisterTest(
"SigParseTestAppLayerTLS02", SigParseTestAppLayerTLS02);
5486 UtRegisterTest(
"SigParseTestAppLayerTLS03", SigParseTestAppLayerTLS03);
5487 UtRegisterTest(
"SigParseTestUnbalancedQuotes01", SigParseTestUnbalancedQuotes01);
5490 SigParseTestContentGtDsize01);
5492 SigParseTestContentGtDsize02);
5495 SigParseBidirWithSameSrcAndDest01);
5497 SigParseBidirWithSameSrcAndDest02);
5498 UtRegisterTest(
"SigParseTestActionReject", SigParseTestActionReject);
5499 UtRegisterTest(
"SigParseTestActionDrop", SigParseTestActionDrop);
5503 UtRegisterTest(
"DetectSetupDirection01", DetectSetupDirection01);
5504 UtRegisterTest(
"DetectSetupDirection02", DetectSetupDirection02);
5505 UtRegisterTest(
"DetectSetupDirection03", DetectSetupDirection03);
5506 UtRegisterTest(
"DetectSetupDirection04", DetectSetupDirection04);