|
|
|
@ -248,7 +248,7 @@ int DetectEngineContentModifierBufferSetup(DetectEngineCtx *de_ctx, Signature *s
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
sm = SigMatchGetLastSMFromLists(s, 2,
|
|
|
|
sm = SigMatchGetLastSMFromLists(s, 2,
|
|
|
|
DETECT_CONTENT, s->sm_lists_tail[DETECT_SM_LIST_PMATCH]);
|
|
|
|
DETECT_CONTENT, s->init_data->smlists_tail[DETECT_SM_LIST_PMATCH]);
|
|
|
|
if (sm == NULL) {
|
|
|
|
if (sm == NULL) {
|
|
|
|
SCLogError(SC_ERR_INVALID_SIGNATURE, "\"%s\" keyword "
|
|
|
|
SCLogError(SC_ERR_INVALID_SIGNATURE, "\"%s\" keyword "
|
|
|
|
"found inside the rule without a content context. "
|
|
|
|
"found inside the rule without a content context. "
|
|
|
|
@ -279,8 +279,8 @@ int DetectEngineContentModifierBufferSetup(DetectEngineCtx *de_ctx, Signature *s
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
pm = SigMatchGetLastSMFromLists(s, 4,
|
|
|
|
pm = SigMatchGetLastSMFromLists(s, 4,
|
|
|
|
DETECT_CONTENT, s->sm_lists_tail[sm_list],
|
|
|
|
DETECT_CONTENT, s->init_data->smlists_tail[sm_list],
|
|
|
|
DETECT_PCRE, s->sm_lists_tail[sm_list]);
|
|
|
|
DETECT_PCRE, s->init_data->smlists_tail[sm_list]);
|
|
|
|
if (pm != NULL) {
|
|
|
|
if (pm != NULL) {
|
|
|
|
if (pm->type == DETECT_CONTENT) {
|
|
|
|
if (pm->type == DETECT_CONTENT) {
|
|
|
|
DetectContentData *tmp_cd = (DetectContentData *)pm->ctx;
|
|
|
|
DetectContentData *tmp_cd = (DetectContentData *)pm->ctx;
|
|
|
|
@ -298,10 +298,10 @@ int DetectEngineContentModifierBufferSetup(DetectEngineCtx *de_ctx, Signature *s
|
|
|
|
|
|
|
|
|
|
|
|
/* transfer the sm from the pmatch list to hcbdmatch list */
|
|
|
|
/* transfer the sm from the pmatch list to hcbdmatch list */
|
|
|
|
SigMatchTransferSigMatchAcrossLists(sm,
|
|
|
|
SigMatchTransferSigMatchAcrossLists(sm,
|
|
|
|
&s->sm_lists[DETECT_SM_LIST_PMATCH],
|
|
|
|
&s->init_data->smlists[DETECT_SM_LIST_PMATCH],
|
|
|
|
&s->sm_lists_tail[DETECT_SM_LIST_PMATCH],
|
|
|
|
&s->init_data->smlists_tail[DETECT_SM_LIST_PMATCH],
|
|
|
|
&s->sm_lists[sm_list],
|
|
|
|
&s->init_data->smlists[sm_list],
|
|
|
|
&s->sm_lists_tail[sm_list]);
|
|
|
|
&s->init_data->smlists_tail[sm_list]);
|
|
|
|
|
|
|
|
|
|
|
|
ret = 0;
|
|
|
|
ret = 0;
|
|
|
|
end:
|
|
|
|
end:
|
|
|
|
@ -366,17 +366,17 @@ SigTableElmt *SigTableGet(char *name)
|
|
|
|
*/
|
|
|
|
*/
|
|
|
|
void SigMatchAppendSMToList(Signature *s, SigMatch *new, int list)
|
|
|
|
void SigMatchAppendSMToList(Signature *s, SigMatch *new, int list)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
if (s->sm_lists[list] == NULL) {
|
|
|
|
if (s->init_data->smlists[list] == NULL) {
|
|
|
|
s->sm_lists[list] = new;
|
|
|
|
s->init_data->smlists[list] = new;
|
|
|
|
s->sm_lists_tail[list] = new;
|
|
|
|
s->init_data->smlists_tail[list] = new;
|
|
|
|
new->next = NULL;
|
|
|
|
new->next = NULL;
|
|
|
|
new->prev = NULL;
|
|
|
|
new->prev = NULL;
|
|
|
|
} else {
|
|
|
|
} else {
|
|
|
|
SigMatch *cur = s->sm_lists_tail[list];
|
|
|
|
SigMatch *cur = s->init_data->smlists_tail[list];
|
|
|
|
cur->next = new;
|
|
|
|
cur->next = new;
|
|
|
|
new->prev = cur;
|
|
|
|
new->prev = cur;
|
|
|
|
new->next = NULL;
|
|
|
|
new->next = NULL;
|
|
|
|
s->sm_lists_tail[list] = new;
|
|
|
|
s->init_data->smlists_tail[list] = new;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
new->idx = s->sm_cnt;
|
|
|
|
new->idx = s->sm_cnt;
|
|
|
|
@ -385,11 +385,11 @@ void SigMatchAppendSMToList(Signature *s, SigMatch *new, int list)
|
|
|
|
|
|
|
|
|
|
|
|
void SigMatchRemoveSMFromList(Signature *s, SigMatch *sm, int sm_list)
|
|
|
|
void SigMatchRemoveSMFromList(Signature *s, SigMatch *sm, int sm_list)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
if (sm == s->sm_lists[sm_list]) {
|
|
|
|
if (sm == s->init_data->smlists[sm_list]) {
|
|
|
|
s->sm_lists[sm_list] = sm->next;
|
|
|
|
s->init_data->smlists[sm_list] = sm->next;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (sm == s->sm_lists_tail[sm_list]) {
|
|
|
|
if (sm == s->init_data->smlists_tail[sm_list]) {
|
|
|
|
s->sm_lists_tail[sm_list] = sm->prev;
|
|
|
|
s->init_data->smlists_tail[sm_list] = sm->prev;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (sm->prev != NULL)
|
|
|
|
if (sm->prev != NULL)
|
|
|
|
sm->prev->next = sm->next;
|
|
|
|
sm->prev->next = sm->next;
|
|
|
|
@ -471,7 +471,7 @@ SigMatch *SigMatchGetLastSM(const Signature *s)
|
|
|
|
int i;
|
|
|
|
int i;
|
|
|
|
|
|
|
|
|
|
|
|
for (i = 0; i < DETECT_SM_LIST_MAX; i ++) {
|
|
|
|
for (i = 0; i < DETECT_SM_LIST_MAX; i ++) {
|
|
|
|
sm_new = s->sm_lists_tail[i];
|
|
|
|
sm_new = s->init_data->smlists_tail[i];
|
|
|
|
if (sm_new == NULL)
|
|
|
|
if (sm_new == NULL)
|
|
|
|
continue;
|
|
|
|
continue;
|
|
|
|
if (sm_last == NULL || sm_new->idx > sm_last->idx)
|
|
|
|
if (sm_last == NULL || sm_new->idx > sm_last->idx)
|
|
|
|
@ -518,7 +518,7 @@ int SigMatchListSMBelongsTo(const Signature *s, const SigMatch *key_sm)
|
|
|
|
int list = 0;
|
|
|
|
int list = 0;
|
|
|
|
|
|
|
|
|
|
|
|
for (list = 0; list < DETECT_SM_LIST_MAX; list++) {
|
|
|
|
for (list = 0; list < DETECT_SM_LIST_MAX; list++) {
|
|
|
|
const SigMatch *sm = s->sm_lists[list];
|
|
|
|
const SigMatch *sm = s->init_data->smlists[list];
|
|
|
|
while (sm != NULL) {
|
|
|
|
while (sm != NULL) {
|
|
|
|
if (sm == key_sm)
|
|
|
|
if (sm == key_sm)
|
|
|
|
return list;
|
|
|
|
return list;
|
|
|
|
@ -994,9 +994,14 @@ Signature *SigAlloc (void)
|
|
|
|
Signature *sig = SCMalloc(sizeof(Signature));
|
|
|
|
Signature *sig = SCMalloc(sizeof(Signature));
|
|
|
|
if (unlikely(sig == NULL))
|
|
|
|
if (unlikely(sig == NULL))
|
|
|
|
return NULL;
|
|
|
|
return NULL;
|
|
|
|
|
|
|
|
|
|
|
|
memset(sig, 0, sizeof(Signature));
|
|
|
|
memset(sig, 0, sizeof(Signature));
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
sig->init_data = SCCalloc(1, sizeof(SignatureInitData));
|
|
|
|
|
|
|
|
if (sig->init_data == NULL) {
|
|
|
|
|
|
|
|
SCFree(sig);
|
|
|
|
|
|
|
|
return NULL;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/* assign it to -1, so that we can later check if the value has been
|
|
|
|
/* assign it to -1, so that we can later check if the value has been
|
|
|
|
* overwritten after the Signature has been parsed, and if it hasn't been
|
|
|
|
* overwritten after the Signature has been parsed, and if it hasn't been
|
|
|
|
* overwritten, we can then assign the default value of 3 */
|
|
|
|
* overwritten, we can then assign the default value of 3 */
|
|
|
|
@ -1059,12 +1064,14 @@ void SigFree(Signature *s)
|
|
|
|
IPOnlyCIDRListFree(s->CidrSrc);
|
|
|
|
IPOnlyCIDRListFree(s->CidrSrc);
|
|
|
|
|
|
|
|
|
|
|
|
int i;
|
|
|
|
int i;
|
|
|
|
for (i = 0; i < DETECT_SM_LIST_MAX; i++) {
|
|
|
|
if (s->init_data) {
|
|
|
|
SigMatch *sm = s->sm_lists[i];
|
|
|
|
for (i = 0; i < DETECT_SM_LIST_MAX; i++) {
|
|
|
|
while (sm != NULL) {
|
|
|
|
SigMatch *sm = s->init_data->smlists[i];
|
|
|
|
SigMatch *nsm = sm->next;
|
|
|
|
while (sm != NULL) {
|
|
|
|
SigMatchFree(sm);
|
|
|
|
SigMatch *nsm = sm->next;
|
|
|
|
sm = nsm;
|
|
|
|
SigMatchFree(sm);
|
|
|
|
|
|
|
|
sm = nsm;
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
SigMatchFreeArrays(s);
|
|
|
|
SigMatchFreeArrays(s);
|
|
|
|
@ -1228,7 +1235,7 @@ int SigValidate(DetectEngineCtx *de_ctx, Signature *s)
|
|
|
|
SCReturnInt(0);
|
|
|
|
SCReturnInt(0);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
for (sm = s->sm_lists[DETECT_SM_LIST_MATCH]; sm != NULL; sm = sm->next) {
|
|
|
|
for (sm = s->init_data->smlists[DETECT_SM_LIST_MATCH]; sm != NULL; sm = sm->next) {
|
|
|
|
if (sm->type == DETECT_FLOW) {
|
|
|
|
if (sm->type == DETECT_FLOW) {
|
|
|
|
DetectFlowData *fd = (DetectFlowData *)sm->ctx;
|
|
|
|
DetectFlowData *fd = (DetectFlowData *)sm->ctx;
|
|
|
|
if (fd == NULL)
|
|
|
|
if (fd == NULL)
|
|
|
|
@ -1236,11 +1243,11 @@ int SigValidate(DetectEngineCtx *de_ctx, Signature *s)
|
|
|
|
|
|
|
|
|
|
|
|
if (fd->flags & FLOW_PKT_TOCLIENT) {
|
|
|
|
if (fd->flags & FLOW_PKT_TOCLIENT) {
|
|
|
|
/* check for uricontent + from_server/to_client */
|
|
|
|
/* check for uricontent + from_server/to_client */
|
|
|
|
if (s->sm_lists[DETECT_SM_LIST_UMATCH] != NULL ||
|
|
|
|
if (s->init_data->smlists[DETECT_SM_LIST_UMATCH] != NULL ||
|
|
|
|
s->sm_lists[DETECT_SM_LIST_HRUDMATCH] != NULL ||
|
|
|
|
s->init_data->smlists[DETECT_SM_LIST_HRUDMATCH] != NULL ||
|
|
|
|
s->sm_lists[DETECT_SM_LIST_HCBDMATCH] != NULL ||
|
|
|
|
s->init_data->smlists[DETECT_SM_LIST_HCBDMATCH] != NULL ||
|
|
|
|
s->sm_lists[DETECT_SM_LIST_HMDMATCH] != NULL ||
|
|
|
|
s->init_data->smlists[DETECT_SM_LIST_HMDMATCH] != NULL ||
|
|
|
|
s->sm_lists[DETECT_SM_LIST_HUADMATCH] != NULL) {
|
|
|
|
s->init_data->smlists[DETECT_SM_LIST_HUADMATCH] != NULL) {
|
|
|
|
SCLogError(SC_ERR_INVALID_SIGNATURE, "can't use uricontent "
|
|
|
|
SCLogError(SC_ERR_INVALID_SIGNATURE, "can't use uricontent "
|
|
|
|
"/http_uri , raw_uri, http_client_body, "
|
|
|
|
"/http_uri , raw_uri, http_client_body, "
|
|
|
|
"http_method, http_user_agent keywords "
|
|
|
|
"http_method, http_user_agent keywords "
|
|
|
|
@ -1249,9 +1256,8 @@ int SigValidate(DetectEngineCtx *de_ctx, Signature *s)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
} else if (fd->flags & FLOW_PKT_TOSERVER) {
|
|
|
|
} else if (fd->flags & FLOW_PKT_TOSERVER) {
|
|
|
|
/* check for uricontent + from_server/to_client */
|
|
|
|
/* check for uricontent + from_server/to_client */
|
|
|
|
if (/*s->sm_lists[DETECT_SM_LIST_FILEDATA] != NULL ||*/
|
|
|
|
if (s->init_data->smlists[DETECT_SM_LIST_HSMDMATCH] != NULL ||
|
|
|
|
s->sm_lists[DETECT_SM_LIST_HSMDMATCH] != NULL ||
|
|
|
|
s->init_data->smlists[DETECT_SM_LIST_HSCDMATCH] != NULL) {
|
|
|
|
s->sm_lists[DETECT_SM_LIST_HSCDMATCH] != NULL) {
|
|
|
|
|
|
|
|
SCLogError(SC_ERR_INVALID_SIGNATURE, "can't use http_"
|
|
|
|
SCLogError(SC_ERR_INVALID_SIGNATURE, "can't use http_"
|
|
|
|
"server_body, http_stat_msg, http_stat_code "
|
|
|
|
"server_body, http_stat_msg, http_stat_code "
|
|
|
|
"with flow:to_server or flow:from_client");
|
|
|
|
"with flow:to_server or flow:from_client");
|
|
|
|
@ -1261,19 +1267,19 @@ int SigValidate(DetectEngineCtx *de_ctx, Signature *s)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if ((s->sm_lists[DETECT_SM_LIST_FILEDATA] != NULL && s->alproto == ALPROTO_SMTP) ||
|
|
|
|
if ((s->init_data->smlists[DETECT_SM_LIST_FILEDATA] != NULL && s->alproto == ALPROTO_SMTP) ||
|
|
|
|
s->sm_lists[DETECT_SM_LIST_UMATCH] != NULL ||
|
|
|
|
s->init_data->smlists[DETECT_SM_LIST_UMATCH] != NULL ||
|
|
|
|
s->sm_lists[DETECT_SM_LIST_HRUDMATCH] != NULL ||
|
|
|
|
s->init_data->smlists[DETECT_SM_LIST_HRUDMATCH] != NULL ||
|
|
|
|
s->sm_lists[DETECT_SM_LIST_HCBDMATCH] != NULL ||
|
|
|
|
s->init_data->smlists[DETECT_SM_LIST_HCBDMATCH] != NULL ||
|
|
|
|
s->sm_lists[DETECT_SM_LIST_HMDMATCH] != NULL ||
|
|
|
|
s->init_data->smlists[DETECT_SM_LIST_HMDMATCH] != NULL ||
|
|
|
|
s->sm_lists[DETECT_SM_LIST_HUADMATCH] != NULL) {
|
|
|
|
s->init_data->smlists[DETECT_SM_LIST_HUADMATCH] != NULL) {
|
|
|
|
sig_flags |= SIG_FLAG_TOSERVER;
|
|
|
|
sig_flags |= SIG_FLAG_TOSERVER;
|
|
|
|
s->flags |= SIG_FLAG_TOSERVER;
|
|
|
|
s->flags |= SIG_FLAG_TOSERVER;
|
|
|
|
s->flags &= ~SIG_FLAG_TOCLIENT;
|
|
|
|
s->flags &= ~SIG_FLAG_TOCLIENT;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if ((s->sm_lists[DETECT_SM_LIST_FILEDATA] != NULL && s->alproto == ALPROTO_HTTP) ||
|
|
|
|
if ((s->init_data->smlists[DETECT_SM_LIST_FILEDATA] != NULL && s->alproto == ALPROTO_HTTP) ||
|
|
|
|
s->sm_lists[DETECT_SM_LIST_HSMDMATCH] != NULL ||
|
|
|
|
s->init_data->smlists[DETECT_SM_LIST_HSMDMATCH] != NULL ||
|
|
|
|
s->sm_lists[DETECT_SM_LIST_HSCDMATCH] != NULL) {
|
|
|
|
s->init_data->smlists[DETECT_SM_LIST_HSCDMATCH] != NULL) {
|
|
|
|
sig_flags |= SIG_FLAG_TOCLIENT;
|
|
|
|
sig_flags |= SIG_FLAG_TOCLIENT;
|
|
|
|
s->flags |= SIG_FLAG_TOCLIENT;
|
|
|
|
s->flags |= SIG_FLAG_TOCLIENT;
|
|
|
|
s->flags &= ~SIG_FLAG_TOSERVER;
|
|
|
|
s->flags &= ~SIG_FLAG_TOSERVER;
|
|
|
|
@ -1285,7 +1291,7 @@ int SigValidate(DetectEngineCtx *de_ctx, Signature *s)
|
|
|
|
SCReturnInt(0);
|
|
|
|
SCReturnInt(0);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if (s->sm_lists[DETECT_SM_LIST_HRHDMATCH] != NULL) {
|
|
|
|
if (s->init_data->smlists[DETECT_SM_LIST_HRHDMATCH] != NULL) {
|
|
|
|
if ((s->flags & (SIG_FLAG_TOCLIENT|SIG_FLAG_TOSERVER)) == (SIG_FLAG_TOCLIENT|SIG_FLAG_TOSERVER)) {
|
|
|
|
if ((s->flags & (SIG_FLAG_TOCLIENT|SIG_FLAG_TOSERVER)) == (SIG_FLAG_TOCLIENT|SIG_FLAG_TOSERVER)) {
|
|
|
|
SCLogError(SC_ERR_INVALID_SIGNATURE,"http_raw_header signature "
|
|
|
|
SCLogError(SC_ERR_INVALID_SIGNATURE,"http_raw_header signature "
|
|
|
|
"without a flow direction. Use flow:to_server for "
|
|
|
|
"without a flow direction. Use flow:to_server for "
|
|
|
|
@ -1295,8 +1301,8 @@ int SigValidate(DetectEngineCtx *de_ctx, Signature *s)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if (s->sm_lists[DETECT_SM_LIST_HHHDMATCH] != NULL) {
|
|
|
|
if (s->init_data->smlists[DETECT_SM_LIST_HHHDMATCH] != NULL) {
|
|
|
|
for (sm = s->sm_lists[DETECT_SM_LIST_HHHDMATCH];
|
|
|
|
for (sm = s->init_data->smlists[DETECT_SM_LIST_HHHDMATCH];
|
|
|
|
sm != NULL; sm = sm->next) {
|
|
|
|
sm != NULL; sm = sm->next) {
|
|
|
|
if (sm->type == DETECT_CONTENT) {
|
|
|
|
if (sm->type == DETECT_CONTENT) {
|
|
|
|
DetectContentData *cd = (DetectContentData *)sm->ctx;
|
|
|
|
DetectContentData *cd = (DetectContentData *)sm->ctx;
|
|
|
|
@ -1367,19 +1373,19 @@ int SigValidate(DetectEngineCtx *de_ctx, Signature *s)
|
|
|
|
|
|
|
|
|
|
|
|
if (s->flags & SIG_FLAG_REQUIRE_PACKET) {
|
|
|
|
if (s->flags & SIG_FLAG_REQUIRE_PACKET) {
|
|
|
|
pm = SigMatchGetLastSMFromLists(s, 24,
|
|
|
|
pm = SigMatchGetLastSMFromLists(s, 24,
|
|
|
|
DETECT_REPLACE, s->sm_lists_tail[DETECT_SM_LIST_UMATCH],
|
|
|
|
DETECT_REPLACE, s->init_data->smlists_tail[DETECT_SM_LIST_UMATCH],
|
|
|
|
DETECT_REPLACE, s->sm_lists_tail[DETECT_SM_LIST_HRUDMATCH],
|
|
|
|
DETECT_REPLACE, s->init_data->smlists_tail[DETECT_SM_LIST_HRUDMATCH],
|
|
|
|
DETECT_REPLACE, s->sm_lists_tail[DETECT_SM_LIST_HCBDMATCH],
|
|
|
|
DETECT_REPLACE, s->init_data->smlists_tail[DETECT_SM_LIST_HCBDMATCH],
|
|
|
|
DETECT_REPLACE, s->sm_lists_tail[DETECT_SM_LIST_FILEDATA],
|
|
|
|
DETECT_REPLACE, s->init_data->smlists_tail[DETECT_SM_LIST_FILEDATA],
|
|
|
|
DETECT_REPLACE, s->sm_lists_tail[DETECT_SM_LIST_HHDMATCH],
|
|
|
|
DETECT_REPLACE, s->init_data->smlists_tail[DETECT_SM_LIST_HHDMATCH],
|
|
|
|
DETECT_REPLACE, s->sm_lists_tail[DETECT_SM_LIST_HRHDMATCH],
|
|
|
|
DETECT_REPLACE, s->init_data->smlists_tail[DETECT_SM_LIST_HRHDMATCH],
|
|
|
|
DETECT_REPLACE, s->sm_lists_tail[DETECT_SM_LIST_HMDMATCH],
|
|
|
|
DETECT_REPLACE, s->init_data->smlists_tail[DETECT_SM_LIST_HMDMATCH],
|
|
|
|
DETECT_REPLACE, s->sm_lists_tail[DETECT_SM_LIST_HSMDMATCH],
|
|
|
|
DETECT_REPLACE, s->init_data->smlists_tail[DETECT_SM_LIST_HSMDMATCH],
|
|
|
|
DETECT_REPLACE, s->sm_lists_tail[DETECT_SM_LIST_HSCDMATCH],
|
|
|
|
DETECT_REPLACE, s->init_data->smlists_tail[DETECT_SM_LIST_HSCDMATCH],
|
|
|
|
DETECT_REPLACE, s->sm_lists_tail[DETECT_SM_LIST_HCDMATCH],
|
|
|
|
DETECT_REPLACE, s->init_data->smlists_tail[DETECT_SM_LIST_HCDMATCH],
|
|
|
|
DETECT_REPLACE, s->sm_lists_tail[DETECT_SM_LIST_HUADMATCH],
|
|
|
|
DETECT_REPLACE, s->init_data->smlists_tail[DETECT_SM_LIST_HUADMATCH],
|
|
|
|
DETECT_REPLACE, s->sm_lists_tail[DETECT_SM_LIST_HHHDMATCH],
|
|
|
|
DETECT_REPLACE, s->init_data->smlists_tail[DETECT_SM_LIST_HHHDMATCH],
|
|
|
|
DETECT_REPLACE, s->sm_lists_tail[DETECT_SM_LIST_HRHHDMATCH]);
|
|
|
|
DETECT_REPLACE, s->init_data->smlists_tail[DETECT_SM_LIST_HRHHDMATCH]);
|
|
|
|
if (pm != NULL) {
|
|
|
|
if (pm != NULL) {
|
|
|
|
SCLogError(SC_ERR_INVALID_SIGNATURE, "Signature has"
|
|
|
|
SCLogError(SC_ERR_INVALID_SIGNATURE, "Signature has"
|
|
|
|
" replace keyword linked with a modified content"
|
|
|
|
" replace keyword linked with a modified content"
|
|
|
|
@ -1388,19 +1394,19 @@ int SigValidate(DetectEngineCtx *de_ctx, Signature *s)
|
|
|
|
SCReturnInt(0);
|
|
|
|
SCReturnInt(0);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if (s->sm_lists_tail[DETECT_SM_LIST_UMATCH] ||
|
|
|
|
if (s->init_data->smlists_tail[DETECT_SM_LIST_UMATCH] ||
|
|
|
|
s->sm_lists_tail[DETECT_SM_LIST_HRUDMATCH] ||
|
|
|
|
s->init_data->smlists_tail[DETECT_SM_LIST_HRUDMATCH] ||
|
|
|
|
s->sm_lists_tail[DETECT_SM_LIST_HCBDMATCH] ||
|
|
|
|
s->init_data->smlists_tail[DETECT_SM_LIST_HCBDMATCH] ||
|
|
|
|
s->sm_lists_tail[DETECT_SM_LIST_FILEDATA] ||
|
|
|
|
s->init_data->smlists_tail[DETECT_SM_LIST_FILEDATA] ||
|
|
|
|
s->sm_lists_tail[DETECT_SM_LIST_HHDMATCH] ||
|
|
|
|
s->init_data->smlists_tail[DETECT_SM_LIST_HHDMATCH] ||
|
|
|
|
s->sm_lists_tail[DETECT_SM_LIST_HRHDMATCH] ||
|
|
|
|
s->init_data->smlists_tail[DETECT_SM_LIST_HRHDMATCH] ||
|
|
|
|
s->sm_lists_tail[DETECT_SM_LIST_HMDMATCH] ||
|
|
|
|
s->init_data->smlists_tail[DETECT_SM_LIST_HMDMATCH] ||
|
|
|
|
s->sm_lists_tail[DETECT_SM_LIST_HSMDMATCH] ||
|
|
|
|
s->init_data->smlists_tail[DETECT_SM_LIST_HSMDMATCH] ||
|
|
|
|
s->sm_lists_tail[DETECT_SM_LIST_HSCDMATCH] ||
|
|
|
|
s->init_data->smlists_tail[DETECT_SM_LIST_HSCDMATCH] ||
|
|
|
|
s->sm_lists_tail[DETECT_SM_LIST_HCDMATCH] ||
|
|
|
|
s->init_data->smlists_tail[DETECT_SM_LIST_HCDMATCH] ||
|
|
|
|
s->sm_lists_tail[DETECT_SM_LIST_HUADMATCH] ||
|
|
|
|
s->init_data->smlists_tail[DETECT_SM_LIST_HUADMATCH] ||
|
|
|
|
s->sm_lists_tail[DETECT_SM_LIST_HHHDMATCH] ||
|
|
|
|
s->init_data->smlists_tail[DETECT_SM_LIST_HHHDMATCH] ||
|
|
|
|
s->sm_lists_tail[DETECT_SM_LIST_HRHHDMATCH])
|
|
|
|
s->init_data->smlists_tail[DETECT_SM_LIST_HRHHDMATCH])
|
|
|
|
{
|
|
|
|
{
|
|
|
|
SCLogError(SC_ERR_INVALID_SIGNATURE, "Signature combines packet "
|
|
|
|
SCLogError(SC_ERR_INVALID_SIGNATURE, "Signature combines packet "
|
|
|
|
"specific matches (like dsize, flags, ttl) with stream / "
|
|
|
|
"specific matches (like dsize, flags, ttl) with stream / "
|
|
|
|
@ -1410,7 +1416,7 @@ int SigValidate(DetectEngineCtx *de_ctx, Signature *s)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
for (sm = s->sm_lists[DETECT_SM_LIST_AMATCH]; sm != NULL; sm = sm->next) {
|
|
|
|
for (sm = s->init_data->smlists[DETECT_SM_LIST_AMATCH]; sm != NULL; sm = sm->next) {
|
|
|
|
if (sm->type != DETECT_AL_APP_LAYER_PROTOCOL)
|
|
|
|
if (sm->type != DETECT_AL_APP_LAYER_PROTOCOL)
|
|
|
|
continue;
|
|
|
|
continue;
|
|
|
|
if (((DetectAppLayerProtocolData *)sm->ctx)->negated)
|
|
|
|
if (((DetectAppLayerProtocolData *)sm->ctx)->negated)
|
|
|
|
@ -1427,7 +1433,7 @@ int SigValidate(DetectEngineCtx *de_ctx, Signature *s)
|
|
|
|
if (s->proto.proto[IPPROTO_TCP / 8] & (1 << (IPPROTO_TCP % 8))) {
|
|
|
|
if (s->proto.proto[IPPROTO_TCP / 8] & (1 << (IPPROTO_TCP % 8))) {
|
|
|
|
if (!(s->flags & (SIG_FLAG_REQUIRE_PACKET | SIG_FLAG_REQUIRE_STREAM))) {
|
|
|
|
if (!(s->flags & (SIG_FLAG_REQUIRE_PACKET | SIG_FLAG_REQUIRE_STREAM))) {
|
|
|
|
s->flags |= SIG_FLAG_REQUIRE_STREAM;
|
|
|
|
s->flags |= SIG_FLAG_REQUIRE_STREAM;
|
|
|
|
sm = s->sm_lists[DETECT_SM_LIST_PMATCH];
|
|
|
|
sm = s->init_data->smlists[DETECT_SM_LIST_PMATCH];
|
|
|
|
while (sm != NULL) {
|
|
|
|
while (sm != NULL) {
|
|
|
|
if (sm->type == DETECT_CONTENT &&
|
|
|
|
if (sm->type == DETECT_CONTENT &&
|
|
|
|
(((DetectContentData *)(sm->ctx))->flags &
|
|
|
|
(((DetectContentData *)(sm->ctx))->flags &
|
|
|
|
@ -1440,13 +1446,13 @@ int SigValidate(DetectEngineCtx *de_ctx, Signature *s)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if (s->sm_lists[DETECT_SM_LIST_BASE64_DATA] != NULL) {
|
|
|
|
if (s->init_data->smlists[DETECT_SM_LIST_BASE64_DATA] != NULL) {
|
|
|
|
int list;
|
|
|
|
int list;
|
|
|
|
uint16_t idx = s->sm_lists[DETECT_SM_LIST_BASE64_DATA]->idx;
|
|
|
|
uint16_t idx = s->init_data->smlists[DETECT_SM_LIST_BASE64_DATA]->idx;
|
|
|
|
for (list = 0; list < DETECT_SM_LIST_DETECT_MAX; list++) {
|
|
|
|
for (list = 0; list < DETECT_SM_LIST_DETECT_MAX; list++) {
|
|
|
|
if (list != DETECT_SM_LIST_BASE64_DATA &&
|
|
|
|
if (list != DETECT_SM_LIST_BASE64_DATA &&
|
|
|
|
s->sm_lists[list] != NULL) {
|
|
|
|
s->init_data->smlists[list] != NULL) {
|
|
|
|
if (s->sm_lists[list]->idx > idx) {
|
|
|
|
if (s->init_data->smlists[list]->idx > idx) {
|
|
|
|
SCLogError(SC_ERR_INVALID_SIGNATURE, "Rule buffer "
|
|
|
|
SCLogError(SC_ERR_INVALID_SIGNATURE, "Rule buffer "
|
|
|
|
"cannot be reset after base64_data.");
|
|
|
|
"cannot be reset after base64_data.");
|
|
|
|
SCReturnInt(0);
|
|
|
|
SCReturnInt(0);
|
|
|
|
@ -1462,8 +1468,8 @@ int SigValidate(DetectEngineCtx *de_ctx, Signature *s)
|
|
|
|
#ifdef DEBUG
|
|
|
|
#ifdef DEBUG
|
|
|
|
int i;
|
|
|
|
int i;
|
|
|
|
for (i = 0; i < DETECT_SM_LIST_MAX; i++) {
|
|
|
|
for (i = 0; i < DETECT_SM_LIST_MAX; i++) {
|
|
|
|
if (s->sm_lists[i] != NULL) {
|
|
|
|
if (s->init_data->smlists[i] != NULL) {
|
|
|
|
for (sm = s->sm_lists[i]; sm != NULL; sm = sm->next) {
|
|
|
|
for (sm = s->init_data->smlists[i]; sm != NULL; sm = sm->next) {
|
|
|
|
BUG_ON(sm == sm->prev);
|
|
|
|
BUG_ON(sm == sm->prev);
|
|
|
|
BUG_ON(sm == sm->next);
|
|
|
|
BUG_ON(sm == sm->next);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
@ -1543,8 +1549,8 @@ static Signature *SigInitHelper(DetectEngineCtx *de_ctx, char *sigstr,
|
|
|
|
* app layer flag wasn't already set in which case we
|
|
|
|
* app layer flag wasn't already set in which case we
|
|
|
|
* only consider the app layer */
|
|
|
|
* only consider the app layer */
|
|
|
|
if (!(sig->flags & SIG_FLAG_APPLAYER)) {
|
|
|
|
if (!(sig->flags & SIG_FLAG_APPLAYER)) {
|
|
|
|
if (sig->sm_lists[DETECT_SM_LIST_MATCH] != NULL) {
|
|
|
|
if (sig->init_data->smlists[DETECT_SM_LIST_MATCH] != NULL) {
|
|
|
|
SigMatch *sm = sig->sm_lists[DETECT_SM_LIST_MATCH];
|
|
|
|
SigMatch *sm = sig->init_data->smlists[DETECT_SM_LIST_MATCH];
|
|
|
|
for ( ; sm != NULL; sm = sm->next) {
|
|
|
|
for ( ; sm != NULL; sm = sm->next) {
|
|
|
|
if (sigmatch_table[sm->type].Match != NULL)
|
|
|
|
if (sigmatch_table[sm->type].Match != NULL)
|
|
|
|
sig->init_flags |= SIG_FLAG_INIT_PACKET;
|
|
|
|
sig->init_flags |= SIG_FLAG_INIT_PACKET;
|
|
|
|
@ -1554,12 +1560,12 @@ static Signature *SigInitHelper(DetectEngineCtx *de_ctx, char *sigstr,
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if (sig->sm_lists[DETECT_SM_LIST_AMATCH] != NULL)
|
|
|
|
if (sig->init_data->smlists[DETECT_SM_LIST_AMATCH] != NULL)
|
|
|
|
sig->flags |= SIG_FLAG_APPLAYER;
|
|
|
|
sig->flags |= SIG_FLAG_APPLAYER;
|
|
|
|
|
|
|
|
|
|
|
|
if (sig->sm_lists[DETECT_SM_LIST_DMATCH])
|
|
|
|
if (sig->init_data->smlists[DETECT_SM_LIST_DMATCH])
|
|
|
|
sig->flags |= SIG_FLAG_STATE_MATCH;
|
|
|
|
sig->flags |= SIG_FLAG_STATE_MATCH;
|
|
|
|
if (sig->sm_lists[DETECT_SM_LIST_AMATCH])
|
|
|
|
if (sig->init_data->smlists[DETECT_SM_LIST_AMATCH])
|
|
|
|
sig->flags |= SIG_FLAG_STATE_MATCH;
|
|
|
|
sig->flags |= SIG_FLAG_STATE_MATCH;
|
|
|
|
/* for other lists this flag is set when the inspect engines
|
|
|
|
/* for other lists this flag is set when the inspect engines
|
|
|
|
* are registered */
|
|
|
|
* are registered */
|
|
|
|
@ -3393,7 +3399,7 @@ int SigParseTestMpm01 (void)
|
|
|
|
goto end;
|
|
|
|
goto end;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if (sig->sm_lists[DETECT_SM_LIST_PMATCH] == NULL) {
|
|
|
|
if (sig->init_data->smlists[DETECT_SM_LIST_PMATCH] == NULL) {
|
|
|
|
printf("sig doesn't have content list: ");
|
|
|
|
printf("sig doesn't have content list: ");
|
|
|
|
goto end;
|
|
|
|
goto end;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
@ -3424,7 +3430,7 @@ int SigParseTestMpm02 (void)
|
|
|
|
goto end;
|
|
|
|
goto end;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if (sig->sm_lists[DETECT_SM_LIST_PMATCH] == NULL) {
|
|
|
|
if (sig->init_data->smlists[DETECT_SM_LIST_PMATCH] == NULL) {
|
|
|
|
printf("sig doesn't have content list: ");
|
|
|
|
printf("sig doesn't have content list: ");
|
|
|
|
goto end;
|
|
|
|
goto end;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|