fuzz: extend fuzz_siginit to do engine-rule-analysis

pull/15432/head
Philippe Antoine 6 months ago committed by Victor Julien
parent efe3b16aac
commit 87db89ea4e

@ -1311,7 +1311,7 @@ endif
# force usage of CXX for linker # force usage of CXX for linker
nodist_EXTRA_fuzz_applayerparserparse_SOURCES = force-cxx-linking.cxx nodist_EXTRA_fuzz_applayerparserparse_SOURCES = force-cxx-linking.cxx
fuzz_siginit_SOURCES = tests/fuzz/fuzz_siginit.c fuzz_siginit_SOURCES = tests/fuzz/fuzz_siginit.c tests/fuzz/confyaml.c
fuzz_siginit_LDFLAGS = $(LDFLAGS_FUZZ) fuzz_siginit_LDFLAGS = $(LDFLAGS_FUZZ)
fuzz_siginit_LDADD = $(LDADD_FUZZ) fuzz_siginit_LDADD = $(LDADD_FUZZ)
fuzz_siginit_DEPENDENCIES = libsuricata_c.a $(RUST_SURICATA_LIB) fuzz_siginit_DEPENDENCIES = libsuricata_c.a $(RUST_SURICATA_LIB)

@ -12,46 +12,54 @@
#include "detect-parse.h" #include "detect-parse.h"
#include "app-layer.h" #include "app-layer.h"
#include "nallocinc.c" #include "nallocinc.c"
#include "detect-engine-analyzer.h"
#include "detect-engine-build.h"
#include "util-conf.h"
#include "conf-yaml-loader.h"
int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size); int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size);
static uint32_t cnt = 0;
DetectEngineCtx *de_ctx = NULL; DetectEngineCtx *de_ctx = NULL;
static int initialized = 0; static int initialized = 0;
SC_ATOMIC_EXTERN(unsigned int, engine_stage); SC_ATOMIC_EXTERN(unsigned int, engine_stage);
bool fp_engine_analysis_set;
extern bool rule_engine_analysis_set;
extern const char *configNoChecksum;
SCInstance surifuzz;
int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size)
{ {
if (de_ctx == NULL) { if (initialized == 0) {
// Redirects logs to /dev/null
setenv("SC_LOG_OP_IFACE", "file", 0); setenv("SC_LOG_OP_IFACE", "file", 0);
setenv("SC_LOG_FILE", "/dev/null", 0); setenv("SC_LOG_FILE", "/dev/null", 0);
//global init
InitGlobal(); InitGlobal();
rule_engine_analysis_set = true;
GlobalsInitPreConfig(); GlobalsInitPreConfig();
SCRunmodeSet(RUNMODE_UNITTEST); SCRunmodeSet(RUNMODE_ENGINE_ANALYSIS);
MpmTableSetup(); ConfigSetLogDirectory("/tmp/");
SpmTableSetup(); // disables checksums validation for fuzzing
EngineModeSetIDS(); if (SCConfYamlLoadString(configNoChecksum, strlen(configNoChecksum)) != 0) {
SigTableInit(); abort();
AppLayerSetup();
SigTableSetup();
if (initialized == 0) {
nalloc_init(NULL);
nalloc_restrict_file_prefix(3);
SC_ATOMIC_SET(engine_stage, SURICATA_RUNTIME);
initialized = 1;
} }
} SCConfSetFinal("engine-analysis.rules", "true");
if (cnt++ == 1024) { surifuzz.sig_file_exclusive = 1;
DetectEngineCtxFree(de_ctx); // loads rules after init
de_ctx = NULL; surifuzz.delayed_detect = 1;
cnt = 0; PostConfLoadedSetup(&surifuzz);
PostConfLoadedDetectSetup(&surifuzz);
nalloc_init(NULL);
nalloc_restrict_file_prefix(3);
SC_ATOMIC_SET(engine_stage, SURICATA_RUNTIME);
initialized = 1;
} }
if (de_ctx == NULL) { if (de_ctx == NULL) {
de_ctx = DetectEngineCtxInit(); de_ctx = DetectEngineCtxInit();
BUG_ON(de_ctx == NULL); BUG_ON(de_ctx == NULL);
de_ctx->flags |= DE_QUIET;
de_ctx->rule_file = (char *)"fuzzer"; de_ctx->rule_file = (char *)"fuzzer";
SetupEngineAnalysis(de_ctx, &fp_engine_analysis_set, &rule_engine_analysis_set);
} }
char * buffer = malloc(size+1); char * buffer = malloc(size+1);
@ -60,14 +68,15 @@ int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size)
//null terminate string //null terminate string
buffer[size] = 0; buffer[size] = 0;
nalloc_start(data, size); nalloc_start(data, size);
Signature *s = SigInit(de_ctx, buffer); Signature *sig = DetectEngineAppendSig(de_ctx, buffer);
free(buffer); if (sig) {
if (s && s->next) { SigGroupBuild(de_ctx);
SigFree(de_ctx, s->next);
s->next = NULL;
} }
SigFree(de_ctx, s); CleanupEngineAnalysis(de_ctx);
DetectEngineCtxFree(de_ctx);
nalloc_end(); nalloc_end();
de_ctx = NULL;
free(buffer);
} }
return 0; return 0;

Loading…
Cancel
Save