Go to the documentation of this file.
65 static void XBitsRegisterTests(
void);
147 return DetectIPPairbitMatchIsset(
p,xd);
149 return DetectIPPairbitMatchIsnotset(
p,xd);
151 return DetectIPPairbitMatchSet(
p,xd);
153 return DetectIPPairbitMatchUnset(
p,xd);
155 return DetectIPPairbitMatchToggle(
p,xd);
171 static int DetectXbitPostMatchTx(
183 SCLogDebug(
"sid %u: post-match SET for bit %u on tx:%" PRIu64
", txd:%p", s->
id, xd->
idx,
184 det_ctx->
tx_id, txd);
210 return DetectXbitPostMatchTx(det_ctx,
p, s, fd);
245 bool cmd_set =
false;
246 bool name_set =
false;
247 bool track_set =
false;
248 bool expire_set =
false;
255 char copy[strlen(rawstr) + 1];
256 strlcpy(copy, rawstr,
sizeof(copy));
257 char *context = NULL;
258 char *token = strtok_r(copy,
",", &context);
259 while (token != NULL) {
260 while (*token !=
'\0' && isblank(*token)) {
263 char *val = strchr(token,
' ');
266 while (*val !=
'\0' && isblank(*val)) {
272 if (strlen(token) == 0) {
275 if (strcmp(token,
"noalert") == 0 && !cmd_set) {
276 if (strtok_r(NULL,
",", &context) != NULL) {
279 if (val && strlen(val) != 0) {
286 if (val && strlen(val) != 0) {
289 if (strcmp(token,
"set") == 0) {
291 }
else if (strcmp(token,
"isset") == 0) {
293 }
else if (strcmp(token,
"unset") == 0) {
295 }
else if (strcmp(token,
"isnotset") == 0) {
297 }
else if (strcmp(token,
"toggle") == 0) {
304 }
else if (!name_set) {
305 if (val && strlen(val) != 0) {
310 }
else if (!track_set || !expire_set) {
314 if (strcmp(token,
"track") == 0) {
318 if (strcmp(val,
"ip_src") == 0) {
321 }
else if (strcmp(val,
"ip_dst") == 0) {
324 }
else if (strcmp(val,
"ip_pair") == 0) {
327 }
else if (strcmp(val,
"tx") == 0) {
335 }
else if (strcmp(token,
"expire") == 0) {
346 SCLogError(
"Invalid xbits keyword: %s", token);
350 token = strtok_r(NULL,
",", &context);
355 SCLogError(
"tx xbits only support set and isset");
369 cd->
idx = varname_id;
385 int result = DetectXbitParse(
de_ctx, rawstr, &cd);
388 }
else if (cd == NULL) {
404 SCLogError(
"tx xbits require an explicit rule hook");
439 DetectXbitFree(
de_ctx, cd);
456 static void XBitsTestSetup(
void)
467 static void XBitsTestShutdown(
void)
475 static int XBitsTestParse01(
void)
483 #define BAD_INPUT(str) \
484 FAIL_IF_NOT(DetectXbitParse(de_ctx, (str), &cd) == -1);
489 BAD_INPUT(
"set,abc,track nonsense, expire 3600");
490 BAD_INPUT(
"set,abc,track ip_source, expire 3600");
491 BAD_INPUT(
"set,abc,track ip_src, expire -1");
492 BAD_INPUT(
"set,abc,track ip_src, expire 0");
496 #define GOOD_INPUT(str, command, trk, typ, exp) \
497 FAIL_IF_NOT(DetectXbitParse(de_ctx, (str), &cd) == 0); \
499 FAIL_IF_NOT(cd->cmd == (command)); \
500 FAIL_IF_NOT(cd->tracker == (trk)); \
501 FAIL_IF_NOT(cd->type == (typ)); \
502 FAIL_IF_NOT(cd->expire == (exp)); \
503 DetectXbitFree(NULL, cd); \
510 GOOD_INPUT(
"set,abc,track ip_pair, expire 3600",
514 GOOD_INPUT(
"set,abc,track ip_src, expire 1234",
529 static int XBitsTestSig01(
void)
531 uint8_t *buf = (uint8_t *)
532 "GET /one/ HTTP/1.1\r\n"
533 "Host: one.example.org\r\n"
535 uint16_t buflen = strlen((
char *)buf);
557 "alert ip any any -> any any (xbits:set,abc,track ip_pair; content:\"GET \"; sid:1;)");
579 static int XBitsTestSig02(
void)
588 "alert ip any any -> any any (xbits:isset,abc,track ip_src; content:\"GET \"; sid:1;)");
592 "alert ip any any -> any any (xbits:isnotset,abc,track ip_dst; content:\"GET \"; sid:2;)");
596 "alert ip any any -> any any (xbits:set,abc,track ip_pair; content:\"GET \"; sid:3;)");
600 "alert ip any any -> any any (xbits:unset,abc,track ip_src; content:\"GET \"; sid:4;)");
604 "alert ip any any -> any any (xbits:toggle,abc,track ip_dst; content:\"GET \"; sid:5;)");
608 "alert ip any any -> any any (xbits:!set,abc,track ip_dst; content:\"GET \"; sid:6;)");
616 static int XBitsTestSig03(
void)
625 de_ctx,
"alert http any any -> any any (msg:\"TEST - No Error\")\";\
626 flow:established,to_server; http.method; content:\"GET\"; \
627 xbits:set,ET.2020_8260.1,track ip_src,expire 10; sid:1;)");
636 static int XBitsTestSig04(
void)
646 flow:established,to_server; http.method; content:\"GET\"; \
647 xbits:set,ET.2020_8260.1,noalert,track ip_src,expire 10; sid:2;)");
655 static int XBitsTestSig05(
void)
664 "alert http any any -> any any (msg:\"ET EXPLOIT Possible Pulse Secure VPN RCE "
665 "Chain Stage 1 Inbound - Request Config Backup (CVE-2020-8260)\"; "
666 "flow:established,to_server; http.method; content:\"GET\"; http.uri; "
667 "content:\"/dana-admin/cached/config/config.cgi?type=system\"; fast_pattern; "
668 "xbits:set,ET.2020_8260.1,track ip_src,expire 10; xbits:noalert; "
669 "classtype:attempted-admin; sid:2033750; rev:1;");
677 static int XBitsTestSig06(
void)
686 "alert http any any -> any any (msg:\"ET EXPLOIT Possible Pulse Secure VPN RCE "
687 "Chain Stage 2 Inbound - Upload Malicious Config (CVE-2020-8260)\"; "
688 "flow:established,to_server; http.method; content:\"POST\"; http.uri; "
689 "content:\"/dana-admin/cached/config/import.cgi\"; "
690 "xbits:isset,ET.2020_8260.1,track ip_src,expire 10;"
691 "xbits:set,ET.2020_8260.2,track ip_src,expire 10; "
692 "classtype:attempted-admin; sid:2033751; rev:1;");
700 static int DetectXBitsTestBadRules(
void)
705 const char *sigs[] = {
706 "alert http any any -> any any (content:\"abc\"; xbits:set,bit1,noalert,track "
708 "alert http any any -> any any (content:\"abc\"; xbits:noalert,set,bit1,noalert,track "
710 "alert http any any -> any any (content:\"abc\"; xbits:isset,bit2,track "
711 "ip_dst,asdf;sid:2;)",
712 "alert http any any -> any any (content:\"abc\"; xbits:isnotset,track ip_pair;sid:3;)",
713 "alert http any any -> any any (content:\"abc\"; xbits:toggle,track ip_pair,bit4;sid:4;)",
714 "alert http any any -> any any (content:\"abc\"; xbits:unset,bit5,track ipsrc;sid:5;)",
715 "alert http any any -> any any (content:\"abc\"; xbits:bit6,set,track ip_src,expire "
717 "alert http any any -> any any (content:\"abc\"; xbits:set,bit7,track "
718 "ip_pair,expire;sid:7;)",
719 "alert http any any -> any any (content:\"abc\"; xbits:set,bit7,trackk ip_pair,expire "
720 "3600, noalert;sid:8;)",
724 const char **sig = sigs;
736 static int DetectXBitsTestGoodRules(
void)
741 const char *sigs[] = {
742 "alert http any any -> any any (content:\"abc\"; xbits:set,bit1,track ip_src;sid:1;)",
743 "alert http any any -> any any (content:\"abc\"; xbits:isset,bit2,track ip_dst;sid:2;)",
744 "alert http any any -> any any (content:\"abc\"; xbits:isnotset, bit3, track "
746 "alert http any any -> any any (content:\"abc\"; xbits:toggle,bit4, track "
748 "alert http any any -> any any (content:\"abc\"; xbits: unset ,bit5,track ip_src;sid:5;)",
749 "alert http any any -> any any (content:\"abc\"; xbits:set,bit6 ,track ip_src, expire "
751 "alert http any any -> any any (content:\"abc\"; xbits:set, bit7, track ip_pair, expire "
753 "alert http any any -> any any (content:\"abc\"; xbits:set, bit7, track ip_pair, expire "
754 "3600; xbits:noalert; sid:8;)",
755 "alert http any any -> any any (content:\"abc\"; xbits:noalert; xbits:set, bit7, track "
761 const char **sig = sigs;
776 static void XBitsRegisterTests(
void)
785 UtRegisterTest(
"DetectXBitsTestBadRules", DetectXBitsTestBadRules);
786 UtRegisterTest(
"DetectXBitsTestGoodRules", DetectXBitsTestGoodRules);
void IPPairBitUnset(IPPair *h, uint32_t idx)
void StatsReleaseResources(void)
Releases the resources allotted by the Stats API.
#define FAIL_IF_NULL(expr)
Fail a test if expression evaluates to NULL.
void DetectXbitsRegister(void)
void IPPairInitConfig(bool quiet)
initialize the configuration
SigTableElmt * sigmatch_table
void(* Free)(DetectEngineCtx *, void *)
void IPPairRelease(IPPair *h)
void UtRegisterTest(const char *name, int(*TestFn)(void))
Register unit test.
struct HtpBodyChunk_ * next
void IPPairBitSet(IPPair *h, uint32_t idx, SCTime_t expire)
main detection engine ctx
void DetectEngineCtxFree(DetectEngineCtx *)
Free a DetectEngineCtx::
int IPPairBitIsset(IPPair *h, uint32_t idx, SCTime_t ts)
int(* AppLayerTxMatch)(DetectEngineThreadCtx *, Flow *, uint8_t flags, void *alstate, void *txv, const Signature *, const SigMatchCtx *)
#define DETECT_XBITS_TRACK_IPDST
void SigMatchSignatures(ThreadVars *tv, DetectEngineCtx *de_ctx, DetectEngineThreadCtx *det_ctx, Packet *p)
wrapper for old tests
uint32_t VarNameStoreRegister(const char *name, const enum VarTypes type)
Signature * DetectEngineAppendSig(DetectEngineCtx *, const char *)
Parse and append a Signature into the Detection Engine Context signature list.
int(* Setup)(DetectEngineCtx *, Signature *, const char *)
void HostBitInitCtx(void)
size_t strlcpy(char *dst, const char *src, size_t siz)
#define GOOD_INPUT(str, command, trk, typ, exp)
void IPPairShutdown(void)
shutdown the flow engine
@ SIGNATURE_HOOK_TYPE_APP
int DetectXbitMatchHost(Packet *p, const DetectXbitsData *xd)
#define DETECT_XBITS_CMD_ISNOTSET
#define DETECT_XBITS_EXPIRE_DEFAULT
#define FAIL_IF_NOT_NULL(expr)
Fail a test if expression evaluates to non-NULL.
#define PASS
Pass the test.
int TxBitIsset(AppLayerTxData *txd, uint32_t idx)
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 VarNameStoreUnregister(const uint32_t id, const enum VarTypes type)
#define DETECT_ENGINE_INSPECT_SIG_MATCH
#define DETECT_XBITS_TRACK_IPPAIR
void PacketFree(Packet *p)
Return a malloced packet.
int StringParseUint32(uint32_t *res, int base, size_t len, const char *str)
IPPair * IPPairGetIPPairFromHash(Address *a, Address *b)
#define SIGMATCH_IPONLY_COMPAT
SignatureInitData * init_data
Data structures and function prototypes for keeping state for the detection engine.
int(* Match)(DetectEngineThreadCtx *, Packet *, const Signature *, const SigMatchCtx *)
int SigGroupBuild(DetectEngineCtx *de_ctx)
Convert the signature list into the runtime match structure.
void StatsThreadInit(StatsThreadContext *stats)
Used to start a pointer to SigMatch context Should never be dereferenced without casting to something...
#define DETECT_XBITS_TRACK_TX
int IPPairBitIsnotset(IPPair *h, uint32_t idx, SCTime_t ts)
@ DETECT_SM_LIST_POSTMATCH
enum SignatureHookType type
TmEcode DetectEngineThreadCtxDeinit(ThreadVars *tv, void *data)
void HostShutdown(void)
shutdown the flow engine
#define DETECT_ENGINE_INSPECT_SIG_NO_MATCH
void IPPairBitInitCtx(void)
Packet * PacketGetFromAlloc(void)
Get a malloced packet.
int TxBitSet(AppLayerTxData *txd, uint32_t idx)
#define SCLogError(...)
Macro used to log ERROR messages.
#define DETECT_XBITS_TRACK_IPSRC
#define DETECT_XBITS_CMD_ISSET
DetectEngineCtx * DetectEngineCtxInit(void)
void IPPairBitToggle(IPPair *h, uint32_t idx, SCTime_t expire)
void SCStorageCleanup(void)
#define SIGMATCH_SUPPORT_FIREWALL
IPPair * IPPairLookupIPPairFromHash(Address *a, Address *b)
look up a ippair in the hash
void HostInitConfig(bool quiet)
initialize the configuration
#define DETECT_XBITS_CMD_SET
#define DETECT_XBITS_CMD_TOGGLE
#define DETECT_XBITS_CMD_UNSET
#define SCTIME_ADD_SECS(ts, s)
void StatsThreadCleanup(StatsThreadContext *stats)
struct AppLayerTxData * tx_data
#define DEBUG_VALIDATE_BUG_ON(exp)
int SCStorageFinalize(void)
void(* RegisterTests)(void)