[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PATCH v5 07/16] fuzz: Add support for custom crossover functions
From: |
Alexander Bulekov |
Subject: |
[PATCH v5 07/16] fuzz: Add support for custom crossover functions |
Date: |
Tue, 20 Oct 2020 21:07:43 -0400 |
libfuzzer supports a "custom crossover function". Libfuzzer often tries
to blend two inputs to create a new interesting input. Sometimes, we
have a better idea about how to blend inputs together. This change
allows fuzzers to specify a custom function for blending two inputs
together.
Signed-off-by: Alexander Bulekov <alxndr@bu.edu>
Reviewed-by: Darren Kenny <darren.kenny@oracle.com>
---
tests/qtest/fuzz/fuzz.c | 13 +++++++++++++
tests/qtest/fuzz/fuzz.h | 27 +++++++++++++++++++++++++++
2 files changed, 40 insertions(+)
diff --git a/tests/qtest/fuzz/fuzz.c b/tests/qtest/fuzz/fuzz.c
index eb0070437f..7be7226bc0 100644
--- a/tests/qtest/fuzz/fuzz.c
+++ b/tests/qtest/fuzz/fuzz.c
@@ -118,6 +118,19 @@ static FuzzTarget *fuzz_get_target(char* name)
}
+/* Sometimes called by libfuzzer to mutate two inputs into one */
+size_t LLVMFuzzerCustomCrossOver(const uint8_t *data1, size_t size1,
+ const uint8_t *data2, size_t size2,
+ uint8_t *out, size_t max_out_size,
+ unsigned int seed)
+{
+ if (fuzz_target->crossover) {
+ return fuzz_target->crossover(data1, size1, data2, size2, out,
+ max_out_size, seed);
+ }
+ return 0;
+}
+
/* Executed for each fuzzing-input */
int LLVMFuzzerTestOneInput(const unsigned char *Data, size_t Size)
{
diff --git a/tests/qtest/fuzz/fuzz.h b/tests/qtest/fuzz/fuzz.h
index 8eb765edc8..ed9ce17154 100644
--- a/tests/qtest/fuzz/fuzz.h
+++ b/tests/qtest/fuzz/fuzz.h
@@ -77,6 +77,29 @@ typedef struct FuzzTarget {
*/
void(*fuzz)(QTestState *, const unsigned char *, size_t);
+ /*
+ * The fuzzer can specify a "Custom Crossover" function for combining two
+ * inputs from the corpus. This function is sometimes called by libfuzzer
+ * when mutating inputs.
+ *
+ * data1: location of first input
+ * size1: length of first input
+ * data1: location of second input
+ * size1: length of second input
+ * out: where to place the resulting, mutated input
+ * max_out_size: the maximum length of the input that can be placed in out
+ * seed: the seed that should be used to make mutations deterministic, when
+ * needed
+ *
+ * See libfuzzer's LLVMFuzzerCustomCrossOver API for more info.
+ *
+ * Can be NULL
+ */
+ size_t(*crossover)(const uint8_t *data1, size_t size1,
+ const uint8_t *data2, size_t size2,
+ uint8_t *out, size_t max_out_size,
+ unsigned int seed);
+
} FuzzTarget;
void flush_events(QTestState *);
@@ -91,6 +114,10 @@ void fuzz_qtest_set_serialize(bool option);
*/
void fuzz_add_target(const FuzzTarget *target);
+size_t LLVMFuzzerCustomCrossOver(const uint8_t *data1, size_t size1,
+ const uint8_t *data2, size_t size2,
+ uint8_t *out, size_t max_out_size,
+ unsigned int seed);
int LLVMFuzzerTestOneInput(const unsigned char *Data, size_t Size);
int LLVMFuzzerInitialize(int *argc, char ***argv, char ***envp);
--
2.28.0
- [PATCH v5 00/16] Add a Generic Virtual Device Fuzzer, Alexander Bulekov, 2020/10/20
- [PATCH v5 01/16] memory: Add FlatView foreach function, Alexander Bulekov, 2020/10/20
- [PATCH v5 02/16] fuzz: Add general virtual-device fuzzer, Alexander Bulekov, 2020/10/20
- [PATCH v5 03/16] fuzz: Add PCI features to the general fuzzer, Alexander Bulekov, 2020/10/20
- [PATCH v5 04/16] fuzz: Add DMA support to the generic-fuzzer, Alexander Bulekov, 2020/10/20
- [PATCH v5 05/16] fuzz: Declare DMA Read callback function, Alexander Bulekov, 2020/10/20
- [PATCH v5 06/16] fuzz: Add fuzzer callbacks to DMA-read functions, Alexander Bulekov, 2020/10/20
- [PATCH v5 07/16] fuzz: Add support for custom crossover functions,
Alexander Bulekov <=
- [PATCH v5 08/16] fuzz: add a DISABLE_PCI op to general-fuzzer, Alexander Bulekov, 2020/10/20
- [PATCH v5 09/16] fuzz: add a crossover function to generic-fuzzer, Alexander Bulekov, 2020/10/20
- [PATCH v5 10/16] scripts/oss-fuzz: Add script to reorder a general-fuzzer trace, Alexander Bulekov, 2020/10/20
- [PATCH v5 11/16] scripts/oss-fuzz: Add crash trace minimization script, Alexander Bulekov, 2020/10/20
- [PATCH v5 12/16] fuzz: Add instructions for using general-fuzz, Alexander Bulekov, 2020/10/20
- [PATCH v5 13/16] fuzz: add an "opaque" to the FuzzTarget struct, Alexander Bulekov, 2020/10/20
- [PATCH v5 14/16] fuzz: add general-fuzz configs for oss-fuzz, Alexander Bulekov, 2020/10/20
- [PATCH v5 15/16] fuzz: register predefined general-fuzz configs, Alexander Bulekov, 2020/10/20
- [PATCH v5 16/16] scripts/oss-fuzz: remove the general-fuzz target, Alexander Bulekov, 2020/10/20
- Re: [PATCH v5 00/16] Add a Generic Virtual Device Fuzzer, Thomas Huth, 2020/10/21