suricata
fuzz_applayerprotodetectgetproto.c
Go to the documentation of this file.
1 /**
2  * @file
3  * @author Philippe Antoine <contact@catenacyber.fr>
4  * fuzz target for AppLayerProtoDetectGetProto
5  */
6 
7 
8 #include "suricata-common.h"
9 #include "suricata.h"
10 #include "app-layer-detect-proto.h"
11 #include "flow-util.h"
12 #include "app-layer.h"
13 #include "util-unittest-helper.h"
14 #include "conf-yaml-loader.h"
15 #include "nallocinc.c"
16 
17 #define HEADER_LEN 6
18 
19 extern const char *configNoChecksum;
20 
21 int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size);
22 
24 SC_ATOMIC_EXTERN(unsigned int, engine_stage);
25 
26 int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size)
27 {
28  Flow *f;
29  TcpSession ssn;
30  bool reverse = false;
31 
32  if (alpd_tctx == NULL) {
33  //global init
34  InitGlobal();
37  abort();
38  }
39  MpmTableSetup();
40  SpmTableSetup();
42  AppLayerSetup();
44  SC_ATOMIC_SET(engine_stage, SURICATA_RUNTIME);
45  nalloc_init(NULL);
46  // do not restrict nalloc
47  }
48 
49  if (size < HEADER_LEN) {
50  return 0;
51  }
52 
53  f = TestHelperBuildFlow(AF_INET, "1.2.3.4", "5.6.7.8", (uint16_t)((data[2] << 8) | data[3]),
54  (uint16_t)((data[4] << 8) | data[5]));
55  if (f == NULL) {
56  return 0;
57  }
58  f->proto = data[1];
59  memset(&ssn, 0, sizeof(TcpSession));
60  f->protoctx = &ssn;
62 
63  uint8_t flags = STREAM_TOCLIENT;
64  if (data[0] & STREAM_TOSERVER) {
65  flags = STREAM_TOSERVER;
66  }
67  nalloc_start(data, size);
68  AppLayerProtoDetectGetProto(alpd_tctx, f, data + HEADER_LEN, (uint32_t)(size - HEADER_LEN),
69  f->proto, flags, &reverse);
70  nalloc_end();
71  FlowFree(f);
72 
73  return 0;
74 }
SCConfYamlLoadString
int SCConfYamlLoadString(const char *string, size_t len)
Load configuration from a YAML string.
Definition: conf-yaml-loader.c:535
flow-util.h
SC_ATOMIC_SET
#define SC_ATOMIC_SET(name, val)
Set the value for the atomic variable.
Definition: util-atomic.h:386
Flow_::proto
uint8_t proto
Definition: flow.h:370
HEADER_LEN
#define HEADER_LEN
Definition: fuzz_applayerprotodetectgetproto.c:17
Flow_
Flow data structure.
Definition: flow.h:348
Flow_::protomap
uint8_t protomap
Definition: flow.h:437
Flow_::protoctx
void * protoctx
Definition: flow.h:433
nallocinc.c
util-unittest-helper.h
SCRunmodeSet
void SCRunmodeSet(SCRunMode run_mode)
Set the current run mode.
Definition: suricata.c:288
AppLayerSetup
int AppLayerSetup(void)
Setup the app layer.
Definition: app-layer.c:1074
app-layer-detect-proto.h
AppLayerProtoDetectThreadCtx_
The app layer protocol detection thread context.
Definition: app-layer-detect-proto.c:179
SURICATA_RUNTIME
@ SURICATA_RUNTIME
Definition: suricata.h:101
EngineModeSetIDS
void EngineModeSetIDS(void)
Definition: suricata.c:268
SpmTableSetup
void SpmTableSetup(void)
Definition: util-spm.c:122
LLVMFuzzerTestOneInput
int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size)
Definition: fuzz_applayerprotodetectgetproto.c:26
RUNMODE_UNITTEST
@ RUNMODE_UNITTEST
Definition: runmodes.h:41
alpd_tctx
AppLayerProtoDetectThreadCtx * alpd_tctx
Definition: fuzz_applayerprotodetectgetproto.c:23
FlowGetProtoMapping
uint8_t FlowGetProtoMapping(uint8_t proto)
Function to map the protocol to the defined FLOW_PROTO_* enumeration.
Definition: flow-util.c:99
conf-yaml-loader.h
MpmTableSetup
void MpmTableSetup(void)
Definition: util-mpm.c:224
nalloc_init
#define nalloc_init(x)
Definition: nallocinc.c:49
flags
uint8_t flags
Definition: decode-gre.h:0
suricata-common.h
nalloc_start
#define nalloc_start(x, y)
Definition: nallocinc.c:51
FlowFree
void FlowFree(Flow *f)
cleanup & free the memory of a flow
Definition: flow-util.c:84
nalloc_end
#define nalloc_end()
Definition: nallocinc.c:52
SC_ATOMIC_EXTERN
SC_ATOMIC_EXTERN(unsigned int, engine_stage)
configNoChecksum
const char * configNoChecksum
Definition: confyaml.c:1
AppLayerProtoDetectGetProto
AppProto AppLayerProtoDetectGetProto(AppLayerProtoDetectThreadCtx *tctx, Flow *f, const uint8_t *buf, uint32_t buflen, uint8_t ipproto, uint8_t flags, bool *reverse_flow)
Returns the app layer protocol given a buffer.
Definition: app-layer-detect-proto.c:1394
AppLayerProtoDetectGetCtxThread
AppLayerProtoDetectThreadCtx * AppLayerProtoDetectGetCtxThread(void)
Inits and returns an app layer protocol detection thread context.
Definition: app-layer-detect-proto.c:1962
suricata.h
TestHelperBuildFlow
Flow * TestHelperBuildFlow(int family, const char *src, const char *dst, Port sp, Port dp)
Definition: util-unittest-helper.c:52
InitGlobal
int InitGlobal(void)
Global initialization common to all runmodes.
Definition: suricata.c:2986
TcpSession_
Definition: stream-tcp-private.h:283
app-layer.h