]> git.ipfire.org Git - thirdparty/suricata.git/commitdiff
QA: --afl-rules for faster rule fuzzing
authorVictor Julien <victor@inliniac.net>
Fri, 15 Apr 2016 05:47:55 +0000 (07:47 +0200)
committerVictor Julien <victor@inliniac.net>
Fri, 15 Apr 2016 13:41:15 +0000 (15:41 +0200)
configure.ac
src/detect-parse.c
src/detect-parse.h
src/suricata.c

index a54cc7d4b41aabc4ac56b607256051a58e5c226f..16ca5edd4fd6622d0863a97119ecf597dc6d9960 100644 (file)
         AC_DEFINE([AFLFUZZ_MIME], [1], [Enable --afl-mime commandline option])
         AC_DEFINE([AFLFUZZ_DECODER], [1], [Enable --afl-decoder-$proto commandline option])
         AC_DEFINE([AFLFUZZ_DER], [1], [Enable --afl-der commandline option])
+        AC_DEFINE([AFLFUZZ_RULES], [1], [Enable --afl-rules commandline option])
 
         # test for AFL PERSISTANT_MODE support
         CFLAGS_ORIG=$CFLAGS
index ca08ceaf76ac1421819add0263710bd42e4a401a..e28154ad7fbce4f0edefc6a580db4448e95664b7 100644 (file)
@@ -2019,6 +2019,51 @@ void DetectSetupParseRegexes(const char *parse_str,
     return;
 }
 
+#ifdef AFLFUZZ_RULES
+#include "util-reference-config.h"
+int RuleParseDataFromFile(char *filename)
+{
+    char buffer[65536];
+
+    SigTableSetup();
+    SigParsePrepare();
+    SCReferenceConfInit();
+    SCClassConfInit();
+
+    DetectEngineCtx *de_ctx = DetectEngineCtxInit();
+    if (de_ctx == NULL)
+        return 0;
+
+#ifdef AFLFUZZ_PERSISTANT_MODE
+    while (__AFL_LOOP(10000)) {
+        /* reset state */
+        memset(buffer, 0, sizeof(buffer));
+#endif /* AFLFUZZ_PERSISTANT_MODE */
+
+        FILE *fp = fopen(filename, "r");
+        BUG_ON(fp == NULL);
+
+        size_t result = fread(&buffer, 1, sizeof(buffer), fp);
+        if (result < sizeof(buffer)) {
+            buffer[result] = '\0';
+            Signature *s = SigInit(de_ctx, buffer);
+            if (s != NULL) {
+                SigFree(s);
+            }
+        }
+        fclose(fp);
+
+#ifdef AFLFUZZ_PERSISTANT_MODE
+    }
+#endif /* AFLFUZZ_PERSISTANT_MODE */
+
+    DetectEngineCtxFree(de_ctx);
+    SCClassConfDeinit();
+    SCReferenceConfDeinit();
+    return 0;
+}
+#endif /* AFLFUZZ_RULES */
+
 /*
  * TESTS
  */
index bdc82ef15c02c33d093687a3856c31b6b79c5089..e780b86ad67ed136bc4bfa9c8fdd2a9950147948 100644 (file)
@@ -75,5 +75,9 @@ void DetectSetupParseRegexes(const char *parse_str,
 void DetectParseRegexAddToFreeList(pcre *regex, pcre_extra *study);
 void DetectParseFreeRegexes(void);
 
+#ifdef AFLFUZZ_RULES
+int RuleParseDataFromFile(char *filename);
+#endif
+
 #endif /* __DETECT_PARSE_H__ */
 
index 85a7a51637da973b1bb9c1a133a1d13676737869..ee0d40fff737a5db5ad608af1da00804edf2fa9e 100644 (file)
@@ -1223,6 +1223,7 @@ static TmEcode ParseCommandLine(int argc, char** argv, SCInstance *suri)
         {"netmap", optional_argument, 0, 0},
         {"pcap", optional_argument, 0, 0},
         {"simulate-ips", 0, 0 , 0},
+        {"afl-rules", required_argument, 0 , 0},
         {"afl-http-request", required_argument, 0 , 0},
         {"afl-http", required_argument, 0 , 0},
         {"afl-tls-request", required_argument, 0 , 0},
@@ -1382,6 +1383,10 @@ static TmEcode ParseCommandLine(int argc, char** argv, SCInstance *suri)
                 if (ParseCommandLinePcapLive(suri, optarg) != TM_ECODE_OK) {
                     return TM_ECODE_FAILED;
                 }
+#ifdef AFLFUZZ_RULES
+            } else if(strcmp((long_opts[option_index]).name, "afl-rules") == 0) {
+                exit(RuleParseDataFromFile(optarg));
+#endif
 #ifdef AFLFUZZ_APPLAYER
             } else if(strcmp((long_opts[option_index]).name, "afl-http-request") == 0) {
                 //printf("arg: //%s\n", optarg);