suricata
detect-base64-data.c
Go to the documentation of this file.
1 /* Copyright (C) 2015 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 #include "suricata-common.h"
19 #include "detect.h"
20 #include "detect-engine.h"
22 #include "detect-parse.h"
23 #include "detect-base64-data.h"
24 #include "detect-engine-build.h"
25 
26 
27 static int DetectBase64DataSetup(DetectEngineCtx *, Signature *, const char *);
28 #ifdef UNITTESTS
29 static void DetectBase64DataRegisterTests(void);
30 #endif
31 
33 {
34  sigmatch_table[DETECT_BASE64_DATA].name = "base64_data";
36  "Content match base64 decoded data.";
38  "/rules/base64-keywords.html#base64-data";
39  sigmatch_table[DETECT_BASE64_DATA].Setup = DetectBase64DataSetup;
40 #ifdef UNITTESTS
42  DetectBase64DataRegisterTests;
43 #endif
45 }
46 
47 static int DetectBase64DataSetup(DetectEngineCtx *de_ctx, Signature *s,
48  const char *str)
49 {
50  SigMatch *pm = NULL;
51 
52  /* Check for a preceding base64_decode. */
54  if (pm == NULL) {
55  SCLogError("\"base64_data\" keyword seen without preceding base64_decode.");
56  return -1;
57  }
58 
60  return 0;
61 }
62 
63 #ifdef UNITTESTS
64 
65 static int g_file_data_buffer_id = 0;
66 
67 static int DetectBase64DataSetupTest01(void)
68 {
71 
72  de_ctx->flags |= DE_QUIET;
74  "alert smtp any any -> any any (msg:\"DetectBase64DataSetupTest\"; "
75  "base64_decode; base64_data; content:\"content\"; sid:1; rev:1;)");
76  FAIL_IF_NULL(s);
77 
79  FAIL_IF_NULL(sm);
82 
84  PASS;
85 }
86 
87 /**
88  * \test Test that the list can be changed to post-detection lists
89  * after the base64 keyword.
90  */
91 static int DetectBase64DataSetupTest04(void)
92 {
95 
96  de_ctx->flags |= DE_QUIET;
98  "alert tcp any any -> any any (msg:\"some b64thing\"; flow:established,from_server; "
99  "file_data; content:\"sometext\"; fast_pattern; base64_decode:relative; base64_data; "
100  "content:\"foobar\"; nocase; tag:session,120,seconds; sid:1111111; rev:1;)");
101  FAIL_IF_NULL(s);
102 
104  PASS;
105 }
106 
107 static void DetectBase64DataRegisterTests(void)
108 {
109  g_file_data_buffer_id = DetectBufferTypeGetByName("file_data");
110 
111  UtRegisterTest("DetectBase64DataSetupTest01", DetectBase64DataSetupTest01);
112  UtRegisterTest("DetectBase64DataSetupTest04", DetectBase64DataSetupTest04);
113 }
114 #endif /* UNITTESTS */
SigTableElmt_::url
const char * url
Definition: detect.h:1545
detect-engine.h
DETECT_SM_LIST_PMATCH
@ DETECT_SM_LIST_PMATCH
Definition: detect.h:120
SIGMATCH_NOOPT
#define SIGMATCH_NOOPT
Definition: detect-engine-register.h:308
FAIL_IF_NULL
#define FAIL_IF_NULL(expr)
Fail a test if expression evaluates to NULL.
Definition: util-unittest.h:89
SignatureInitData_::smlists
struct SigMatch_ * smlists[DETECT_SM_LIST_MAX]
Definition: detect.h:666
SigTableElmt_::desc
const char * desc
Definition: detect.h:1544
sigmatch_table
SigTableElmt * sigmatch_table
Definition: detect-parse.c:78
SigTableElmt_::name
const char * name
Definition: detect.h:1542
UtRegisterTest
void UtRegisterTest(const char *name, int(*TestFn)(void))
Register unit test.
Definition: util-unittest.c:101
SigTableElmt_::flags
uint32_t flags
Definition: detect.h:1533
SCDetectGetLastSMFromLists
SigMatch * SCDetectGetLastSMFromLists(const Signature *s,...)
Returns the sm with the largest index (added latest) from the lists passed to us.
Definition: detect-parse.c:600
DetectEngineCtx_
main detection engine ctx
Definition: detect.h:995
DetectEngineCtxFree
void DetectEngineCtxFree(DetectEngineCtx *)
Free a DetectEngineCtx::
Definition: detect-engine.c:2912
DE_QUIET
#define DE_QUIET
Definition: detect.h:334
DETECT_BASE64_DATA
@ DETECT_BASE64_DATA
Definition: detect-engine-register.h:98
DetectEngineAppendSig
Signature * DetectEngineAppendSig(DetectEngineCtx *, const char *)
Parse and append a Signature into the Detection Engine Context signature list.
Definition: detect-parse.c:3965
SigTableElmt_::Setup
int(* Setup)(DetectEngineCtx *, Signature *, const char *)
Definition: detect.h:1524
FAIL_IF_NOT
#define FAIL_IF_NOT(expr)
Fail a test if expression evaluates to false.
Definition: util-unittest.h:82
DetectBufferTypeGetByName
int DetectBufferTypeGetByName(const char *name)
Definition: detect-engine.c:1452
detect-base64-data.h
PASS
#define PASS
Pass the test.
Definition: util-unittest.h:105
de_ctx
DetectEngineCtx * de_ctx
Definition: fuzz_siginit.c:22
DETECT_SM_LIST_BASE64_DATA
@ DETECT_SM_LIST_BASE64_DATA
Definition: detect.h:125
SignatureInitData_::list
int list
Definition: detect.h:645
detect.h
detect-engine-build.h
Signature_::init_data
SignatureInitData * init_data
Definition: detect.h:775
detect-engine-content-inspection.h
DetectBase64DataRegister
void DetectBase64DataRegister(void)
Definition: detect-base64-data.c:32
suricata-common.h
SigMatch_::type
uint16_t type
Definition: detect.h:361
str
#define str(s)
Definition: suricata-common.h:313
SCLogError
#define SCLogError(...)
Macro used to log ERROR messages.
Definition: util-debug.h:274
detect-parse.h
Signature_
Signature container.
Definition: detect.h:692
SigMatch_
a single match condition for a signature
Definition: detect.h:360
DetectEngineCtxInit
DetectEngineCtx * DetectEngineCtxInit(void)
Definition: detect-engine.c:2873
DETECT_BASE64_DECODE
@ DETECT_BASE64_DECODE
Definition: detect-engine-register.h:97
DetectEngineCtx_::flags
uint8_t flags
Definition: detect.h:997
SigTableElmt_::RegisterTests
void(* RegisterTests)(void)
Definition: detect.h:1531