66 static inline int StateIsValid(uint16_t alproto,
void *alstate)
68 if (alstate != NULL) {
71 if (htp_state->
conn != NULL) {
90 #ifdef DEBUG_VALIDATION
98 for (; tx_store != NULL; tx_store = tx_store->
next) {
102 store_cnt++, state_cnt++)
105 if (item->
sid == num) {
106 SCLogDebug(
"sid %u already in state: %p %p %p %u %u, direction %s",
107 num, state, dir_state, tx_store, state_cnt,
108 store_cnt, direction & STREAM_TOSERVER ?
"toserver" :
"toclient");
118 const Signature *s, uint32_t inspect_flags, uint8_t direction)
123 &state->
dir_state[(direction & STREAM_TOSERVER) ? 0 : 1];
125 #ifdef DEBUG_VALIDATION
126 BUG_ON(DeStateSearchState(state, direction, s->
iid));
130 store = DeStateStoreAlloc();
131 dir_state->
head = store;
132 dir_state->
cur = store;
133 dir_state->
tail = store;
134 }
else if (dir_state->
cur) {
135 store = dir_state->
cur;
137 store = DeStateStoreAlloc();
140 dir_state->
tail = store;
141 dir_state->
cur = store;
174 for (i = 0; i < 2; i++) {
176 while (store != NULL) {
177 store_next = store->
next;
185 static void StoreFileNoMatchCnt(
DetectEngineState *de_state, uint16_t file_no_match, uint8_t direction)
187 de_state->
dir_state[(direction & STREAM_TOSERVER) ? 0 : 1].filestore_cnt += file_no_match;
200 const uint8_t flow_flags,
void *tx,
const uint64_t tx_id,
const uint16_t file_no_match)
202 SCLogDebug(
"tx %"PRIu64
", file_no_match %u", tx_id, file_no_match);
203 StoreFileNoMatchCnt(destate, file_no_match, flow_flags);
204 if (StoreFilestoreSigsCantMatch(sgh, destate, flow_flags)) {
207 f, flow_flags & (STREAM_TOCLIENT | STREAM_TOSERVER), tx, tx_id);
215 Flow *f,
void *tx, uint64_t tx_id,
217 uint32_t inspect_flags, uint8_t flow_flags,
218 const uint16_t file_no_match)
225 SCLogDebug(
"destate created for %"PRIu64, tx_id);
227 DeStateSignatureAppend(tx_data->
de_state, s, inspect_flags, flow_flags);
230 DeStateSignatureAppend(tx_data->
de_state, s, inspect_flags,
231 flow_flags ^ (STREAM_TOSERVER | STREAM_TOCLIENT));
233 StoreStateTxHandleFiles(sgh, f, tx_data->
de_state, flow_flags, tx, tx_id, file_no_match);
261 void *alstate = FlowGetAppState(f);
262 if (!StateIsValid(f->
alproto, alstate)) {
269 uint64_t inspect_tx_id =
MIN(inspect_ts, inspect_tc);
273 for ( ; inspect_tx_id < total_txs; inspect_tx_id++) {
275 if (inspect_tx != NULL) {
287 static int DeStateTest01(
void)
289 SCLogDebug(
"sizeof(DetectEngineState)\t\t%"PRIuMAX,
291 SCLogDebug(
"sizeof(DeStateStore)\t\t\t%"PRIuMAX,
293 SCLogDebug(
"sizeof(DeStateStoreItem)\t\t%"PRIuMAX
"",
299 static int DeStateTest02(
void)
301 uint8_t direction = STREAM_TOSERVER;
307 memset(&s, 0x00,
sizeof(s));
310 DeStateSignatureAppend(state, &s, 0, direction);
312 DeStateSignatureAppend(state, &s, 0, direction);
314 DeStateSignatureAppend(state, &s, 0, direction);
316 DeStateSignatureAppend(state, &s, 0, direction);
318 DeStateSignatureAppend(state, &s, 0, direction);
320 DeStateSignatureAppend(state, &s, 0, direction);
322 DeStateSignatureAppend(state, &s, 0, direction);
324 DeStateSignatureAppend(state, &s, 0, direction);
326 DeStateSignatureAppend(state, &s, 0, direction);
328 DeStateSignatureAppend(state, &s, 0, direction);
330 DeStateSignatureAppend(state, &s, 0, direction);
332 DeStateSignatureAppend(state, &s, 0, direction);
334 DeStateSignatureAppend(state, &s, 0, direction);
336 DeStateSignatureAppend(state, &s, 0, direction);
338 state->
dir_state[direction & STREAM_TOSERVER ? 0 : 1].
cur);
341 DeStateSignatureAppend(state, &s, 0, direction);
345 state->
dir_state[direction & STREAM_TOSERVER ? 0 : 1].
cur);
349 DeStateSignatureAppend(state, &s, 0, direction);
352 state->
dir_state[direction & STREAM_TOSERVER ? 0 : 1].
cur);
355 DeStateSignatureAppend(state, &s, 0, direction);
368 state->
dir_state[direction & STREAM_TOSERVER ? 0 : 1].
cur);
371 DeStateSignatureAppend(state, &s, 0, direction);
373 DeStateSignatureAppend(state, &s, 0, direction);
375 DeStateSignatureAppend(state, &s, 0, direction);
377 DeStateSignatureAppend(state, &s, 0, direction);
379 DeStateSignatureAppend(state, &s, 0, direction);
381 DeStateSignatureAppend(state, &s, 0, direction);
383 DeStateSignatureAppend(state, &s, 0, direction);
385 DeStateSignatureAppend(state, &s, 0, direction);
387 DeStateSignatureAppend(state, &s, 0, direction);
389 DeStateSignatureAppend(state, &s, 0, direction);
391 DeStateSignatureAppend(state, &s, 0, direction);
393 DeStateSignatureAppend(state, &s, 0, direction);
395 DeStateSignatureAppend(state, &s, 0, direction);
397 DeStateSignatureAppend(state, &s, 0, direction);
399 state->
dir_state[direction & STREAM_TOSERVER ? 0 : 1].
cur);
401 DeStateSignatureAppend(state, &s, 0, direction);
404 state->
dir_state[direction & STREAM_TOSERVER ? 0 : 1].
cur);
406 state->
dir_state[direction & STREAM_TOSERVER ? 0 : 1].
cur);
408 DeStateSignatureAppend(state, &s, 0, direction);
410 DeStateSignatureAppend(state, &s, 0, direction);
424 static int DeStateTest03(
void)
430 memset(&s, 0x00,
sizeof(s));
432 uint8_t direction = STREAM_TOSERVER;
435 DeStateSignatureAppend(state, &s, 0, direction);
449 static int DeStateSigTest01(
void)
456 uint8_t httpbuf1[] =
"POST / HTTP/1.0\r\n";
457 uint8_t httpbuf2[] =
"User-Agent: Mozilla/1.0\r\n";
458 uint8_t httpbuf3[] =
"Cookie: dummy\r\nContent-Length: 10\r\n\r\n";
459 uint8_t httpbuf4[] =
"Http Body!";
460 uint32_t httplen1 =
sizeof(httpbuf1) - 1;
461 uint32_t httplen2 =
sizeof(httpbuf2) - 1;
462 uint32_t httplen3 =
sizeof(httpbuf3) - 1;
463 uint32_t httplen4 =
sizeof(httpbuf4) - 1;
468 memset(&th_v, 0,
sizeof(th_v));
470 memset(&f, 0,
sizeof(f));
471 memset(&ssn, 0,
sizeof(ssn));
478 f.
proto = IPPROTO_TCP;
532 static int DeStateSigTest02(
void)
539 uint8_t httpbuf1[] =
"POST / HTTP/1.1\r\n";
540 uint8_t httpbuf2[] =
"User-Agent: Mozilla/1.0\r\nContent-Length: 10\r\n";
541 uint8_t httpbuf3[] =
"Cookie: dummy\r\n\r\n";
542 uint8_t httpbuf4[] =
"Http Body!";
543 uint32_t httplen1 =
sizeof(httpbuf1) - 1;
544 uint32_t httplen2 =
sizeof(httpbuf2) - 1;
545 uint32_t httplen3 =
sizeof(httpbuf3) - 1;
546 uint32_t httplen4 =
sizeof(httpbuf4) - 1;
547 uint8_t httpbuf5[] =
"GET /?var=val HTTP/1.1\r\n";
548 uint8_t httpbuf6[] =
"User-Agent: Firefox/1.0\r\n";
549 uint8_t httpbuf7[] =
"Cookie: dummy2\r\nContent-Length: 10\r\n\r\nHttp Body!";
550 uint32_t httplen5 =
sizeof(httpbuf5) - 1;
551 uint32_t httplen6 =
sizeof(httpbuf6) - 1;
552 uint32_t httplen7 =
sizeof(httpbuf7) - 1;
556 memset(&th_v, 0,
sizeof(th_v));
558 memset(&f, 0,
sizeof(f));
559 memset(&ssn, 0,
sizeof(ssn));
565 f.
proto = IPPROTO_TCP;
581 Signature *s =
DetectEngineAppendSig(
de_ctx,
"alert tcp any any -> any any (flow:to_server; content:\"POST\"; http_method; content:\"/\"; http_uri; content:\"Mozilla\"; http_header; content:\"dummy\"; http_cookie; content:\"body\"; nocase; http_client_body; sid:1; rev:1;)");
583 s =
DetectEngineAppendSig(
de_ctx,
"alert tcp any any -> any any (flow:to_server; content:\"GET\"; http_method; content:\"Firefox\"; http_header; content:\"dummy2\"; http_cookie; sid:2; rev:1;)");
648 static int DeStateSigTest03(
void)
650 uint8_t httpbuf1[] =
"POST /upload.cgi HTTP/1.1\r\n"
651 "Host: www.server.lan\r\n"
652 "Content-Type: multipart/form-data; boundary=---------------------------277531038314945\r\n"
653 "Content-Length: 215\r\n"
655 "-----------------------------277531038314945\r\n"
656 "Content-Disposition: form-data; name=\"uploadfile_0\"; filename=\"somepicture1.jpg\"\r\n"
657 "Content-Type: image/jpeg\r\n"
660 "-----------------------------277531038314945--";
661 uint32_t httplen1 =
sizeof(httpbuf1) - 1;
669 memset(&th_v, 0,
sizeof(th_v));
671 memset(&ssn, 0,
sizeof(ssn));
679 Signature *s =
DetectEngineAppendSig(
de_ctx,
"alert http any any -> any any (flow:to_server; content:\"POST\"; http_method; content:\"upload.cgi\"; http_uri; filestore; sid:1; rev:1;)");
685 f =
UTHBuildFlow(AF_INET,
"1.2.3.4",
"1.2.3.5", 1024, 80);
688 f->
proto = IPPROTO_TCP;
702 STREAM_TOSERVER | STREAM_START | STREAM_EOF, httpbuf1, httplen1);
735 static int DeStateSigTest04(
void)
737 uint8_t httpbuf1[] =
"POST /upload.cgi HTTP/1.1\r\n"
738 "Host: www.server.lan\r\n"
739 "Content-Type: multipart/form-data; boundary=---------------------------277531038314945\r\n"
740 "Content-Length: 215\r\n"
742 "-----------------------------277531038314945\r\n"
743 "Content-Disposition: form-data; name=\"uploadfile_0\"; filename=\"somepicture1.jpg\"\r\n"
744 "Content-Type: image/jpeg\r\n"
747 "-----------------------------277531038314945--";
748 uint32_t httplen1 =
sizeof(httpbuf1) - 1;
754 memset(&th_v, 0,
sizeof(th_v));
756 memset(&ssn, 0,
sizeof(ssn));
773 f->
proto = IPPROTO_TCP;
786 STREAM_TOSERVER | STREAM_START | STREAM_EOF, httpbuf1, httplen1);
816 static int DeStateSigTest05(
void)
818 uint8_t httpbuf1[] =
"POST /upload.cgi HTTP/1.1\r\n"
819 "Host: www.server.lan\r\n"
820 "Content-Type: multipart/form-data; boundary=---------------------------277531038314945\r\n"
821 "Content-Length: 215\r\n"
823 "-----------------------------277531038314945\r\n"
824 "Content-Disposition: form-data; name=\"uploadfile_0\"; filename=\"somepicture1.jpg\"\r\n"
825 "Content-Type: image/jpeg\r\n"
828 "-----------------------------277531038314945--";
829 uint32_t httplen1 =
sizeof(httpbuf1) - 1;
836 memset(&th_v, 0,
sizeof(th_v));
838 memset(&ssn, 0,
sizeof(ssn));
845 Signature *s =
DetectEngineAppendSig(
de_ctx,
"alert http any any -> any any (content:\"GET\"; http_method; content:\"upload.cgi\"; http_uri; filename:\"nomatch\"; sid:1; rev:1;)");
854 f->
proto = IPPROTO_TCP;
867 STREAM_TOSERVER | STREAM_START | STREAM_EOF, httpbuf1, httplen1);
901 static int DeStateSigTest06(
void)
903 uint8_t httpbuf1[] =
"POST /upload.cgi HTTP/1.1\r\n"
904 "Host: www.server.lan\r\n"
905 "Content-Type: multipart/form-data; boundary=---------------------------277531038314945\r\n"
906 "Content-Length: 215\r\n"
908 "-----------------------------277531038314945\r\n"
909 "Content-Disposition: form-data; name=\"uploadfile_0\"; filename=\"somepicture1.jpg\"\r\n"
910 "Content-Type: image/jpeg\r\n"
913 "-----------------------------277531038314945--";
914 uint32_t httplen1 =
sizeof(httpbuf1) - 1;
921 memset(&th_v, 0,
sizeof(th_v));
923 memset(&ssn, 0,
sizeof(ssn));
930 Signature *s =
DetectEngineAppendSig(
de_ctx,
"alert http any any -> any any (content:\"POST\"; http_method; content:\"upload.cgi\"; http_uri; filename:\"nomatch\"; filestore; sid:1; rev:1;)");
940 f->
proto = IPPROTO_TCP;
953 STREAM_TOSERVER | STREAM_START | STREAM_EOF, httpbuf1, httplen1);
985 static int DeStateSigTest07(
void)
987 uint8_t httpbuf1[] =
"POST /upload.cgi HTTP/1.1\r\n"
988 "Host: www.server.lan\r\n"
989 "Content-Type: multipart/form-data; boundary=---------------------------277531038314945\r\n"
990 "Content-Length: 215\r\n"
992 "-----------------------------277531038314945\r\n"
993 "Content-Disposition: form-data; name=\"uploadfile_0\"; filename=\"somepicture1.jpg\"\r\n"
994 "Content-Type: image/jpeg\r\n"
997 uint32_t httplen1 =
sizeof(httpbuf1) - 1;
998 uint8_t httpbuf2[] =
"filecontent\r\n"
999 "-----------------------------277531038314945--";
1000 uint32_t httplen2 =
sizeof(httpbuf2) - 1;
1007 memset(&th_v, 0,
sizeof(th_v));
1009 memset(&ssn, 0,
sizeof(ssn));
1025 f->
proto = IPPROTO_TCP;
1076 static int DeStateSigTest08(
void)
1078 uint8_t httpbuf1[] =
"POST /upload.cgi HTTP/1.1\r\n"
1079 "Host: www.server.lan\r\n"
1080 "Content-Type: multipart/form-data; boundary=---------------------------277531038314945\r\n"
1081 "Content-Length: 440\r\n"
1083 "-----------------------------277531038314945\r\n"
1084 "Content-Disposition: form-data; name=\"uploadfile_0\"; filename=\"AAAApicture1.jpg\"\r\n"
1085 "Content-Type: image/jpeg\r\n"
1088 uint32_t httplen1 =
sizeof(httpbuf1) - 1;
1089 uint8_t httpbuf2[] =
"file";
1090 uint32_t httplen2 =
sizeof(httpbuf2) - 1;
1091 uint8_t httpbuf3[] =
"content\r\n"
1092 "-----------------------------277531038314945\r\n";
1093 uint32_t httplen3 =
sizeof(httpbuf3) - 1;
1095 uint8_t httpbuf4[] =
"Content-Disposition: form-data; name=\"uploadfile_1\"; filename=\"BBBBpicture2.jpg\"\r\n"
1096 "Content-Type: image/jpeg\r\n"
1099 "-----------------------------277531038314945--";
1100 uint32_t httplen4 =
sizeof(httpbuf4) - 1;
1108 memset(&th_v, 0,
sizeof(th_v));
1110 memset(&ssn, 0,
sizeof(ssn));
1117 Signature *s =
DetectEngineAppendSig(
de_ctx,
"alert http any any -> any any (content:\"POST\"; http_method; content:\"upload.cgi\"; http_uri; filename:\"BBBBpicture\"; filestore; sid:1; rev:1;)");
1126 f->
proto = IPPROTO_TCP;
1182 tx_ud = htp_tx_get_user_data(tx);
1207 static int DeStateSigTest09(
void)
1209 uint8_t httpbuf1[] =
"POST /upload.cgi HTTP/1.1\r\n"
1210 "Host: www.server.lan\r\n"
1211 "Content-Type: multipart/form-data; boundary=---------------------------277531038314945\r\n"
1212 "Content-Length: 440\r\n"
1214 "-----------------------------277531038314945\r\n"
1215 "Content-Disposition: form-data; name=\"uploadfile_0\"; filename=\"somepicture1.jpg\"\r\n"
1216 "Content-Type: image/jpeg\r\n"
1219 uint32_t httplen1 =
sizeof(httpbuf1) - 1;
1220 uint8_t httpbuf2[] =
"file";
1221 uint32_t httplen2 =
sizeof(httpbuf2) - 1;
1222 uint8_t httpbuf3[] =
"content\r\n"
1223 "-----------------------------277531038314945\r\n";
1224 uint32_t httplen3 =
sizeof(httpbuf3) - 1;
1226 uint8_t httpbuf4[] =
"Content-Disposition: form-data; name=\"uploadfile_1\"; filename=\"somepicture2.jpg\"\r\n"
1227 "Content-Type: image/jpeg\r\n"
1230 "-----------------------------277531038314945--";
1231 uint32_t httplen4 =
sizeof(httpbuf4) - 1;
1239 memset(&th_v, 0,
sizeof(th_v));
1241 memset(&ssn, 0,
sizeof(ssn));
1248 Signature *s =
DetectEngineAppendSig(
de_ctx,
"alert http any any -> any any (content:\"POST\"; http_method; content:\"upload.cgi\"; http_uri; filename:\"somepicture\"; filestore; sid:1; rev:1;)");
1257 f->
proto = IPPROTO_TCP;
1313 tx_ud = htp_tx_get_user_data(tx);
1336 static int DeStateSigTest10(
void)
1338 uint8_t httpbuf1[] =
"POST /upload.cgi HTTP/1.1\r\n"
1339 "Host: www.server.lan\r\n"
1340 "Content-Type: multipart/form-data; boundary=---------------------------277531038314945\r\n"
1341 "Content-Length: 440\r\n"
1343 "-----------------------------277531038314945\r\n"
1344 "Content-Disposition: form-data; name=\"uploadfile_0\"; filename=\"somepicture1.jpg\"\r\n"
1345 "Content-Type: image/jpeg\r\n"
1348 uint32_t httplen1 =
sizeof(httpbuf1) - 1;
1349 uint8_t httpbuf2[] =
"file";
1350 uint32_t httplen2 =
sizeof(httpbuf2) - 1;
1351 uint8_t httpbuf3[] =
"content\r\n"
1352 "-----------------------------277531038314945\r\n";
1353 uint32_t httplen3 =
sizeof(httpbuf3) - 1;
1355 uint8_t httpbuf4[] =
"Content-Disposition: form-data; name=\"uploadfile_1\"; filename=\"somepicture2.jpg\"\r\n"
1356 "Content-Type: image/jpeg\r\n"
1359 "-----------------------------277531038314945--";
1360 uint32_t httplen4 =
sizeof(httpbuf4) - 1;
1368 memset(&th_v, 0,
sizeof(th_v));
1370 memset(&ssn, 0,
sizeof(ssn));
1386 f->
proto = IPPROTO_TCP;
1442 tx_ud = htp_tx_get_user_data(tx);