Go to the documentation of this file.
66 static void XBitsRegisterTests(
void);
148 return DetectIPPairbitMatchIsset(p,xd);
150 return DetectIPPairbitMatchIsnotset(p,xd);
152 return DetectIPPairbitMatchSet(p,xd);
154 return DetectIPPairbitMatchUnset(p,xd);
156 return DetectIPPairbitMatchToggle(p,xd);
161 static int DetectXbitPostMatchTx(
177 SCLogDebug(
"sid %u: post-match SET for bit %u on tx:%" PRIu64
", txd:%p", s->
id, xd->
idx,
178 det_ctx->
tx_id, txd);
204 return DetectXbitPostMatchTx(det_ctx, p, s, fd);
220 SCLogDebug(
"sid:%u: tx:%" PRIu64
", txd->txbits:%p", s->
id, det_ctx->
tx_id, txd->txbits);
237 bool cmd_set =
false;
238 bool name_set =
false;
239 bool track_set =
false;
240 bool expire_set =
false;
247 char copy[strlen(rawstr) + 1];
248 strlcpy(copy, rawstr,
sizeof(copy));
249 char *context = NULL;
250 char *token = strtok_r(copy,
",", &context);
251 while (token != NULL) {
252 while (*token !=
'\0' && isblank(*token)) {
255 char *val = strchr(token,
' ');
258 while (*val !=
'\0' && isblank(*val)) {
264 if (strlen(token) == 0) {
267 if (strcmp(token,
"noalert") == 0 && !cmd_set) {
268 if (strtok_r(NULL,
",", &context) != NULL) {
271 if (val && strlen(val) != 0) {
278 if (val && strlen(val) != 0) {
281 if (strcmp(token,
"set") == 0) {
283 }
else if (strcmp(token,
"isset") == 0) {
285 }
else if (strcmp(token,
"unset") == 0) {
287 }
else if (strcmp(token,
"isnotset") == 0) {
289 }
else if (strcmp(token,
"toggle") == 0) {
296 }
else if (!name_set) {
297 if (val && strlen(val) != 0) {
302 }
else if (!track_set || !expire_set) {
306 if (strcmp(token,
"track") == 0) {
310 if (strcmp(val,
"ip_src") == 0) {
313 }
else if (strcmp(val,
"ip_dst") == 0) {
316 }
else if (strcmp(val,
"ip_pair") == 0) {
319 }
else if (strcmp(val,
"tx") == 0) {
327 }
else if (strcmp(token,
"expire") == 0) {
338 SCLogError(
"Invalid xbits keyword: %s", token);
342 token = strtok_r(NULL,
",", &context);
347 SCLogError(
"tx xbits only support set and isset");
361 cd->
idx = varname_id;
377 int result = DetectXbitParse(
de_ctx, rawstr, &cd);
380 }
else if (cd == NULL) {
396 SCLogError(
"tx xbits require an explicit rule hook");
431 DetectXbitFree(
de_ctx, cd);
448 static void XBitsTestSetup(
void)
459 static void XBitsTestShutdown(
void)
467 static int XBitsTestParse01(
void)
475 #define BAD_INPUT(str) \
476 FAIL_IF_NOT(DetectXbitParse(de_ctx, (str), &cd) == -1);
481 BAD_INPUT(
"set,abc,track nonsense, expire 3600");
482 BAD_INPUT(
"set,abc,track ip_source, expire 3600");
483 BAD_INPUT(
"set,abc,track ip_src, expire -1");
484 BAD_INPUT(
"set,abc,track ip_src, expire 0");
488 #define GOOD_INPUT(str, command, trk, typ, exp) \
489 FAIL_IF_NOT(DetectXbitParse(de_ctx, (str), &cd) == 0); \
491 FAIL_IF_NOT(cd->cmd == (command)); \
492 FAIL_IF_NOT(cd->tracker == (trk)); \
493 FAIL_IF_NOT(cd->type == (typ)); \
494 FAIL_IF_NOT(cd->expire == (exp)); \
495 DetectXbitFree(NULL, cd); \
502 GOOD_INPUT(
"set,abc,track ip_pair, expire 3600",
506 GOOD_INPUT(
"set,abc,track ip_src, expire 1234",
521 static int XBitsTestSig01(
void)
523 uint8_t *buf = (uint8_t *)
524 "GET /one/ HTTP/1.1\r\n"
525 "Host: one.example.org\r\n"
527 uint16_t buflen = strlen((
char *)buf);
534 memset(&th_v, 0,
sizeof(th_v));
540 p->
proto = IPPROTO_TCP;
549 "alert ip any any -> any any (xbits:set,abc,track ip_pair; content:\"GET \"; sid:1;)");
571 static int XBitsTestSig02(
void)
580 "alert ip any any -> any any (xbits:isset,abc,track ip_src; content:\"GET \"; sid:1;)");
584 "alert ip any any -> any any (xbits:isnotset,abc,track ip_dst; content:\"GET \"; sid:2;)");
588 "alert ip any any -> any any (xbits:set,abc,track ip_pair; content:\"GET \"; sid:3;)");
592 "alert ip any any -> any any (xbits:unset,abc,track ip_src; content:\"GET \"; sid:4;)");
596 "alert ip any any -> any any (xbits:toggle,abc,track ip_dst; content:\"GET \"; sid:5;)");
600 "alert ip any any -> any any (xbits:!set,abc,track ip_dst; content:\"GET \"; sid:6;)");
608 static int XBitsTestSig03(
void)
617 de_ctx,
"alert http any any -> any any (msg:\"TEST - No Error\")\";\
618 flow:established,to_server; http.method; content:\"GET\"; \
619 xbits:set,ET.2020_8260.1,track ip_src,expire 10; sid:1;)");
628 static int XBitsTestSig04(
void)
638 flow:established,to_server; http.method; content:\"GET\"; \
639 xbits:set,ET.2020_8260.1,noalert,track ip_src,expire 10; sid:2;)");
647 static int XBitsTestSig05(
void)
656 "alert http any any -> any any (msg:\"ET EXPLOIT Possible Pulse Secure VPN RCE "
657 "Chain Stage 1 Inbound - Request Config Backup (CVE-2020-8260)\"; "
658 "flow:established,to_server; http.method; content:\"GET\"; http.uri; "
659 "content:\"/dana-admin/cached/config/config.cgi?type=system\"; fast_pattern; "
660 "xbits:set,ET.2020_8260.1,track ip_src,expire 10; xbits:noalert; "
661 "classtype:attempted-admin; sid:2033750; rev:1;");
669 static int XBitsTestSig06(
void)
678 "alert http any any -> any any (msg:\"ET EXPLOIT Possible Pulse Secure VPN RCE "
679 "Chain Stage 2 Inbound - Upload Malicious Config (CVE-2020-8260)\"; "
680 "flow:established,to_server; http.method; content:\"POST\"; http.uri; "
681 "content:\"/dana-admin/cached/config/import.cgi\"; "
682 "xbits:isset,ET.2020_8260.1,track ip_src,expire 10;"
683 "xbits:set,ET.2020_8260.2,track ip_src,expire 10; "
684 "classtype:attempted-admin; sid:2033751; rev:1;");
692 static int DetectXBitsTestBadRules(
void)
697 const char *sigs[] = {
698 "alert http any any -> any any (content:\"abc\"; xbits:set,bit1,noalert,track "
700 "alert http any any -> any any (content:\"abc\"; xbits:noalert,set,bit1,noalert,track "
702 "alert http any any -> any any (content:\"abc\"; xbits:isset,bit2,track "
703 "ip_dst,asdf;sid:2;)",
704 "alert http any any -> any any (content:\"abc\"; xbits:isnotset,track ip_pair;sid:3;)",
705 "alert http any any -> any any (content:\"abc\"; xbits:toggle,track ip_pair,bit4;sid:4;)",
706 "alert http any any -> any any (content:\"abc\"; xbits:unset,bit5,track ipsrc;sid:5;)",
707 "alert http any any -> any any (content:\"abc\"; xbits:bit6,set,track ip_src,expire "
709 "alert http any any -> any any (content:\"abc\"; xbits:set,bit7,track "
710 "ip_pair,expire;sid:7;)",
711 "alert http any any -> any any (content:\"abc\"; xbits:set,bit7,trackk ip_pair,expire "
712 "3600, noalert;sid:8;)",
716 const char **sig = sigs;
728 static int DetectXBitsTestGoodRules(
void)
733 const char *sigs[] = {
734 "alert http any any -> any any (content:\"abc\"; xbits:set,bit1,track ip_src;sid:1;)",
735 "alert http any any -> any any (content:\"abc\"; xbits:isset,bit2,track ip_dst;sid:2;)",
736 "alert http any any -> any any (content:\"abc\"; xbits:isnotset, bit3, track "
738 "alert http any any -> any any (content:\"abc\"; xbits:toggle,bit4, track "
740 "alert http any any -> any any (content:\"abc\"; xbits: unset ,bit5,track ip_src;sid:5;)",
741 "alert http any any -> any any (content:\"abc\"; xbits:set,bit6 ,track ip_src, expire "
743 "alert http any any -> any any (content:\"abc\"; xbits:set, bit7, track ip_pair, expire "
745 "alert http any any -> any any (content:\"abc\"; xbits:set, bit7, track ip_pair, expire "
746 "3600; xbits:noalert; sid:8;)",
747 "alert http any any -> any any (content:\"abc\"; xbits:noalert; xbits:set, bit7, track "
753 const char **sig = sigs;
768 static void XBitsRegisterTests(
void)
777 UtRegisterTest(
"DetectXBitsTestBadRules", DetectXBitsTestBadRules);
778 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::
void StorageCleanup(void)
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
struct AppLayerTxData AppLayerTxData
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)
#define SIGMATCH_SUPPORT_FIREWALL
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
@ DETECT_SM_LIST_POSTMATCH
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)
int StorageFinalize(void)
SignatureInitData * init_data
Data structures and function prototypes for keeping state for the detection engine.
int(* Match)(DetectEngineThreadCtx *, Packet *, const Signature *, const SigMatchCtx *)
void * AppLayerParserGetTx(uint8_t ipproto, AppProto alproto, void *alstate, uint64_t tx_id)
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)
enum SignatureHookType type
TmEcode DetectEngineThreadCtxDeinit(ThreadVars *tv, void *data)
void HostShutdown(void)
shutdown the flow engine
AppLayerTxData * AppLayerParserGetTxData(uint8_t ipproto, AppProto alproto, void *tx)
#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)
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)
AppProto alproto
application level protocol
void StatsThreadCleanup(StatsThreadContext *stats)
#define SIGMATCH_IPONLY_COMPAT
#define DEBUG_VALIDATE_BUG_ON(exp)
void(* RegisterTests)(void)