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);
160 static int DetectXbitPostMatchTx(
176 SCLogDebug(
"sid %u: post-match SET for bit %u on tx:%" PRIu64
", txd:%p", s->
id, xd->
idx,
177 det_ctx->
tx_id, txd);
203 return DetectXbitPostMatchTx(det_ctx,
p, s, fd);
236 bool cmd_set =
false;
237 bool name_set =
false;
238 bool track_set =
false;
239 bool expire_set =
false;
246 char copy[strlen(rawstr) + 1];
247 strlcpy(copy, rawstr,
sizeof(copy));
248 char *context = NULL;
249 char *token = strtok_r(copy,
",", &context);
250 while (token != NULL) {
251 while (*token !=
'\0' && isblank(*token)) {
254 char *val = strchr(token,
' ');
257 while (*val !=
'\0' && isblank(*val)) {
263 if (strlen(token) == 0) {
266 if (strcmp(token,
"noalert") == 0 && !cmd_set) {
267 if (strtok_r(NULL,
",", &context) != NULL) {
270 if (val && strlen(val) != 0) {
277 if (val && strlen(val) != 0) {
280 if (strcmp(token,
"set") == 0) {
282 }
else if (strcmp(token,
"isset") == 0) {
284 }
else if (strcmp(token,
"unset") == 0) {
286 }
else if (strcmp(token,
"isnotset") == 0) {
288 }
else if (strcmp(token,
"toggle") == 0) {
295 }
else if (!name_set) {
296 if (val && strlen(val) != 0) {
301 }
else if (!track_set || !expire_set) {
305 if (strcmp(token,
"track") == 0) {
309 if (strcmp(val,
"ip_src") == 0) {
312 }
else if (strcmp(val,
"ip_dst") == 0) {
315 }
else if (strcmp(val,
"ip_pair") == 0) {
318 }
else if (strcmp(val,
"tx") == 0) {
326 }
else if (strcmp(token,
"expire") == 0) {
337 SCLogError(
"Invalid xbits keyword: %s", token);
341 token = strtok_r(NULL,
",", &context);
346 SCLogError(
"tx xbits only support set and isset");
360 cd->
idx = varname_id;
376 int result = DetectXbitParse(
de_ctx, rawstr, &cd);
379 }
else if (cd == NULL) {
395 SCLogError(
"tx xbits require an explicit rule hook");
430 DetectXbitFree(
de_ctx, cd);
447 static void XBitsTestSetup(
void)
458 static void XBitsTestShutdown(
void)
466 static int XBitsTestParse01(
void)
474 #define BAD_INPUT(str) \
475 FAIL_IF_NOT(DetectXbitParse(de_ctx, (str), &cd) == -1);
480 BAD_INPUT(
"set,abc,track nonsense, expire 3600");
481 BAD_INPUT(
"set,abc,track ip_source, expire 3600");
482 BAD_INPUT(
"set,abc,track ip_src, expire -1");
483 BAD_INPUT(
"set,abc,track ip_src, expire 0");
487 #define GOOD_INPUT(str, command, trk, typ, exp) \
488 FAIL_IF_NOT(DetectXbitParse(de_ctx, (str), &cd) == 0); \
490 FAIL_IF_NOT(cd->cmd == (command)); \
491 FAIL_IF_NOT(cd->tracker == (trk)); \
492 FAIL_IF_NOT(cd->type == (typ)); \
493 FAIL_IF_NOT(cd->expire == (exp)); \
494 DetectXbitFree(NULL, cd); \
501 GOOD_INPUT(
"set,abc,track ip_pair, expire 3600",
505 GOOD_INPUT(
"set,abc,track ip_src, expire 1234",
520 static int XBitsTestSig01(
void)
522 uint8_t *buf = (uint8_t *)
523 "GET /one/ HTTP/1.1\r\n"
524 "Host: one.example.org\r\n"
526 uint16_t buflen = strlen((
char *)buf);
548 "alert ip any any -> any any (xbits:set,abc,track ip_pair; content:\"GET \"; sid:1;)");
570 static int XBitsTestSig02(
void)
579 "alert ip any any -> any any (xbits:isset,abc,track ip_src; content:\"GET \"; sid:1;)");
583 "alert ip any any -> any any (xbits:isnotset,abc,track ip_dst; content:\"GET \"; sid:2;)");
587 "alert ip any any -> any any (xbits:set,abc,track ip_pair; content:\"GET \"; sid:3;)");
591 "alert ip any any -> any any (xbits:unset,abc,track ip_src; content:\"GET \"; sid:4;)");
595 "alert ip any any -> any any (xbits:toggle,abc,track ip_dst; content:\"GET \"; sid:5;)");
599 "alert ip any any -> any any (xbits:!set,abc,track ip_dst; content:\"GET \"; sid:6;)");
607 static int XBitsTestSig03(
void)
616 de_ctx,
"alert http any any -> any any (msg:\"TEST - No Error\")\";\
617 flow:established,to_server; http.method; content:\"GET\"; \
618 xbits:set,ET.2020_8260.1,track ip_src,expire 10; sid:1;)");
627 static int XBitsTestSig04(
void)
637 flow:established,to_server; http.method; content:\"GET\"; \
638 xbits:set,ET.2020_8260.1,noalert,track ip_src,expire 10; sid:2;)");
646 static int XBitsTestSig05(
void)
655 "alert http any any -> any any (msg:\"ET EXPLOIT Possible Pulse Secure VPN RCE "
656 "Chain Stage 1 Inbound - Request Config Backup (CVE-2020-8260)\"; "
657 "flow:established,to_server; http.method; content:\"GET\"; http.uri; "
658 "content:\"/dana-admin/cached/config/config.cgi?type=system\"; fast_pattern; "
659 "xbits:set,ET.2020_8260.1,track ip_src,expire 10; xbits:noalert; "
660 "classtype:attempted-admin; sid:2033750; rev:1;");
668 static int XBitsTestSig06(
void)
677 "alert http any any -> any any (msg:\"ET EXPLOIT Possible Pulse Secure VPN RCE "
678 "Chain Stage 2 Inbound - Upload Malicious Config (CVE-2020-8260)\"; "
679 "flow:established,to_server; http.method; content:\"POST\"; http.uri; "
680 "content:\"/dana-admin/cached/config/import.cgi\"; "
681 "xbits:isset,ET.2020_8260.1,track ip_src,expire 10;"
682 "xbits:set,ET.2020_8260.2,track ip_src,expire 10; "
683 "classtype:attempted-admin; sid:2033751; rev:1;");
691 static int DetectXBitsTestBadRules(
void)
696 const char *sigs[] = {
697 "alert http any any -> any any (content:\"abc\"; xbits:set,bit1,noalert,track "
699 "alert http any any -> any any (content:\"abc\"; xbits:noalert,set,bit1,noalert,track "
701 "alert http any any -> any any (content:\"abc\"; xbits:isset,bit2,track "
702 "ip_dst,asdf;sid:2;)",
703 "alert http any any -> any any (content:\"abc\"; xbits:isnotset,track ip_pair;sid:3;)",
704 "alert http any any -> any any (content:\"abc\"; xbits:toggle,track ip_pair,bit4;sid:4;)",
705 "alert http any any -> any any (content:\"abc\"; xbits:unset,bit5,track ipsrc;sid:5;)",
706 "alert http any any -> any any (content:\"abc\"; xbits:bit6,set,track ip_src,expire "
708 "alert http any any -> any any (content:\"abc\"; xbits:set,bit7,track "
709 "ip_pair,expire;sid:7;)",
710 "alert http any any -> any any (content:\"abc\"; xbits:set,bit7,trackk ip_pair,expire "
711 "3600, noalert;sid:8;)",
715 const char **sig = sigs;
727 static int DetectXBitsTestGoodRules(
void)
732 const char *sigs[] = {
733 "alert http any any -> any any (content:\"abc\"; xbits:set,bit1,track ip_src;sid:1;)",
734 "alert http any any -> any any (content:\"abc\"; xbits:isset,bit2,track ip_dst;sid:2;)",
735 "alert http any any -> any any (content:\"abc\"; xbits:isnotset, bit3, track "
737 "alert http any any -> any any (content:\"abc\"; xbits:toggle,bit4, track "
739 "alert http any any -> any any (content:\"abc\"; xbits: unset ,bit5,track ip_src;sid:5;)",
740 "alert http any any -> any any (content:\"abc\"; xbits:set,bit6 ,track ip_src, expire "
742 "alert http any any -> any any (content:\"abc\"; xbits:set, bit7, track ip_pair, expire "
744 "alert http any any -> any any (content:\"abc\"; xbits:set, bit7, track ip_pair, expire "
745 "3600; xbits:noalert; sid:8;)",
746 "alert http any any -> any any (content:\"abc\"; xbits:noalert; xbits:set, bit7, track "
752 const char **sig = sigs;
767 static void XBitsRegisterTests(
void)
776 UtRegisterTest(
"DetectXBitsTestBadRules", DetectXBitsTestBadRules);
777 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
@ 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)
#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 *)
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)
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)
AppProto alproto
application level protocol
void StatsThreadCleanup(StatsThreadContext *stats)
#define DEBUG_VALIDATE_BUG_ON(exp)
int SCStorageFinalize(void)
void(* RegisterTests)(void)