Go to the documentation of this file.
42 #define PARSE_REGEX "^\\s*(\"\\s*)?([0-9]+)(\\s*\")?\\s*$"
50 static void DetectIcmpIdRegisterTests(
void);
54 static bool PrefilterIcmpIdIsPrefilterable(
const Signature *s);
76 static inline bool GetIcmpId(
Packet *p, uint16_t *
id)
79 if (PacketIsICMPv4(p)) {
89 SCLogDebug(
"ICMPV4_GET_ID(p) %"PRIu16
" (network byte order), "
99 }
else if (PacketIsICMPv6(p)) {
103 SCLogDebug(
"ICMPV6_GET_ID(p) %"PRIu16
" (network byte order), "
138 if (!GetIcmpId(p, &pid))
160 char *substr[3] = {NULL, NULL, NULL};
164 pcre2_match_data *match = NULL;
166 if (ret < 1 || ret > 4) {
173 for (i = 1; i < ret; i++) {
176 SCLogError(
"pcre2_substring_get_bynumber failed");
179 substr[i-1] = (
char *)str_ptr;
187 if (substr[0]!= NULL && strlen(substr[0]) != 0) {
188 if (substr[2] == NULL) {
193 if (substr[2] != NULL) {
208 for (i = 0; i < 3; i++) {
209 if (substr[i] != NULL)
210 pcre2_substring_free((PCRE2_UCHAR8 *)substr[i]);
212 pcre2_match_data_free(match);
217 pcre2_match_data_free(match);
219 for (i = 0; i < 3; i++) {
220 if (substr[i] != NULL)
221 pcre2_substring_free((PCRE2_UCHAR8 *)substr[i]);
242 iid = DetectIcmpIdParse(
de_ctx, icmpidstr);
243 if (iid == NULL)
goto error;
279 if (!GetIcmpId(p, &pid))
282 if (pid ==
ctx->v1.u16[0])
285 PrefilterAddSids(&det_ctx->
pmq,
ctx->sigs_array,
ctx->sigs_cnt);
300 if (v.
u16[0] == a->
id)
308 PrefilterPacketIcmpIdSet, PrefilterPacketIcmpIdCompare, PrefilterPacketIcmpIdMatch);
311 static bool PrefilterIcmpIdIsPrefilterable(
const Signature *s)
330 static int DetectIcmpIdParseTest01 (
void)
343 static int DetectIcmpIdParseTest02 (
void)
356 static int DetectIcmpIdParseTest03 (
void)
369 static int DetectIcmpIdParseTest04 (
void)
382 static int DetectIcmpIdParseTest05 (
void)
394 static int DetectIcmpIdMatchTest01 (
void)
419 s = s->
next =
SigInit(
de_ctx,
"alert icmp any any -> any any (icmp_id:21782; sid:2;)");
429 printf(
"sid 1 did not alert, but should have: ");
432 printf(
"sid 2 alerted, but should not have: ");
455 static int DetectIcmpIdMatchTest02 (
void)
459 uint8_t raw_icmpv4[] = {
460 0x0b, 0x00, 0x8a, 0xdf, 0x00, 0x00, 0x00, 0x00,
461 0x45, 0x00, 0x00, 0x14, 0x25, 0x0c, 0x00, 0x00,
462 0xff, 0x11, 0x00, 0x00, 0x85, 0x64, 0xea, 0x5b,
463 0x51, 0xa6, 0xbb, 0x35, 0x59, 0x8a, 0x5a, 0xe2,
464 0x00, 0x14, 0x00, 0x00 };
475 memset(&ip4h, 0,
sizeof(
IPV4Hdr));
481 p->
src.addr_data32[0] = 0x01020304;
482 p->
dst.addr_data32[0] = 0x04030201;
484 ip4h.s_ip_src.s_addr = p->
src.addr_data32[0];
485 ip4h.s_ip_dst.s_addr = p->
dst.addr_data32[0];
507 printf(
"sid 1 alerted, but should not have: ");
524 static void DetectIcmpIdRegisterTests (
void)
526 UtRegisterTest(
"DetectIcmpIdParseTest01", DetectIcmpIdParseTest01);
527 UtRegisterTest(
"DetectIcmpIdParseTest02", DetectIcmpIdParseTest02);
528 UtRegisterTest(
"DetectIcmpIdParseTest03", DetectIcmpIdParseTest03);
529 UtRegisterTest(
"DetectIcmpIdParseTest04", DetectIcmpIdParseTest04);
530 UtRegisterTest(
"DetectIcmpIdParseTest05", DetectIcmpIdParseTest05);
531 UtRegisterTest(
"DetectIcmpIdMatchTest01", DetectIcmpIdMatchTest01);
532 UtRegisterTest(
"DetectIcmpIdMatchTest02", DetectIcmpIdMatchTest02);
#define FAIL_IF_NULL(expr)
Fail a test if expression evaluates to NULL.
#define SIG_MASK_REQUIRE_REAL_PKT
struct SigMatch_ * smlists[DETECT_SM_LIST_MAX]
#define ICMP_INFO_REQUEST
SigTableElmt * sigmatch_table
void(* Free)(DetectEngineCtx *, void *)
Container for matching data for a signature group.
void UtRegisterTest(const char *name, int(*TestFn)(void))
Register unit test.
int PacketAlertCheck(Packet *p, uint32_t sid)
Check if a certain sid alerted, this is used in the test functions.
void UTHSetIPV4Hdr(Packet *p, IPV4Hdr *ip4h)
main detection engine ctx
int StringParseUint16(uint16_t *res, int base, size_t len, const char *str)
void DetectEngineCtxFree(DetectEngineCtx *)
Free a DetectEngineCtx::
Packet * UTHBuildPacket(uint8_t *payload, uint16_t payload_len, uint8_t ipproto)
UTHBuildPacket is a wrapper that build packets with default ip and port fields.
void SigMatchSignatures(ThreadVars *tv, DetectEngineCtx *de_ctx, DetectEngineThreadCtx *det_ctx, Packet *p)
wrapper for old tests
int DetectParsePcreExec(DetectParseRegex *parse_regex, pcre2_match_data **match, const char *str, int start_offset, int options)
struct Packet_::@33::@40 icmp_s
int(* Setup)(DetectEngineCtx *, Signature *, const char *)
#define FAIL_IF_NOT(expr)
Fail a test if expression evaluates to false.
#define ICMP6_ECHO_REQUEST
int(* SetupPrefilter)(DetectEngineCtx *de_ctx, struct SigGroupHead_ *sgh)
#define ICMP_ADDRESSREPLY
void FlowInitConfig(bool quiet)
initialize the configuration
#define FAIL_IF_NOT_NULL(expr)
Fail a test if expression evaluates to non-NULL.
#define PASS
Pass the test.
void DetectSetupParseRegexes(const char *parse_str, DetectParseRegex *detect_parse)
void DetectIcmpIdRegister(void)
Registration function for icode: icmp_id.
SigMatch * SCSigMatchAppendSMToList(DetectEngineCtx *de_ctx, Signature *s, uint16_t type, SigMatchCtx *ctx, const int list)
Append a SigMatch to the list type.
Per thread variable structure.
TmEcode DetectEngineThreadCtxInit(ThreadVars *tv, void *initdata, void **data)
initialize thread specific detection engine context
void PacketFree(Packet *p)
Return a malloced packet.
int SC_Pcre2SubstringGet(pcre2_match_data *match_data, uint32_t number, PCRE2_UCHAR **bufferptr, PCRE2_SIZE *bufflen)
Signature * SigInit(DetectEngineCtx *de_ctx, const char *sigstr)
Parses a signature and adds it to the Detection Engine Context.
SignatureInitData * init_data
int PrefilterSetupPacketHeader(DetectEngineCtx *de_ctx, SigGroupHead *sgh, int sm_type, SignatureMask mask, void(*Set)(PrefilterPacketHeaderValue *v, void *), bool(*Compare)(PrefilterPacketHeaderValue v, void *), void(*Match)(DetectEngineThreadCtx *det_ctx, Packet *p, const void *pectx))
int(* Match)(DetectEngineThreadCtx *, Packet *, const Signature *, const SigMatchCtx *)
int SigGroupBuild(DetectEngineCtx *de_ctx)
Convert the signature list into the runtime match structure.
Used to start a pointer to SigMatch context Should never be dereferenced without casting to something...
void FlowShutdown(void)
shutdown the flow engine
TmEcode DetectEngineThreadCtxDeinit(ThreadVars *tv, void *data)
Packet * PacketGetFromAlloc(void)
Get a malloced packet.
#define SCLogError(...)
Macro used to log ERROR messages.
Structure to hold thread specific data for all decode modules.
bool(* SupportsPrefilter)(const Signature *s)
a single match condition for a signature
void DetectIcmpIdFree(DetectEngineCtx *, void *)
this function will free memory associated with DetectIcmpIdData
#define ICMP_TIMESTAMPREPLY
#define ICMPV6_GET_TYPE(icmp6h)
DetectEngineCtx * DetectEngineCtxInit(void)
void StatsThreadCleanup(ThreadVars *tv)
union PacketL4::L4Vars vars
void(* RegisterTests)(void)
int DecodeICMPV4(ThreadVars *tv, DecodeThreadVars *dtv, Packet *p, const uint8_t *pkt, uint32_t len)
Main ICMPv4 decoding function.
#define SIG_FLAG_REQUIRE_PACKET
void UTHFreePackets(Packet **p, int numpkts)
UTHFreePackets: function to release the allocated data from UTHBuildPacket and the packet itself.