| OLD | NEW |
| 1 ========================= | 1 ========================= |
| 2 Tips for parallel fuzzing | 2 Tips for parallel fuzzing |
| 3 ========================= | 3 ========================= |
| 4 | 4 |
| 5 This document talks about synchronizing afl-fuzz jobs on a single machine | 5 This document talks about synchronizing afl-fuzz jobs on a single machine |
| 6 or across a fleet of systems. See README for the general instruction manual. | 6 or across a fleet of systems. See README for the general instruction manual. |
| 7 | 7 |
| 8 1) Introduction | 8 1) Introduction |
| 9 --------------- | 9 --------------- |
| 10 | 10 |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 44 $ ./afl-fuzz -i testcase_dir -o sync_dir -S fuzzer03 [...other stuff...] | 44 $ ./afl-fuzz -i testcase_dir -o sync_dir -S fuzzer03 [...other stuff...] |
| 45 | 45 |
| 46 Each fuzzer will keep its state in a separate subdirectory, like so: | 46 Each fuzzer will keep its state in a separate subdirectory, like so: |
| 47 | 47 |
| 48 /path/to/sync_dir/fuzzer01/ | 48 /path/to/sync_dir/fuzzer01/ |
| 49 | 49 |
| 50 Each instance will also periodically rescan the top-level sync directory | 50 Each instance will also periodically rescan the top-level sync directory |
| 51 for any test cases found by other fuzzers - and will incorporate them into | 51 for any test cases found by other fuzzers - and will incorporate them into |
| 52 its own fuzzing when they are deemed interesting enough. | 52 its own fuzzing when they are deemed interesting enough. |
| 53 | 53 |
| 54 The only difference between the -M and -S modes is that the master instance | 54 The difference between the -M and -S modes is that the master instance will |
| 55 will still perform deterministic checks; while the secondary instances will | 55 still perform deterministic checks; while the secondary instances will |
| 56 proceed straight to random tweaks. If you don't want to do deterministic | 56 proceed straight to random tweaks. If you don't want to do deterministic |
| 57 fuzzing at all, it's OK to run all instances with -S. With very slow or complex | 57 fuzzing at all, it's OK to run all instances with -S. With very slow or complex |
| 58 targets, or when running heavily parallelized jobs, this is usually a good plan. | 58 targets, or when running heavily parallelized jobs, this is usually a good plan. |
| 59 | 59 |
| 60 You can monitor the progress of your jobs from the command line with the | 60 Note that running multiple -M instances is wasteful, although there is an |
| 61 experimental support for parallelizing the deterministic checks. To leverage |
| 62 that, you need to create -M instances like so: |
| 63 |
| 64 $ ./afl-fuzz -i testcase_dir -o sync_dir -M masterA:1/3 [...] |
| 65 $ ./afl-fuzz -i testcase_dir -o sync_dir -M masterB:2/3 [...] |
| 66 $ ./afl-fuzz -i testcase_dir -o sync_dir -M masterC:3/3 [...] |
| 67 |
| 68 ...where the first value after ':' is the sequential ID of a particular master |
| 69 instance (starting at 1), and the second value is the total number of fuzzers to |
| 70 distribute the deterministic fuzzing across. Note that if you boot up fewer |
| 71 fuzzers than indicated by the second number passed to -M, you may end up with |
| 72 poor coverage. |
| 73 |
| 74 You can also monitor the progress of your jobs from the command line with the |
| 61 provided afl-whatsup tool. When the instances are no longer finding new paths, | 75 provided afl-whatsup tool. When the instances are no longer finding new paths, |
| 62 it's probably time to stop. | 76 it's probably time to stop. |
| 63 | 77 |
| 64 WARNING: Exercise caution when explicitly specifying the -f option. Each fuzzer | 78 WARNING: Exercise caution when explicitly specifying the -f option. Each fuzzer |
| 65 must use a separate temporary file; otherwise, things will go south. One safe | 79 must use a separate temporary file; otherwise, things will go south. One safe |
| 66 example may be: | 80 example may be: |
| 67 | 81 |
| 68 $ ./afl-fuzz [...] -S fuzzer10 -f file10.txt ./fuzzed/binary @@ | 82 $ ./afl-fuzz [...] -S fuzzer10 -f file10.txt ./fuzzed/binary @@ |
| 69 $ ./afl-fuzz [...] -S fuzzer11 -f file11.txt ./fuzzed/binary @@ | 83 $ ./afl-fuzz [...] -S fuzzer11 -f file11.txt ./fuzzed/binary @@ |
| 70 $ ./afl-fuzz [...] -S fuzzer12 -f file12.txt ./fuzzed/binary @@ | 84 $ ./afl-fuzz [...] -S fuzzer12 -f file12.txt ./fuzzed/binary @@ |
| (...skipping 122 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 193 - Having some of the fuzzers invoke the binary in different ways. | 207 - Having some of the fuzzers invoke the binary in different ways. |
| 194 For example, 'djpeg' supports several DCT modes, configurable with | 208 For example, 'djpeg' supports several DCT modes, configurable with |
| 195 a command-line flag, while 'dwebp' supports incremental and one-shot | 209 a command-line flag, while 'dwebp' supports incremental and one-shot |
| 196 decoding. In some scenarios, going after multiple distinct modes and then | 210 decoding. In some scenarios, going after multiple distinct modes and then |
| 197 pooling test cases will improve coverage. | 211 pooling test cases will improve coverage. |
| 198 | 212 |
| 199 - Much less convincingly, running the synchronized fuzzers with different | 213 - Much less convincingly, running the synchronized fuzzers with different |
| 200 starting test cases (e.g., progressive and standard JPEG) or dictionaries. | 214 starting test cases (e.g., progressive and standard JPEG) or dictionaries. |
| 201 The synchronization mechanism ensures that the test sets will get fairly | 215 The synchronization mechanism ensures that the test sets will get fairly |
| 202 homogeneous over time, but it introduces some initial variability. | 216 homogeneous over time, but it introduces some initial variability. |
| OLD | NEW |