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 |