suricata
fuzz_decodepcapfile.c
Go to the documentation of this file.
1 /**
2  * @file
3  * @author Philippe Antoine <contact@catenacyber.fr>
4  * fuzz target for TMM_DECODEPCAPFILE
5  */
6 
7 #include "suricata-common.h"
8 #include "suricata.h"
10 #include "defrag.h"
11 #include "tm-modules.h"
12 #include "tm-threads.h"
13 #include "source-pcap-file.h"
14 #include "util-unittest-helper.h"
15 #include "conf-yaml-loader.h"
16 #include "util-time.h"
17 #include "util-conf.h"
18 #include "nallocinc.c"
19 
20 int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size);
21 
22 static int initialized = 0;
24 
25 const char configNoChecksum[] = "\
26 %YAML 1.1\n\
27 ---\n\
28 pcap-file:\n\
29 \n\
30  checksum-checks: no\n\
31 default-packet-size: 0\n\
32 ";
33 
36 SC_ATOMIC_EXTERN(unsigned int, engine_stage);
37 
38 int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size)
39 {
40  void *ptv = NULL;
41 
42  if (initialized == 0) {
43  //Redirects logs to /dev/null
44  setenv("SC_LOG_OP_IFACE", "file", 0);
45  setenv("SC_LOG_FILE", "/dev/null", 0);
46 
47  InitGlobal();
49 
50  //redirect logs to /tmp
51  ConfigSetLogDirectory("/tmp/");
52  //disables checksums validation for fuzzing
54  abort();
55  }
56 
58 
62 
64  "packetpool", "packetpool",
65  "packetpool", "packetpool",
66  "pktacqloop");
67  if (tv == NULL) {
68  return 0;
69  }
70  TmModule *tm_module = TmModuleGetByName("ReceivePcapFile");
71  if (tm_module == NULL) {
72  return 0;
73  }
74  TmSlotSetFuncAppend(tv, tm_module, "/tmp/fuzz.pcap");
75  tm_module = TmModuleGetByName("DecodePcapFile");
76  if (tm_module == NULL) {
77  return 0;
78  }
79  TmSlotSetFuncAppend(tv, tm_module, NULL);
80  tmm_modules[TMM_DECODEPCAPFILE].ThreadInit(tv, NULL, (void **) &dtv);
81  (void)SC_ATOMIC_SET(tv->tm_slots->slot_next->slot_data, dtv);
82 
83  extern uint32_t max_pending_packets;
84  max_pending_packets = 128;
86  SC_ATOMIC_SET(engine_stage, SURICATA_RUNTIME);
87 
88  nalloc_init(NULL);
89  // do not restrict nalloc
90  initialized = 1;
91  }
92 
93  //rewrite buffer to a file as libpcap does not have buffer inputs
94  if (TestHelperBufferToFile("/tmp/fuzz.pcap", data, size) < 0) {
95  return 0;
96  }
97 
98  nalloc_start(data, size);
99  if (tmm_modules[TMM_RECEIVEPCAPFILE].ThreadInit(tv, "/tmp/fuzz.pcap", &ptv) == TM_ECODE_OK && ptv != NULL) {
100  suricata_ctl_flags = 0;
103  }
104  nalloc_end();
105 
106  return 0;
107 }
SCConfYamlLoadString
int SCConfYamlLoadString(const char *string, size_t len)
Load configuration from a YAML string.
Definition: conf-yaml-loader.c:536
tm-threads.h
SURICATA_RUNTIME
@ SURICATA_RUNTIME
Definition: suricata.h:101
source-pcap-file.h
TmThreadCreatePacketHandler
ThreadVars * TmThreadCreatePacketHandler(const char *name, const char *inq_name, const char *inqh_name, const char *outq_name, const char *outqh_name, const char *slots)
Creates and returns a TV instance for a Packet Processing Thread. This function doesn't support custo...
Definition: tm-threads.c:1066
SC_ATOMIC_SET
#define SC_ATOMIC_SET(name, val)
Set the value for the atomic variable.
Definition: util-atomic.h:386
tm-modules.h
configNoChecksum
const char configNoChecksum[]
Definition: fuzz_decodepcapfile.c:25
nallocinc.c
util-unittest-helper.h
TmModule_::PktAcqLoop
TmEcode(* PktAcqLoop)(ThreadVars *, void *, void *)
Definition: tm-modules.h:58
TM_ECODE_OK
@ TM_ECODE_OK
Definition: tm-threads-common.h:81
PacketPoolInit
void PacketPoolInit(void)
Definition: tmqh-packetpool.c:235
SCRunmodeSet
void SCRunmodeSet(SCRunMode run_mode)
Set the current run mode.
Definition: suricata.c:306
TmModule_::ThreadDeinit
TmEcode(* ThreadDeinit)(ThreadVars *, void *)
Definition: tm-modules.h:53
TmModuleGetByName
TmModule * TmModuleGetByName(const char *name)
get a tm module ptr by name
Definition: tm-modules.c:46
app-layer-detect-proto.h
RunModeInitializeThreadSettings
void RunModeInitializeThreadSettings(void)
Definition: runmodes.c:962
surifuzz
SCInstance surifuzz
Definition: fuzz_decodepcapfile.c:23
ThreadVars_::tm_slots
struct TmSlot_ * tm_slots
Definition: threadvars.h:95
TMM_RECEIVEPCAPFILE
@ TMM_RECEIVEPCAPFILE
Definition: tm-threads-common.h:39
ThreadVars_
Per thread variable structure.
Definition: threadvars.h:58
TestHelperBufferToFile
int TestHelperBufferToFile(const char *name, const uint8_t *data, size_t size)
writes the contents of a buffer into a file
Definition: util-unittest-helper.c:103
util-time.h
SC_ATOMIC_EXTERN
SC_ATOMIC_EXTERN(unsigned int, engine_stage)
PostConfLoadedSetup
int PostConfLoadedSetup(SCInstance *suri)
Definition: suricata.c:2820
tmm_modules
TmModule tmm_modules[TMM_SIZE]
Definition: tm-modules.c:29
conf-yaml-loader.h
TMM_DECODEPCAPFILE
@ TMM_DECODEPCAPFILE
Definition: tm-threads-common.h:41
defrag.h
setenv
void setenv(const char *name, const char *value, int overwrite)
max_pending_packets
uint32_t max_pending_packets
Definition: suricata.c:187
TmModule_
Definition: tm-modules.h:47
dtv
DecodeThreadVars * dtv
Definition: fuzz_decodepcapfile.c:35
TmSlotSetFuncAppend
void TmSlotSetFuncAppend(ThreadVars *tv, TmModule *tm, const void *data)
Appends a new entry to the slots.
Definition: tm-threads.c:660
nalloc_init
#define nalloc_init(x)
Definition: nallocinc.c:49
util-conf.h
TimeModeSetOffline
void TimeModeSetOffline(void)
Definition: util-time.c:106
suricata-common.h
nalloc_start
#define nalloc_start(x, y)
Definition: nallocinc.c:51
TmModule_::ThreadInit
TmEcode(* ThreadInit)(ThreadVars *, const void *, void **)
Definition: tm-modules.h:51
nalloc_end
#define nalloc_end()
Definition: nallocinc.c:52
tv
ThreadVars * tv
Definition: fuzz_decodepcapfile.c:34
ConfigSetLogDirectory
TmEcode ConfigSetLogDirectory(const char *name)
Definition: util-conf.c:33
DecodeThreadVars_
Structure to hold thread specific data for all decode modules.
Definition: decode.h:995
PcapFileGlobalInit
void PcapFileGlobalInit(void)
Definition: source-pcap-file.c:147
suricata.h
SCInstance_
Definition: suricata.h:134
TmSlot_::slot_next
struct TmSlot_ * slot_next
Definition: tm-threads.h:62
InitGlobal
int InitGlobal(void)
Global initialization common to all runmodes.
Definition: suricata.c:3069
RUNMODE_PCAP_FILE
@ RUNMODE_PCAP_FILE
Definition: runmodes.h:30
LLVMFuzzerTestOneInput
int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size)
Definition: fuzz_decodepcapfile.c:38
suricata_ctl_flags
volatile uint8_t suricata_ctl_flags
Definition: suricata.c:176