suricata
detect-http-headers-stub.h
Go to the documentation of this file.
1/* Copyright (C) 2007-2019 Open Information Security Foundation
2 *
3 * You can copy, redistribute or modify this Program under the terms of
4 * the GNU General Public License version 2 as published by the Free
5 * Software Foundation.
6 *
7 * This program is distributed in the hope that it will be useful,
8 * but WITHOUT ANY WARRANTY; without even the implied warranty of
9 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
10 * GNU General Public License for more details.
11 *
12 * You should have received a copy of the GNU General Public License
13 * version 2 along with this program; if not, write to the Free Software
14 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
15 * 02110-1301, USA.
16 */
17
18/**
19 * Stub for per HTTP header detection keyword. Meant to be included into
20 * a C file.
21 */
22
23/**
24 * \ingroup httplayer
25 *
26 * @{
27 */
28
29#include "suricata-common.h"
30#include "flow.h"
31
32#include "htp/htp_rs.h"
33
34#include "detect.h"
35#include "detect-parse.h"
36#include "detect-engine.h"
38#include "detect-engine-mpm.h"
40
41#include "util-debug.h"
42#include "rust.h"
43
44static int g_buffer_id = 0;
45
46#ifdef KEYWORD_TOSERVER
47static InspectionBuffer *GetRequestData(DetectEngineThreadCtx *det_ctx,
48 const DetectEngineTransforms *transforms, Flow *_f,
49 const uint8_t _flow_flags, void *txv, const int list_id)
50{
51 SCEnter();
52
53 InspectionBuffer *buffer = InspectionBufferGet(det_ctx, list_id);
54 if (buffer->inspect == NULL) {
55 htp_tx_t *tx = (htp_tx_t *)txv;
56
57 if (htp_tx_request_headers(tx) == NULL)
58 return NULL;
59
60 const htp_header_t *h = htp_tx_request_header(tx, HEADER_NAME);
61 if (h == NULL || htp_header_value(h) == NULL) {
62 SCLogDebug("HTTP %s header not present in this request",
64 return NULL;
65 }
66
67 const uint32_t data_len = (uint32_t)htp_header_value_len(h);
68 const uint8_t *data = htp_header_value_ptr(h);
69
71 det_ctx, list_id, buffer, data, data_len, transforms);
72 }
73
74 return buffer;
75}
76
77static InspectionBuffer *GetRequestData2(DetectEngineThreadCtx *det_ctx,
78 const DetectEngineTransforms *transforms, Flow *_f, const uint8_t _flow_flags, void *txv,
79 const int list_id)
80{
81 SCEnter();
82
83 InspectionBuffer *buffer = InspectionBufferGet(det_ctx, list_id);
84 if (buffer->inspect == NULL) {
85 uint32_t b_len = 0;
86 const uint8_t *b = NULL;
87
88 if (SCHttp2TxGetHeaderValue(txv, STREAM_TOSERVER, HEADER_NAME, &b, &b_len) != 1)
89 return NULL;
90 if (b == NULL || b_len == 0)
91 return NULL;
92
93 InspectionBufferSetupAndApplyTransforms(det_ctx, list_id, buffer, b, b_len, transforms);
94 }
95
96 return buffer;
97}
98
99#endif
100#ifdef KEYWORD_TOCLIENT
101static InspectionBuffer *GetResponseData(DetectEngineThreadCtx *det_ctx,
102 const DetectEngineTransforms *transforms, Flow *_f,
103 const uint8_t _flow_flags, void *txv, const int list_id)
104{
105 SCEnter();
106
107 InspectionBuffer *buffer = InspectionBufferGet(det_ctx, list_id);
108 if (buffer->inspect == NULL) {
109 htp_tx_t *tx = (htp_tx_t *)txv;
110
111 if (htp_tx_response_headers(tx) == NULL)
112 return NULL;
113
114 const htp_header_t *h = htp_tx_response_header(tx, HEADER_NAME);
115 if (h == NULL || htp_header_value(h) == NULL) {
116 SCLogDebug("HTTP %s header not present in this request",
118 return NULL;
119 }
120
121 const uint32_t data_len = (uint32_t)htp_header_value_len(h);
122 const uint8_t *data = htp_header_value_ptr(h);
123
125 det_ctx, list_id, buffer, data, data_len, transforms);
126 }
127
128 return buffer;
129}
130
131static InspectionBuffer *GetResponseData2(DetectEngineThreadCtx *det_ctx,
132 const DetectEngineTransforms *transforms, Flow *_f, const uint8_t _flow_flags, void *txv,
133 const int list_id)
134{
135 SCEnter();
136
137 InspectionBuffer *buffer = InspectionBufferGet(det_ctx, list_id);
138 if (buffer->inspect == NULL) {
139 uint32_t b_len = 0;
140 const uint8_t *b = NULL;
141
142 if (SCHttp2TxGetHeaderValue(txv, STREAM_TOCLIENT, HEADER_NAME, &b, &b_len) != 1)
143 return NULL;
144 if (b == NULL || b_len == 0)
145 return NULL;
146
147 InspectionBufferSetupAndApplyTransforms(det_ctx, list_id, buffer, b, b_len, transforms);
148 }
149
150 return buffer;
151}
152#endif
153
154/**
155 * \brief this function setup the http.header keyword used in the rule
156 *
157 * \param de_ctx Pointer to the Detection Engine Context
158 * \param s Pointer to the Signature to which the current keyword belongs
159 * \param str Should hold an empty string always
160 *
161 * \retval 0 On success
162 */
163static int DetectHttpHeadersSetupSticky(DetectEngineCtx *de_ctx, Signature *s, const char *str)
164{
165 if (SCDetectBufferSetActiveList(de_ctx, s, g_buffer_id) < 0)
166 return -1;
167
169 return -1;
170
171 return 0;
172}
173
174static void DetectHttpHeadersRegisterStub(void)
175{
177#ifdef KEYWORD_NAME_LEGACY
179#endif
180 sigmatch_table[KEYWORD_ID].desc = KEYWORD_NAME " sticky buffer for the " BUFFER_DESC;
182 sigmatch_table[KEYWORD_ID].Setup = DetectHttpHeadersSetupSticky;
183#if defined(KEYWORD_TOSERVER) && defined(KEYWORD_TOSERVER)
186#else
188#endif
189
190#ifdef KEYWORD_TOSERVER
192 GetRequestData, ALPROTO_HTTP1, HTP_REQUEST_PROGRESS_HEADERS);
194 GetRequestData2, ALPROTO_HTTP2, HTTP2StateDataClient);
195#endif
196#ifdef KEYWORD_TOCLIENT
198 GetResponseData, ALPROTO_HTTP1, HTP_RESPONSE_PROGRESS_HEADERS);
200 GetResponseData2, ALPROTO_HTTP2, HTTP2StateDataServer);
201#endif
202#ifdef KEYWORD_TOSERVER
204 HTP_REQUEST_PROGRESS_HEADERS, DetectEngineInspectBufferGeneric, GetRequestData);
206 HTTP2StateDataClient, DetectEngineInspectBufferGeneric, GetRequestData2);
207#endif
208#ifdef KEYWORD_TOCLIENT
210 HTP_RESPONSE_PROGRESS_HEADERS, DetectEngineInspectBufferGeneric, GetResponseData);
212 HTTP2StateDataServer, DetectEngineInspectBufferGeneric, GetResponseData2);
213#endif
214
216
218}
@ ALPROTO_HTTP2
@ ALPROTO_HTTP
@ ALPROTO_HTTP1
#define BUFFER_NAME
int SCDetectBufferSetActiveList(DetectEngineCtx *de_ctx, Signature *s, const int list)
void InspectionBufferSetupAndApplyTransforms(DetectEngineThreadCtx *det_ctx, const int list_id, InspectionBuffer *buffer, const uint8_t *data, const uint32_t data_len, const DetectEngineTransforms *transforms)
setup the buffer with our initial data
InspectionBuffer * InspectionBufferGet(DetectEngineThreadCtx *det_ctx, const int list_id)
void DetectAppLayerMpmRegister(const char *name, int direction, int priority, PrefilterRegisterFunc PrefilterRegister, InspectionBufferGetDataPtr GetData, AppProto alproto, int tx_min_progress)
register an app layer keyword for mpm
int PrefilterGenericMpmRegister(DetectEngineCtx *de_ctx, SigGroupHead *sgh, MpmCtx *mpm_ctx, const DetectBufferMpmRegistry *mpm_reg, int list_id)
void DetectBufferTypeSetDescriptionByName(const char *name, const char *desc)
uint8_t DetectEngineInspectBufferGeneric(DetectEngineCtx *de_ctx, DetectEngineThreadCtx *det_ctx, const DetectEngineAppInspectionEngine *engine, const Signature *s, Flow *f, uint8_t flags, void *alstate, void *txv, uint64_t tx_id)
Do the content inspection & validation for a signature.
void DetectAppLayerInspectEngineRegister(const char *name, AppProto alproto, uint32_t dir, int progress, InspectEngineFuncPtr Callback, InspectionBufferGetDataPtr GetData)
Registers an app inspection engine.
int DetectBufferTypeGetByName(const char *name)
#define KEYWORD_DOC
#define BUFFER_DESC
#define KEYWORD_NAME
#define KEYWORD_NAME_LEGACY
#define HEADER_NAME
#define KEYWORD_ID
int SCDetectSignatureSetAppProto(Signature *s, AppProto alproto)
SigTableElmt * sigmatch_table
#define SIGMATCH_SUPPORT_DIR
Definition detect.h:1684
#define SIGMATCH_NOOPT
Definition detect.h:1651
#define SIG_FLAG_TOCLIENT
Definition detect.h:272
#define SIGMATCH_INFO_STICKY_BUFFER
Definition detect.h:1676
#define SIG_FLAG_TOSERVER
Definition detect.h:271
#define SIGMATCH_OPTIONAL_OPT
Definition detect.h:1661
DetectEngineCtx * de_ctx
main detection engine ctx
Definition detect.h:932
Flow data structure.
Definition flow.h:356
const char * url
Definition detect.h:1462
int(* Setup)(DetectEngineCtx *, Signature *, const char *)
Definition detect.h:1441
uint16_t flags
Definition detect.h:1450
const char * desc
Definition detect.h:1461
const char * alias
Definition detect.h:1460
const char * name
Definition detect.h:1459
Signature container.
Definition detect.h:668
#define str(s)
#define SCEnter(...)
Definition util-debug.h:277
#define SCLogDebug(...)
Definition util-debug.h:275