|
|
|
@ -63,7 +63,8 @@ void DetectIsdataatFree(void *);
|
|
|
|
|
/**
|
|
|
|
|
* \brief Registration function for isdataat: keyword
|
|
|
|
|
*/
|
|
|
|
|
void DetectIsdataatRegister (void) {
|
|
|
|
|
void DetectIsdataatRegister(void)
|
|
|
|
|
{
|
|
|
|
|
sigmatch_table[DETECT_ISDATAAT].name = "isdataat";
|
|
|
|
|
sigmatch_table[DETECT_ISDATAAT].desc = "check if there is still data at a specific part of the payload";
|
|
|
|
|
sigmatch_table[DETECT_ISDATAAT].url = "https://redmine.openinfosecfoundation.org/projects/suricata/wiki/Payload_keywords#Isadataat";
|
|
|
|
@ -248,191 +249,171 @@ error:
|
|
|
|
|
*/
|
|
|
|
|
int DetectIsdataatSetup (DetectEngineCtx *de_ctx, Signature *s, char *isdataatstr)
|
|
|
|
|
{
|
|
|
|
|
DetectIsdataatData *idad = NULL;
|
|
|
|
|
SigMatch *sm = NULL;
|
|
|
|
|
SigMatch *prev_pm = NULL;
|
|
|
|
|
DetectIsdataatData *idad = NULL;
|
|
|
|
|
char *offset = NULL;
|
|
|
|
|
int ret = -1;
|
|
|
|
|
|
|
|
|
|
idad = DetectIsdataatParse(isdataatstr, &offset);
|
|
|
|
|
if (idad == NULL)
|
|
|
|
|
goto error;
|
|
|
|
|
|
|
|
|
|
sm = SigMatchAlloc();
|
|
|
|
|
if (sm == NULL)
|
|
|
|
|
goto error;
|
|
|
|
|
|
|
|
|
|
sm->type = DETECT_ISDATAAT;
|
|
|
|
|
sm->ctx = (void *)idad;
|
|
|
|
|
goto end;
|
|
|
|
|
|
|
|
|
|
if (s->init_flags & SIG_FLAG_INIT_FILE_DATA || s->init_flags & SIG_FLAG_INIT_DCE_STUB_DATA) {
|
|
|
|
|
int sm_list;
|
|
|
|
|
int sm_list;
|
|
|
|
|
if (s->init_flags & (SIG_FLAG_INIT_FILE_DATA | SIG_FLAG_INIT_DCE_STUB_DATA)) {
|
|
|
|
|
if (s->init_flags & SIG_FLAG_INIT_FILE_DATA) {
|
|
|
|
|
AppLayerHtpEnableResponseBodyCallback();
|
|
|
|
|
s->alproto = ALPROTO_HTTP;
|
|
|
|
|
sm_list = DETECT_SM_LIST_HSBDMATCH;
|
|
|
|
|
} else {
|
|
|
|
|
sm_list = DETECT_SM_LIST_DMATCH;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
s->flags |= SIG_FLAG_APPLAYER;
|
|
|
|
|
if (idad->flags & ISDATAAT_RELATIVE) {
|
|
|
|
|
s->flags |= SIG_FLAG_APPLAYER;
|
|
|
|
|
SigMatchAppendSMToList(s, sm, sm_list);
|
|
|
|
|
prev_pm = SigMatchGetLastSMFromLists(s, 10,
|
|
|
|
|
prev_pm = SigMatchGetLastSMFromLists(s, 4,
|
|
|
|
|
DETECT_CONTENT, s->sm_lists_tail[sm_list],
|
|
|
|
|
DETECT_PCRE, s->sm_lists_tail[sm_list],
|
|
|
|
|
DETECT_BYTEJUMP, s->sm_lists_tail[sm_list],
|
|
|
|
|
DETECT_BYTE_EXTRACT, s->sm_lists_tail[sm_list],
|
|
|
|
|
DETECT_BYTETEST, s->sm_lists_tail[sm_list]);
|
|
|
|
|
if (prev_pm == NULL) {
|
|
|
|
|
SCLogDebug("No preceding content or pcre keyword. Possible "
|
|
|
|
|
"since this is a file_data sig.");
|
|
|
|
|
if (offset != NULL) {
|
|
|
|
|
SCLogError(SC_ERR_INVALID_SIGNATURE, "Unknown byte_extract var "
|
|
|
|
|
"seen in isdataat - %s", offset);
|
|
|
|
|
goto error;
|
|
|
|
|
}
|
|
|
|
|
idad->flags &= ~ISDATAAT_RELATIVE;
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
DETECT_PCRE, s->sm_lists_tail[sm_list]);
|
|
|
|
|
}
|
|
|
|
|
} else if (idad->flags & ISDATAAT_RELATIVE) {
|
|
|
|
|
prev_pm = SigMatchGetLastSMFromLists(s, 168,
|
|
|
|
|
DETECT_CONTENT, s->sm_lists_tail[DETECT_SM_LIST_PMATCH],
|
|
|
|
|
DETECT_CONTENT, s->sm_lists_tail[DETECT_SM_LIST_UMATCH],
|
|
|
|
|
DETECT_CONTENT, s->sm_lists_tail[DETECT_SM_LIST_HCBDMATCH],
|
|
|
|
|
DETECT_CONTENT, s->sm_lists_tail[DETECT_SM_LIST_HSBDMATCH],
|
|
|
|
|
DETECT_CONTENT, s->sm_lists_tail[DETECT_SM_LIST_HHDMATCH],
|
|
|
|
|
DETECT_CONTENT, s->sm_lists_tail[DETECT_SM_LIST_HRHDMATCH],
|
|
|
|
|
DETECT_CONTENT, s->sm_lists_tail[DETECT_SM_LIST_HMDMATCH],
|
|
|
|
|
DETECT_CONTENT, s->sm_lists_tail[DETECT_SM_LIST_HCDMATCH],
|
|
|
|
|
DETECT_CONTENT, s->sm_lists_tail[DETECT_SM_LIST_HRUDMATCH],
|
|
|
|
|
DETECT_CONTENT, s->sm_lists_tail[DETECT_SM_LIST_HSMDMATCH],
|
|
|
|
|
DETECT_CONTENT, s->sm_lists_tail[DETECT_SM_LIST_HSCDMATCH],
|
|
|
|
|
DETECT_CONTENT, s->sm_lists_tail[DETECT_SM_LIST_HUADMATCH],
|
|
|
|
|
DETECT_CONTENT, s->sm_lists_tail[DETECT_SM_LIST_HHHDMATCH],
|
|
|
|
|
DETECT_CONTENT, s->sm_lists_tail[DETECT_SM_LIST_HRHHDMATCH],
|
|
|
|
|
|
|
|
|
|
DETECT_PCRE, s->sm_lists_tail[DETECT_SM_LIST_PMATCH],
|
|
|
|
|
DETECT_PCRE, s->sm_lists_tail[DETECT_SM_LIST_UMATCH],
|
|
|
|
|
DETECT_PCRE, s->sm_lists_tail[DETECT_SM_LIST_HCBDMATCH],
|
|
|
|
|
DETECT_PCRE, s->sm_lists_tail[DETECT_SM_LIST_HSBDMATCH],
|
|
|
|
|
DETECT_PCRE, s->sm_lists_tail[DETECT_SM_LIST_HHDMATCH],
|
|
|
|
|
DETECT_PCRE, s->sm_lists_tail[DETECT_SM_LIST_HRHDMATCH],
|
|
|
|
|
DETECT_PCRE, s->sm_lists_tail[DETECT_SM_LIST_HMDMATCH],
|
|
|
|
|
DETECT_PCRE, s->sm_lists_tail[DETECT_SM_LIST_HCDMATCH],
|
|
|
|
|
DETECT_PCRE, s->sm_lists_tail[DETECT_SM_LIST_HRUDMATCH],
|
|
|
|
|
DETECT_PCRE, s->sm_lists_tail[DETECT_SM_LIST_HSMDMATCH],
|
|
|
|
|
DETECT_PCRE, s->sm_lists_tail[DETECT_SM_LIST_HSCDMATCH],
|
|
|
|
|
DETECT_PCRE, s->sm_lists_tail[DETECT_SM_LIST_HUADMATCH],
|
|
|
|
|
DETECT_PCRE, s->sm_lists_tail[DETECT_SM_LIST_HHHDMATCH],
|
|
|
|
|
DETECT_PCRE, s->sm_lists_tail[DETECT_SM_LIST_HRHHDMATCH],
|
|
|
|
|
|
|
|
|
|
DETECT_BYTETEST, s->sm_lists_tail[DETECT_SM_LIST_PMATCH],
|
|
|
|
|
DETECT_BYTETEST, s->sm_lists_tail[DETECT_SM_LIST_UMATCH],
|
|
|
|
|
DETECT_BYTETEST, s->sm_lists_tail[DETECT_SM_LIST_HCBDMATCH],
|
|
|
|
|
DETECT_BYTETEST, s->sm_lists_tail[DETECT_SM_LIST_HSBDMATCH],
|
|
|
|
|
DETECT_BYTETEST, s->sm_lists_tail[DETECT_SM_LIST_HHDMATCH],
|
|
|
|
|
DETECT_BYTETEST, s->sm_lists_tail[DETECT_SM_LIST_HRHDMATCH],
|
|
|
|
|
DETECT_BYTETEST, s->sm_lists_tail[DETECT_SM_LIST_HMDMATCH],
|
|
|
|
|
DETECT_BYTETEST, s->sm_lists_tail[DETECT_SM_LIST_HCDMATCH],
|
|
|
|
|
DETECT_BYTETEST, s->sm_lists_tail[DETECT_SM_LIST_HRUDMATCH],
|
|
|
|
|
DETECT_BYTETEST, s->sm_lists_tail[DETECT_SM_LIST_HSMDMATCH],
|
|
|
|
|
DETECT_BYTETEST, s->sm_lists_tail[DETECT_SM_LIST_HSCDMATCH],
|
|
|
|
|
DETECT_BYTETEST, s->sm_lists_tail[DETECT_SM_LIST_HUADMATCH],
|
|
|
|
|
DETECT_BYTETEST, s->sm_lists_tail[DETECT_SM_LIST_HHHDMATCH],
|
|
|
|
|
DETECT_BYTETEST, s->sm_lists_tail[DETECT_SM_LIST_HRHHDMATCH],
|
|
|
|
|
|
|
|
|
|
DETECT_BYTEJUMP, s->sm_lists_tail[DETECT_SM_LIST_PMATCH],
|
|
|
|
|
DETECT_BYTEJUMP, s->sm_lists_tail[DETECT_SM_LIST_UMATCH],
|
|
|
|
|
DETECT_BYTEJUMP, s->sm_lists_tail[DETECT_SM_LIST_HCBDMATCH],
|
|
|
|
|
DETECT_BYTEJUMP, s->sm_lists_tail[DETECT_SM_LIST_HSBDMATCH],
|
|
|
|
|
DETECT_BYTEJUMP, s->sm_lists_tail[DETECT_SM_LIST_HHDMATCH],
|
|
|
|
|
DETECT_BYTEJUMP, s->sm_lists_tail[DETECT_SM_LIST_HRHDMATCH],
|
|
|
|
|
DETECT_BYTEJUMP, s->sm_lists_tail[DETECT_SM_LIST_HMDMATCH],
|
|
|
|
|
DETECT_BYTEJUMP, s->sm_lists_tail[DETECT_SM_LIST_HCDMATCH],
|
|
|
|
|
DETECT_BYTEJUMP, s->sm_lists_tail[DETECT_SM_LIST_HRUDMATCH],
|
|
|
|
|
DETECT_BYTEJUMP, s->sm_lists_tail[DETECT_SM_LIST_HSMDMATCH],
|
|
|
|
|
DETECT_BYTEJUMP, s->sm_lists_tail[DETECT_SM_LIST_HSCDMATCH],
|
|
|
|
|
DETECT_BYTEJUMP, s->sm_lists_tail[DETECT_SM_LIST_HUADMATCH],
|
|
|
|
|
DETECT_BYTEJUMP, s->sm_lists_tail[DETECT_SM_LIST_HHHDMATCH],
|
|
|
|
|
DETECT_BYTEJUMP, s->sm_lists_tail[DETECT_SM_LIST_HRHHDMATCH],
|
|
|
|
|
|
|
|
|
|
DETECT_BYTE_EXTRACT, s->sm_lists_tail[DETECT_SM_LIST_PMATCH],
|
|
|
|
|
DETECT_BYTE_EXTRACT, s->sm_lists_tail[DETECT_SM_LIST_UMATCH],
|
|
|
|
|
DETECT_BYTE_EXTRACT, s->sm_lists_tail[DETECT_SM_LIST_HCBDMATCH],
|
|
|
|
|
DETECT_BYTE_EXTRACT, s->sm_lists_tail[DETECT_SM_LIST_HSBDMATCH],
|
|
|
|
|
DETECT_BYTE_EXTRACT, s->sm_lists_tail[DETECT_SM_LIST_HHDMATCH],
|
|
|
|
|
DETECT_BYTE_EXTRACT, s->sm_lists_tail[DETECT_SM_LIST_HRHDMATCH],
|
|
|
|
|
DETECT_BYTE_EXTRACT, s->sm_lists_tail[DETECT_SM_LIST_HMDMATCH],
|
|
|
|
|
DETECT_BYTE_EXTRACT, s->sm_lists_tail[DETECT_SM_LIST_HCDMATCH],
|
|
|
|
|
DETECT_BYTE_EXTRACT, s->sm_lists_tail[DETECT_SM_LIST_HRUDMATCH],
|
|
|
|
|
DETECT_BYTE_EXTRACT, s->sm_lists_tail[DETECT_SM_LIST_HSMDMATCH],
|
|
|
|
|
DETECT_BYTE_EXTRACT, s->sm_lists_tail[DETECT_SM_LIST_HSCDMATCH],
|
|
|
|
|
DETECT_BYTE_EXTRACT, s->sm_lists_tail[DETECT_SM_LIST_HUADMATCH],
|
|
|
|
|
DETECT_BYTE_EXTRACT, s->sm_lists_tail[DETECT_SM_LIST_HHHDMATCH],
|
|
|
|
|
DETECT_BYTE_EXTRACT, s->sm_lists_tail[DETECT_SM_LIST_HRHHDMATCH],
|
|
|
|
|
|
|
|
|
|
DETECT_ISDATAAT, s->sm_lists_tail[DETECT_SM_LIST_PMATCH],
|
|
|
|
|
DETECT_ISDATAAT, s->sm_lists_tail[DETECT_SM_LIST_UMATCH],
|
|
|
|
|
DETECT_ISDATAAT, s->sm_lists_tail[DETECT_SM_LIST_HCBDMATCH],
|
|
|
|
|
DETECT_ISDATAAT, s->sm_lists_tail[DETECT_SM_LIST_HSBDMATCH],
|
|
|
|
|
DETECT_ISDATAAT, s->sm_lists_tail[DETECT_SM_LIST_HHDMATCH],
|
|
|
|
|
DETECT_ISDATAAT, s->sm_lists_tail[DETECT_SM_LIST_HRHDMATCH],
|
|
|
|
|
DETECT_ISDATAAT, s->sm_lists_tail[DETECT_SM_LIST_HMDMATCH],
|
|
|
|
|
DETECT_ISDATAAT, s->sm_lists_tail[DETECT_SM_LIST_HCDMATCH],
|
|
|
|
|
DETECT_ISDATAAT, s->sm_lists_tail[DETECT_SM_LIST_HRUDMATCH],
|
|
|
|
|
DETECT_ISDATAAT, s->sm_lists_tail[DETECT_SM_LIST_HSMDMATCH],
|
|
|
|
|
DETECT_ISDATAAT, s->sm_lists_tail[DETECT_SM_LIST_HSCDMATCH],
|
|
|
|
|
DETECT_ISDATAAT, s->sm_lists_tail[DETECT_SM_LIST_HUADMATCH],
|
|
|
|
|
DETECT_ISDATAAT, s->sm_lists_tail[DETECT_SM_LIST_HHHDMATCH],
|
|
|
|
|
DETECT_ISDATAAT, s->sm_lists_tail[DETECT_SM_LIST_HRHHDMATCH]);
|
|
|
|
|
if (prev_pm == NULL)
|
|
|
|
|
sm_list = DETECT_SM_LIST_PMATCH;
|
|
|
|
|
else
|
|
|
|
|
sm_list = SigMatchListSMBelongsTo(s, prev_pm);
|
|
|
|
|
} else {
|
|
|
|
|
if (!(idad->flags & ISDATAAT_RELATIVE)) {
|
|
|
|
|
SigMatchAppendSMToList(s, sm, DETECT_SM_LIST_PMATCH);
|
|
|
|
|
if (offset != NULL) {
|
|
|
|
|
SigMatch *bed_sm =
|
|
|
|
|
DetectByteExtractRetrieveSMVar(offset, s,
|
|
|
|
|
SigMatchListSMBelongsTo(s, sm));
|
|
|
|
|
if (bed_sm == NULL) {
|
|
|
|
|
SCLogError(SC_ERR_INVALID_SIGNATURE, "Unknown byte_extract var "
|
|
|
|
|
"seen in isdataat - %s\n", offset);
|
|
|
|
|
goto error;
|
|
|
|
|
}
|
|
|
|
|
DetectIsdataatData *isdd = sm->ctx;
|
|
|
|
|
isdd->dataat = ((DetectByteExtractData *)bed_sm->ctx)->local_id;
|
|
|
|
|
isdd->flags |= ISDATAAT_OFFSET_BE;
|
|
|
|
|
SCFree(offset);
|
|
|
|
|
}
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
prev_pm = SigMatchGetLastSMFromLists(s, 66,
|
|
|
|
|
DETECT_CONTENT, s->sm_lists_tail[DETECT_SM_LIST_PMATCH],
|
|
|
|
|
DETECT_CONTENT, s->sm_lists_tail[DETECT_SM_LIST_UMATCH],
|
|
|
|
|
DETECT_CONTENT, s->sm_lists_tail[DETECT_SM_LIST_HCBDMATCH],
|
|
|
|
|
DETECT_CONTENT, s->sm_lists_tail[DETECT_SM_LIST_HSBDMATCH],
|
|
|
|
|
DETECT_CONTENT, s->sm_lists_tail[DETECT_SM_LIST_HHDMATCH],
|
|
|
|
|
DETECT_CONTENT, s->sm_lists_tail[DETECT_SM_LIST_HRHDMATCH],
|
|
|
|
|
DETECT_CONTENT, s->sm_lists_tail[DETECT_SM_LIST_HMDMATCH],
|
|
|
|
|
DETECT_CONTENT, s->sm_lists_tail[DETECT_SM_LIST_HCDMATCH],
|
|
|
|
|
DETECT_CONTENT, s->sm_lists_tail[DETECT_SM_LIST_HRUDMATCH],
|
|
|
|
|
DETECT_CONTENT, s->sm_lists_tail[DETECT_SM_LIST_HSMDMATCH],
|
|
|
|
|
DETECT_CONTENT, s->sm_lists_tail[DETECT_SM_LIST_HSCDMATCH],
|
|
|
|
|
DETECT_CONTENT, s->sm_lists_tail[DETECT_SM_LIST_HUADMATCH],
|
|
|
|
|
DETECT_CONTENT, s->sm_lists_tail[DETECT_SM_LIST_HHHDMATCH],
|
|
|
|
|
DETECT_CONTENT, s->sm_lists_tail[DETECT_SM_LIST_HRHHDMATCH],
|
|
|
|
|
DETECT_PCRE, s->sm_lists_tail[DETECT_SM_LIST_PMATCH],
|
|
|
|
|
DETECT_PCRE, s->sm_lists_tail[DETECT_SM_LIST_UMATCH],
|
|
|
|
|
DETECT_PCRE, s->sm_lists_tail[DETECT_SM_LIST_HCBDMATCH],
|
|
|
|
|
DETECT_PCRE, s->sm_lists_tail[DETECT_SM_LIST_HSBDMATCH],
|
|
|
|
|
DETECT_PCRE, s->sm_lists_tail[DETECT_SM_LIST_HHDMATCH],
|
|
|
|
|
DETECT_PCRE, s->sm_lists_tail[DETECT_SM_LIST_HRHDMATCH],
|
|
|
|
|
DETECT_PCRE, s->sm_lists_tail[DETECT_SM_LIST_HMDMATCH],
|
|
|
|
|
DETECT_PCRE, s->sm_lists_tail[DETECT_SM_LIST_HCDMATCH],
|
|
|
|
|
DETECT_PCRE, s->sm_lists_tail[DETECT_SM_LIST_HRUDMATCH],
|
|
|
|
|
DETECT_PCRE, s->sm_lists_tail[DETECT_SM_LIST_HUADMATCH],
|
|
|
|
|
DETECT_PCRE, s->sm_lists_tail[DETECT_SM_LIST_HHHDMATCH],
|
|
|
|
|
DETECT_PCRE, s->sm_lists_tail[DETECT_SM_LIST_HRHHDMATCH],
|
|
|
|
|
DETECT_BYTEJUMP, s->sm_lists_tail[DETECT_SM_LIST_PMATCH],
|
|
|
|
|
DETECT_BYTE_EXTRACT, s->sm_lists_tail[DETECT_SM_LIST_PMATCH],
|
|
|
|
|
DETECT_BYTE_EXTRACT, s->sm_lists_tail[DETECT_SM_LIST_DMATCH],
|
|
|
|
|
DETECT_BYTE_EXTRACT, s->sm_lists_tail[DETECT_SM_LIST_UMATCH],
|
|
|
|
|
DETECT_BYTETEST, s->sm_lists_tail[DETECT_SM_LIST_PMATCH],
|
|
|
|
|
DETECT_BYTETEST, s->sm_lists_tail[DETECT_SM_LIST_DMATCH],
|
|
|
|
|
DETECT_BYTETEST, s->sm_lists_tail[DETECT_SM_LIST_UMATCH]);
|
|
|
|
|
if (prev_pm == NULL) {
|
|
|
|
|
SigMatchAppendSMToList(s, sm, DETECT_SM_LIST_PMATCH);
|
|
|
|
|
if (offset != NULL) {
|
|
|
|
|
SigMatch *bed_sm =
|
|
|
|
|
DetectByteExtractRetrieveSMVar(offset, s,
|
|
|
|
|
SigMatchListSMBelongsTo(s, sm));
|
|
|
|
|
if (bed_sm == NULL) {
|
|
|
|
|
SCLogError(SC_ERR_INVALID_SIGNATURE, "Unknown byte_extract var "
|
|
|
|
|
"seen in isdataat - %s\n", offset);
|
|
|
|
|
goto error;
|
|
|
|
|
}
|
|
|
|
|
DetectIsdataatData *isdd = sm->ctx;
|
|
|
|
|
isdd->dataat = ((DetectByteExtractData *)bed_sm->ctx)->local_id;
|
|
|
|
|
isdd->flags |= ISDATAAT_OFFSET_BE;
|
|
|
|
|
SCFree(offset);
|
|
|
|
|
}
|
|
|
|
|
SCReturnInt(0);
|
|
|
|
|
} else {
|
|
|
|
|
int list_type = SigMatchListSMBelongsTo(s, prev_pm);
|
|
|
|
|
if (list_type == -1) {
|
|
|
|
|
goto error;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
SigMatchAppendSMToList(s, sm, list_type);
|
|
|
|
|
} /* else - if (prev_pm == NULL) */
|
|
|
|
|
sm_list = DETECT_SM_LIST_PMATCH;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (offset != NULL) {
|
|
|
|
|
SigMatch *bed_sm =
|
|
|
|
|
DetectByteExtractRetrieveSMVar(offset, s,
|
|
|
|
|
SigMatchListSMBelongsTo(s, sm));
|
|
|
|
|
SigMatch *bed_sm = DetectByteExtractRetrieveSMVar(offset, s, sm_list);
|
|
|
|
|
if (bed_sm == NULL) {
|
|
|
|
|
SCLogError(SC_ERR_INVALID_SIGNATURE, "Unknown byte_extract var "
|
|
|
|
|
"seen in isdataat - %s\n", offset);
|
|
|
|
|
goto error;
|
|
|
|
|
goto end;
|
|
|
|
|
}
|
|
|
|
|
DetectIsdataatData *isdd = sm->ctx;
|
|
|
|
|
isdd->dataat = ((DetectByteExtractData *)bed_sm->ctx)->local_id;
|
|
|
|
|
isdd->flags |= ISDATAAT_OFFSET_BE;
|
|
|
|
|
idad->dataat = ((DetectByteExtractData *)bed_sm->ctx)->local_id;
|
|
|
|
|
idad->flags |= ISDATAAT_OFFSET_BE;
|
|
|
|
|
SCFree(offset);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
DetectContentData *cd = NULL;
|
|
|
|
|
DetectPcreData *pe = NULL;
|
|
|
|
|
|
|
|
|
|
switch (prev_pm->type) {
|
|
|
|
|
case DETECT_CONTENT:
|
|
|
|
|
/* Set the relative next flag on the prev sigmatch */
|
|
|
|
|
cd = (DetectContentData *)prev_pm->ctx;
|
|
|
|
|
if (cd == NULL) {
|
|
|
|
|
SCLogError(SC_ERR_INVALID_SIGNATURE, "Unknown previous-"
|
|
|
|
|
"previous keyword!");
|
|
|
|
|
return -1;
|
|
|
|
|
}
|
|
|
|
|
cd->flags |= DETECT_CONTENT_RELATIVE_NEXT;
|
|
|
|
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
case DETECT_PCRE:
|
|
|
|
|
pe = (DetectPcreData *)prev_pm->ctx;
|
|
|
|
|
if (pe == NULL) {
|
|
|
|
|
SCLogError(SC_ERR_INVALID_SIGNATURE, "Unknown previous-"
|
|
|
|
|
"previous keyword!");
|
|
|
|
|
return -1;
|
|
|
|
|
}
|
|
|
|
|
pe->flags |= DETECT_PCRE_RELATIVE_NEXT;
|
|
|
|
|
sm = SigMatchAlloc();
|
|
|
|
|
if (sm == NULL)
|
|
|
|
|
goto end;
|
|
|
|
|
sm->type = DETECT_ISDATAAT;
|
|
|
|
|
sm->ctx = (void *)idad;
|
|
|
|
|
SigMatchAppendSMToList(s, sm, sm_list);
|
|
|
|
|
|
|
|
|
|
break;
|
|
|
|
|
if (!(idad->flags & ISDATAAT_RELATIVE)) {
|
|
|
|
|
ret = 0;
|
|
|
|
|
goto end;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
case DETECT_BYTEJUMP:
|
|
|
|
|
case DETECT_BYTETEST:
|
|
|
|
|
case DETECT_BYTE_EXTRACT:
|
|
|
|
|
SCLogDebug("Do nothing for byte_jump, byte_test, byte_extract");
|
|
|
|
|
break;
|
|
|
|
|
if (prev_pm == NULL) {
|
|
|
|
|
ret = 0;
|
|
|
|
|
goto end;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
default:
|
|
|
|
|
/* this will never hit */
|
|
|
|
|
SCLogError(SC_ERR_INVALID_SIGNATURE, "Unknown previous-"
|
|
|
|
|
"previous keyword!");
|
|
|
|
|
return -1;
|
|
|
|
|
} /* switch */
|
|
|
|
|
if (prev_pm->type == DETECT_CONTENT) {
|
|
|
|
|
DetectContentData *cd = (DetectContentData *)prev_pm->ctx;
|
|
|
|
|
cd->flags |= DETECT_CONTENT_RELATIVE_NEXT;
|
|
|
|
|
} else if (prev_pm->type == DETECT_PCRE) {
|
|
|
|
|
DetectPcreData *pd = (DetectPcreData *)prev_pm->ctx;
|
|
|
|
|
pd->flags |= DETECT_PCRE_RELATIVE_NEXT;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
|
ret = 0;
|
|
|
|
|
|
|
|
|
|
error:
|
|
|
|
|
return -1;
|
|
|
|
|
end:
|
|
|
|
|
return ret;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
@ -1060,7 +1041,7 @@ static int DetectIsdataatTestParse15(void)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
data = (DetectIsdataatData *)s->sm_lists_tail[DETECT_SM_LIST_HSBDMATCH]->ctx;
|
|
|
|
|
if ( (data->flags & ISDATAAT_RELATIVE) ||
|
|
|
|
|
if ( !(data->flags & ISDATAAT_RELATIVE) ||
|
|
|
|
|
(data->flags & ISDATAAT_RAWBYTES) ||
|
|
|
|
|
!(data->flags & ISDATAAT_NEGATED) ) {
|
|
|
|
|
goto end;
|
|
|
|
|