1*9880d681SAndroid Build Coastguard Worker======================================================= 2*9880d681SAndroid Build Coastguard WorkerlibFuzzer – a library for coverage-guided fuzz testing. 3*9880d681SAndroid Build Coastguard Worker======================================================= 4*9880d681SAndroid Build Coastguard Worker.. contents:: 5*9880d681SAndroid Build Coastguard Worker :local: 6*9880d681SAndroid Build Coastguard Worker :depth: 1 7*9880d681SAndroid Build Coastguard Worker 8*9880d681SAndroid Build Coastguard WorkerIntroduction 9*9880d681SAndroid Build Coastguard Worker============ 10*9880d681SAndroid Build Coastguard Worker 11*9880d681SAndroid Build Coastguard WorkerLibFuzzer is a library for in-process, coverage-guided, evolutionary fuzzing 12*9880d681SAndroid Build Coastguard Workerof other libraries. 13*9880d681SAndroid Build Coastguard Worker 14*9880d681SAndroid Build Coastguard WorkerLibFuzzer is similar in concept to American Fuzzy Lop (AFL_), but it performs 15*9880d681SAndroid Build Coastguard Workerall of its fuzzing inside a single process. This in-process fuzzing can be more 16*9880d681SAndroid Build Coastguard Workerrestrictive and fragile, but is potentially much faster as there is no overhead 17*9880d681SAndroid Build Coastguard Workerfor process start-up. 18*9880d681SAndroid Build Coastguard Worker 19*9880d681SAndroid Build Coastguard WorkerThe fuzzer is linked with the library under test, and feeds fuzzed inputs to the 20*9880d681SAndroid Build Coastguard Workerlibrary via a specific fuzzing entrypoint (aka "target function"); the fuzzer 21*9880d681SAndroid Build Coastguard Workerthen tracks which areas of the code are reached, and generates mutations on the 22*9880d681SAndroid Build Coastguard Workercorpus of input data in order to maximize the code coverage. The code coverage 23*9880d681SAndroid Build Coastguard Workerinformation for libFuzzer is provided by LLVM's SanitizerCoverage_ 24*9880d681SAndroid Build Coastguard Workerinstrumentation. 25*9880d681SAndroid Build Coastguard Worker 26*9880d681SAndroid Build Coastguard WorkerContact: libfuzzer(#)googlegroups.com 27*9880d681SAndroid Build Coastguard Worker 28*9880d681SAndroid Build Coastguard WorkerVersions 29*9880d681SAndroid Build Coastguard Worker======== 30*9880d681SAndroid Build Coastguard Worker 31*9880d681SAndroid Build Coastguard WorkerLibFuzzer is under active development so a current (or at least very recent) 32*9880d681SAndroid Build Coastguard Workerversion of Clang is the only supported variant. 33*9880d681SAndroid Build Coastguard Worker 34*9880d681SAndroid Build Coastguard Worker(If `building Clang from trunk`_ is too time-consuming or difficult, then 35*9880d681SAndroid Build Coastguard Workerthe Clang binaries that the Chromium developers build are likely to be 36*9880d681SAndroid Build Coastguard Workerfairly recent: 37*9880d681SAndroid Build Coastguard Worker 38*9880d681SAndroid Build Coastguard Worker.. code-block:: console 39*9880d681SAndroid Build Coastguard Worker 40*9880d681SAndroid Build Coastguard Worker mkdir TMP_CLANG 41*9880d681SAndroid Build Coastguard Worker cd TMP_CLANG 42*9880d681SAndroid Build Coastguard Worker git clone https://chromium.googlesource.com/chromium/src/tools/clang 43*9880d681SAndroid Build Coastguard Worker cd .. 44*9880d681SAndroid Build Coastguard Worker TMP_CLANG/clang/scripts/update.py 45*9880d681SAndroid Build Coastguard Worker 46*9880d681SAndroid Build Coastguard WorkerThis installs the Clang binary as 47*9880d681SAndroid Build Coastguard Worker``./third_party/llvm-build/Release+Asserts/bin/clang``) 48*9880d681SAndroid Build Coastguard Worker 49*9880d681SAndroid Build Coastguard WorkerThe libFuzzer code resides in the LLVM repository, and requires a recent Clang 50*9880d681SAndroid Build Coastguard Workercompiler to build (and is used to `fuzz various parts of LLVM itself`_). 51*9880d681SAndroid Build Coastguard WorkerHowever the fuzzer itself does not (and should not) depend on any part of LLVM 52*9880d681SAndroid Build Coastguard Workerinfrastructure and can be used for other projects without requiring the rest 53*9880d681SAndroid Build Coastguard Workerof LLVM. 54*9880d681SAndroid Build Coastguard Worker 55*9880d681SAndroid Build Coastguard Worker 56*9880d681SAndroid Build Coastguard Worker 57*9880d681SAndroid Build Coastguard WorkerGetting Started 58*9880d681SAndroid Build Coastguard Worker=============== 59*9880d681SAndroid Build Coastguard Worker 60*9880d681SAndroid Build Coastguard Worker.. contents:: 61*9880d681SAndroid Build Coastguard Worker :local: 62*9880d681SAndroid Build Coastguard Worker :depth: 1 63*9880d681SAndroid Build Coastguard Worker 64*9880d681SAndroid Build Coastguard WorkerBuilding 65*9880d681SAndroid Build Coastguard Worker-------- 66*9880d681SAndroid Build Coastguard Worker 67*9880d681SAndroid Build Coastguard WorkerThe first step for using libFuzzer on a library is to implement a fuzzing 68*9880d681SAndroid Build Coastguard Workertarget function that accepts a sequence of bytes, like this: 69*9880d681SAndroid Build Coastguard Worker 70*9880d681SAndroid Build Coastguard Worker.. code-block:: c++ 71*9880d681SAndroid Build Coastguard Worker 72*9880d681SAndroid Build Coastguard Worker // fuzz_target.cc 73*9880d681SAndroid Build Coastguard Worker extern "C" int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size) { 74*9880d681SAndroid Build Coastguard Worker DoSomethingInterestingWithMyAPI(Data, Size); 75*9880d681SAndroid Build Coastguard Worker return 0; // Non-zero return values are reserved for future use. 76*9880d681SAndroid Build Coastguard Worker } 77*9880d681SAndroid Build Coastguard Worker 78*9880d681SAndroid Build Coastguard WorkerNext, build the libFuzzer library as a static archive, without any sanitizer 79*9880d681SAndroid Build Coastguard Workeroptions. Note that the libFuzzer library contains the ``main()`` function: 80*9880d681SAndroid Build Coastguard Worker 81*9880d681SAndroid Build Coastguard Worker.. code-block:: console 82*9880d681SAndroid Build Coastguard Worker 83*9880d681SAndroid Build Coastguard Worker svn co http://llvm.org/svn/llvm-project/llvm/trunk/lib/Fuzzer 84*9880d681SAndroid Build Coastguard Worker # Alternative: get libFuzzer from a dedicated git mirror: 85*9880d681SAndroid Build Coastguard Worker # git clone https://chromium.googlesource.com/chromium/llvm-project/llvm/lib/Fuzzer 86*9880d681SAndroid Build Coastguard Worker clang++ -c -g -O2 -std=c++11 Fuzzer/*.cpp -IFuzzer 87*9880d681SAndroid Build Coastguard Worker ar ruv libFuzzer.a Fuzzer*.o 88*9880d681SAndroid Build Coastguard Worker 89*9880d681SAndroid Build Coastguard WorkerThen build the fuzzing target function and the library under test using 90*9880d681SAndroid Build Coastguard Workerthe SanitizerCoverage_ option, which instruments the code so that the fuzzer 91*9880d681SAndroid Build Coastguard Workercan retrieve code coverage information (to guide the fuzzing). Linking with 92*9880d681SAndroid Build Coastguard Workerthe libFuzzer code then gives an fuzzer executable. 93*9880d681SAndroid Build Coastguard Worker 94*9880d681SAndroid Build Coastguard WorkerYou should also enable one or more of the *sanitizers*, which help to expose 95*9880d681SAndroid Build Coastguard Workerlatent bugs by making incorrect behavior generate errors at runtime: 96*9880d681SAndroid Build Coastguard Worker 97*9880d681SAndroid Build Coastguard Worker - AddressSanitizer_ (ASAN) detects memory access errors. Use `-fsanitize=address`. 98*9880d681SAndroid Build Coastguard Worker - UndefinedBehaviorSanitizer_ (UBSAN) detects the use of various features of C/C++ that are explicitly 99*9880d681SAndroid Build Coastguard Worker listed as resulting in undefined behavior. Use `-fsanitize=undefined -fno-sanitize-recover=undefined` 100*9880d681SAndroid Build Coastguard Worker or any individual UBSAN check, e.g. `-fsanitize=signed-integer-overflow -fno-sanitize-recover=undefined`. 101*9880d681SAndroid Build Coastguard Worker You may combine ASAN and UBSAN in one build. 102*9880d681SAndroid Build Coastguard Worker - MemorySanitizer_ (MSAN) detects uninitialized reads: code whose behavior relies on memory 103*9880d681SAndroid Build Coastguard Worker contents that have not been initialized to a specific value. Use `-fsanitize=memory`. 104*9880d681SAndroid Build Coastguard Worker MSAN can not be combined with other sanirizers and should be used as a seprate build. 105*9880d681SAndroid Build Coastguard Worker 106*9880d681SAndroid Build Coastguard WorkerFinally, link with ``libFuzzer.a``:: 107*9880d681SAndroid Build Coastguard Worker 108*9880d681SAndroid Build Coastguard Worker clang -fsanitize-coverage=edge -fsanitize=address your_lib.cc fuzz_target.cc libFuzzer.a -o my_fuzzer 109*9880d681SAndroid Build Coastguard Worker 110*9880d681SAndroid Build Coastguard WorkerCorpus 111*9880d681SAndroid Build Coastguard Worker------ 112*9880d681SAndroid Build Coastguard Worker 113*9880d681SAndroid Build Coastguard WorkerCoverage-guided fuzzers like libFuzzer rely on a corpus of sample inputs for the 114*9880d681SAndroid Build Coastguard Workercode under test. This corpus should ideally be seeded with a varied collection 115*9880d681SAndroid Build Coastguard Workerof valid and invalid inputs for the code under test; for example, for a graphics 116*9880d681SAndroid Build Coastguard Workerlibrary the initial corpus might hold a variety of different small PNG/JPG/GIF 117*9880d681SAndroid Build Coastguard Workerfiles. The fuzzer generates random mutations based around the sample inputs in 118*9880d681SAndroid Build Coastguard Workerthe current corpus. If a mutation triggers execution of a previously-uncovered 119*9880d681SAndroid Build Coastguard Workerpath in the code under test, then that mutation is saved to the corpus for 120*9880d681SAndroid Build Coastguard Workerfuture variations. 121*9880d681SAndroid Build Coastguard Worker 122*9880d681SAndroid Build Coastguard WorkerLibFuzzer will work without any initial seeds, but will be less 123*9880d681SAndroid Build Coastguard Workerefficient if the library under test accepts complex, 124*9880d681SAndroid Build Coastguard Workerstructured inputs. 125*9880d681SAndroid Build Coastguard Worker 126*9880d681SAndroid Build Coastguard WorkerThe corpus can also act as a sanity/regression check, to confirm that the 127*9880d681SAndroid Build Coastguard Workerfuzzing entrypoint still works and that all of the sample inputs run through 128*9880d681SAndroid Build Coastguard Workerthe code under test without problems. 129*9880d681SAndroid Build Coastguard Worker 130*9880d681SAndroid Build Coastguard WorkerIf you have a large corpus (either generated by fuzzing or acquired by other means) 131*9880d681SAndroid Build Coastguard Workeryou may want to minimize it while still preserving the full coverage. One way to do that 132*9880d681SAndroid Build Coastguard Workeris to use the `-merge=1` flag: 133*9880d681SAndroid Build Coastguard Worker 134*9880d681SAndroid Build Coastguard Worker.. code-block:: console 135*9880d681SAndroid Build Coastguard Worker 136*9880d681SAndroid Build Coastguard Worker mkdir NEW_CORPUS_DIR # Store minimized corpus here. 137*9880d681SAndroid Build Coastguard Worker ./my_fuzzer -merge=1 NEW_CORPUS_DIR FULL_CORPUS_DIR 138*9880d681SAndroid Build Coastguard Worker 139*9880d681SAndroid Build Coastguard WorkerYou may use the same flag to add more interesting items to an existing corpus. 140*9880d681SAndroid Build Coastguard WorkerOnly the inputs that trigger new coverage will be added to the first corpus. 141*9880d681SAndroid Build Coastguard Worker 142*9880d681SAndroid Build Coastguard Worker.. code-block:: console 143*9880d681SAndroid Build Coastguard Worker 144*9880d681SAndroid Build Coastguard Worker ./my_fuzzer -merge=1 CURRENT_CORPUS_DIR NEW_POTENTIALLY_INTERESTING_INPUTS_DIR 145*9880d681SAndroid Build Coastguard Worker 146*9880d681SAndroid Build Coastguard Worker 147*9880d681SAndroid Build Coastguard WorkerRunning 148*9880d681SAndroid Build Coastguard Worker------- 149*9880d681SAndroid Build Coastguard Worker 150*9880d681SAndroid Build Coastguard WorkerTo run the fuzzer, first create a Corpus_ directory that holds the 151*9880d681SAndroid Build Coastguard Workerinitial "seed" sample inputs: 152*9880d681SAndroid Build Coastguard Worker 153*9880d681SAndroid Build Coastguard Worker.. code-block:: console 154*9880d681SAndroid Build Coastguard Worker 155*9880d681SAndroid Build Coastguard Worker mkdir CORPUS_DIR 156*9880d681SAndroid Build Coastguard Worker cp /some/input/samples/* CORPUS_DIR 157*9880d681SAndroid Build Coastguard Worker 158*9880d681SAndroid Build Coastguard WorkerThen run the fuzzer on the corpus directory: 159*9880d681SAndroid Build Coastguard Worker 160*9880d681SAndroid Build Coastguard Worker.. code-block:: console 161*9880d681SAndroid Build Coastguard Worker 162*9880d681SAndroid Build Coastguard Worker ./my_fuzzer CORPUS_DIR # -max_len=1000 -jobs=20 ... 163*9880d681SAndroid Build Coastguard Worker 164*9880d681SAndroid Build Coastguard WorkerAs the fuzzer discovers new interesting test cases (i.e. test cases that 165*9880d681SAndroid Build Coastguard Workertrigger coverage of new paths through the code under test), those test cases 166*9880d681SAndroid Build Coastguard Workerwill be added to the corpus directory. 167*9880d681SAndroid Build Coastguard Worker 168*9880d681SAndroid Build Coastguard WorkerBy default, the fuzzing process will continue indefinitely – at least until 169*9880d681SAndroid Build Coastguard Workera bug is found. Any crashes or sanitizer failures will be reported as usual, 170*9880d681SAndroid Build Coastguard Workerstopping the fuzzing process, and the particular input that triggered the bug 171*9880d681SAndroid Build Coastguard Workerwill be written to disk (typically as ``crash-<sha1>``, ``leak-<sha1>``, 172*9880d681SAndroid Build Coastguard Workeror ``timeout-<sha1>``). 173*9880d681SAndroid Build Coastguard Worker 174*9880d681SAndroid Build Coastguard Worker 175*9880d681SAndroid Build Coastguard WorkerParallel Fuzzing 176*9880d681SAndroid Build Coastguard Worker---------------- 177*9880d681SAndroid Build Coastguard Worker 178*9880d681SAndroid Build Coastguard WorkerEach libFuzzer process is single-threaded, unless the library under test starts 179*9880d681SAndroid Build Coastguard Workerits own threads. However, it is possible to run multiple libFuzzer processes in 180*9880d681SAndroid Build Coastguard Workerparallel with a shared corpus directory; this has the advantage that any new 181*9880d681SAndroid Build Coastguard Workerinputs found by one fuzzer process will be available to the other fuzzer 182*9880d681SAndroid Build Coastguard Workerprocesses (unless you disable this with the ``-reload=0`` option). 183*9880d681SAndroid Build Coastguard Worker 184*9880d681SAndroid Build Coastguard WorkerThis is primarily controlled by the ``-jobs=N`` option, which indicates that 185*9880d681SAndroid Build Coastguard Workerthat `N` fuzzing jobs should be run to completion (i.e. until a bug is found or 186*9880d681SAndroid Build Coastguard Workertime/iteration limits are reached). These jobs will be run across a set of 187*9880d681SAndroid Build Coastguard Workerworker processes, by default using half of the available CPU cores; the count of 188*9880d681SAndroid Build Coastguard Workerworker processes can be overridden by the ``-workers=N`` option. For example, 189*9880d681SAndroid Build Coastguard Workerrunning with ``-jobs=30`` on a 12-core machine would run 6 workers by default, 190*9880d681SAndroid Build Coastguard Workerwith each worker averaging 5 bugs by completion of the entire process. 191*9880d681SAndroid Build Coastguard Worker 192*9880d681SAndroid Build Coastguard Worker 193*9880d681SAndroid Build Coastguard WorkerOptions 194*9880d681SAndroid Build Coastguard Worker======= 195*9880d681SAndroid Build Coastguard Worker 196*9880d681SAndroid Build Coastguard WorkerTo run the fuzzer, pass zero or more corpus directories as command line 197*9880d681SAndroid Build Coastguard Workerarguments. The fuzzer will read test inputs from each of these corpus 198*9880d681SAndroid Build Coastguard Workerdirectories, and any new test inputs that are generated will be written 199*9880d681SAndroid Build Coastguard Workerback to the first corpus directory: 200*9880d681SAndroid Build Coastguard Worker 201*9880d681SAndroid Build Coastguard Worker.. code-block:: console 202*9880d681SAndroid Build Coastguard Worker 203*9880d681SAndroid Build Coastguard Worker ./fuzzer [-flag1=val1 [-flag2=val2 ...] ] [dir1 [dir2 ...] ] 204*9880d681SAndroid Build Coastguard Worker 205*9880d681SAndroid Build Coastguard WorkerIf a list of files (rather than directories) are passed to the fuzzer program, 206*9880d681SAndroid Build Coastguard Workerthen it will re-run those files as test inputs but will not perform any fuzzing. 207*9880d681SAndroid Build Coastguard WorkerIn this mode the fuzzer binary can be used as a regression test (e.g. on a 208*9880d681SAndroid Build Coastguard Workercontinuous integration system) to check the target function and saved inputs 209*9880d681SAndroid Build Coastguard Workerstill work. 210*9880d681SAndroid Build Coastguard Worker 211*9880d681SAndroid Build Coastguard WorkerThe most important command line options are: 212*9880d681SAndroid Build Coastguard Worker 213*9880d681SAndroid Build Coastguard Worker``-help`` 214*9880d681SAndroid Build Coastguard Worker Print help message. 215*9880d681SAndroid Build Coastguard Worker``-seed`` 216*9880d681SAndroid Build Coastguard Worker Random seed. If 0 (the default), the seed is generated. 217*9880d681SAndroid Build Coastguard Worker``-runs`` 218*9880d681SAndroid Build Coastguard Worker Number of individual test runs, -1 (the default) to run indefinitely. 219*9880d681SAndroid Build Coastguard Worker``-max_len`` 220*9880d681SAndroid Build Coastguard Worker Maximum length of a test input. If 0 (the default), libFuzzer tries to guess 221*9880d681SAndroid Build Coastguard Worker a good value based on the corpus (and reports it). 222*9880d681SAndroid Build Coastguard Worker``-timeout`` 223*9880d681SAndroid Build Coastguard Worker Timeout in seconds, default 1200. If an input takes longer than this timeout, 224*9880d681SAndroid Build Coastguard Worker the process is treated as a failure case. 225*9880d681SAndroid Build Coastguard Worker``-rss_limit_mb`` 226*9880d681SAndroid Build Coastguard Worker Memory usage limit in Mb, default 2048. Use 0 to disable the limit. 227*9880d681SAndroid Build Coastguard Worker If an input requires more than this amount of RSS memory to execute, 228*9880d681SAndroid Build Coastguard Worker the process is treated as a failure case. 229*9880d681SAndroid Build Coastguard Worker The limit is checked in a separate thread every second. 230*9880d681SAndroid Build Coastguard Worker If running w/o ASAN/MSAN, you may use 'ulimit -v' instead. 231*9880d681SAndroid Build Coastguard Worker``-timeout_exitcode`` 232*9880d681SAndroid Build Coastguard Worker Exit code (default 77) to emit when terminating due to timeout, when 233*9880d681SAndroid Build Coastguard Worker ``-abort_on_timeout`` is not set. 234*9880d681SAndroid Build Coastguard Worker``-max_total_time`` 235*9880d681SAndroid Build Coastguard Worker If positive, indicates the maximum total time in seconds to run the fuzzer. 236*9880d681SAndroid Build Coastguard Worker If 0 (the default), run indefinitely. 237*9880d681SAndroid Build Coastguard Worker``-merge`` 238*9880d681SAndroid Build Coastguard Worker If set to 1, any corpus inputs from the 2nd, 3rd etc. corpus directories 239*9880d681SAndroid Build Coastguard Worker that trigger new code coverage will be merged into the first corpus 240*9880d681SAndroid Build Coastguard Worker directory. Defaults to 0. This flag can be used to minimize a corpus. 241*9880d681SAndroid Build Coastguard Worker``-reload`` 242*9880d681SAndroid Build Coastguard Worker If set to 1 (the default), the corpus directory is re-read periodically to 243*9880d681SAndroid Build Coastguard Worker check for new inputs; this allows detection of new inputs that were discovered 244*9880d681SAndroid Build Coastguard Worker by other fuzzing processes. 245*9880d681SAndroid Build Coastguard Worker``-jobs`` 246*9880d681SAndroid Build Coastguard Worker Number of fuzzing jobs to run to completion. Default value is 0, which runs a 247*9880d681SAndroid Build Coastguard Worker single fuzzing process until completion. If the value is >= 1, then this 248*9880d681SAndroid Build Coastguard Worker number of jobs performing fuzzing are run, in a collection of parallel 249*9880d681SAndroid Build Coastguard Worker separate worker processes; each such worker process has its 250*9880d681SAndroid Build Coastguard Worker ``stdout``/``stderr`` redirected to ``fuzz-<JOB>.log``. 251*9880d681SAndroid Build Coastguard Worker``-workers`` 252*9880d681SAndroid Build Coastguard Worker Number of simultaneous worker processes to run the fuzzing jobs to completion 253*9880d681SAndroid Build Coastguard Worker in. If 0 (the default), ``min(jobs, NumberOfCpuCores()/2)`` is used. 254*9880d681SAndroid Build Coastguard Worker``-dict`` 255*9880d681SAndroid Build Coastguard Worker Provide a dictionary of input keywords; see Dictionaries_. 256*9880d681SAndroid Build Coastguard Worker``-use_counters`` 257*9880d681SAndroid Build Coastguard Worker Use `coverage counters`_ to generate approximate counts of how often code 258*9880d681SAndroid Build Coastguard Worker blocks are hit; defaults to 1. 259*9880d681SAndroid Build Coastguard Worker``-use_traces`` 260*9880d681SAndroid Build Coastguard Worker Use instruction traces (experimental, defaults to 0); see `Data-flow-guided fuzzing`_. 261*9880d681SAndroid Build Coastguard Worker``-only_ascii`` 262*9880d681SAndroid Build Coastguard Worker If 1, generate only ASCII (``isprint``+``isspace``) inputs. Defaults to 0. 263*9880d681SAndroid Build Coastguard Worker``-artifact_prefix`` 264*9880d681SAndroid Build Coastguard Worker Provide a prefix to use when saving fuzzing artifacts (crash, timeout, or 265*9880d681SAndroid Build Coastguard Worker slow inputs) as ``$(artifact_prefix)file``. Defaults to empty. 266*9880d681SAndroid Build Coastguard Worker``-exact_artifact_path`` 267*9880d681SAndroid Build Coastguard Worker Ignored if empty (the default). If non-empty, write the single artifact on 268*9880d681SAndroid Build Coastguard Worker failure (crash, timeout) as ``$(exact_artifact_path)``. This overrides 269*9880d681SAndroid Build Coastguard Worker ``-artifact_prefix`` and will not use checksum in the file name. Do not use 270*9880d681SAndroid Build Coastguard Worker the same path for several parallel processes. 271*9880d681SAndroid Build Coastguard Worker``-print_final_stats`` 272*9880d681SAndroid Build Coastguard Worker If 1, print statistics at exit. Defaults to 0. 273*9880d681SAndroid Build Coastguard Worker``-detect-leaks`` 274*9880d681SAndroid Build Coastguard Worker If 1 (default) and if LeakSanitizer is enabled 275*9880d681SAndroid Build Coastguard Worker try to detect memory leaks during fuzzing (i.e. not only at shut down). 276*9880d681SAndroid Build Coastguard Worker``-close_fd_mask`` 277*9880d681SAndroid Build Coastguard Worker Indicate output streams to close at startup. Be careful, this will 278*9880d681SAndroid Build Coastguard Worker remove diagnostic output from target code (e.g. messages on assert failure). 279*9880d681SAndroid Build Coastguard Worker 280*9880d681SAndroid Build Coastguard Worker - 0 (default): close neither ``stdout`` nor ``stderr`` 281*9880d681SAndroid Build Coastguard Worker - 1 : close ``stdout`` 282*9880d681SAndroid Build Coastguard Worker - 2 : close ``stderr`` 283*9880d681SAndroid Build Coastguard Worker - 3 : close both ``stdout`` and ``stderr``. 284*9880d681SAndroid Build Coastguard Worker 285*9880d681SAndroid Build Coastguard WorkerFor the full list of flags run the fuzzer binary with ``-help=1``. 286*9880d681SAndroid Build Coastguard Worker 287*9880d681SAndroid Build Coastguard WorkerOutput 288*9880d681SAndroid Build Coastguard Worker====== 289*9880d681SAndroid Build Coastguard Worker 290*9880d681SAndroid Build Coastguard WorkerDuring operation the fuzzer prints information to ``stderr``, for example:: 291*9880d681SAndroid Build Coastguard Worker 292*9880d681SAndroid Build Coastguard Worker INFO: Seed: 3338750330 293*9880d681SAndroid Build Coastguard Worker Loaded 1024/1211 files from corpus/ 294*9880d681SAndroid Build Coastguard Worker INFO: -max_len is not provided, using 64 295*9880d681SAndroid Build Coastguard Worker #0 READ units: 1211 exec/s: 0 296*9880d681SAndroid Build Coastguard Worker #1211 INITED cov: 2575 bits: 8855 indir: 5 units: 830 exec/s: 1211 297*9880d681SAndroid Build Coastguard Worker #1422 NEW cov: 2580 bits: 8860 indir: 5 units: 831 exec/s: 1422 L: 21 MS: 1 ShuffleBytes- 298*9880d681SAndroid Build Coastguard Worker #1688 NEW cov: 2581 bits: 8865 indir: 5 units: 832 exec/s: 1688 L: 19 MS: 2 EraseByte-CrossOver- 299*9880d681SAndroid Build Coastguard Worker #1734 NEW cov: 2583 bits: 8879 indir: 5 units: 833 exec/s: 1734 L: 27 MS: 3 ChangeBit-EraseByte-ShuffleBytes- 300*9880d681SAndroid Build Coastguard Worker ... 301*9880d681SAndroid Build Coastguard Worker 302*9880d681SAndroid Build Coastguard WorkerThe early parts of the output include information about the fuzzer options and 303*9880d681SAndroid Build Coastguard Workerconfiguration, including the current random seed (in the ``Seed:`` line; this 304*9880d681SAndroid Build Coastguard Workercan be overridden with the ``-seed=N`` flag). 305*9880d681SAndroid Build Coastguard Worker 306*9880d681SAndroid Build Coastguard WorkerFurther output lines have the form of an event code and statistics. The 307*9880d681SAndroid Build Coastguard Workerpossible event codes are: 308*9880d681SAndroid Build Coastguard Worker 309*9880d681SAndroid Build Coastguard Worker``READ`` 310*9880d681SAndroid Build Coastguard Worker The fuzzer has read in all of the provided input samples from the corpus 311*9880d681SAndroid Build Coastguard Worker directories. 312*9880d681SAndroid Build Coastguard Worker``INITED`` 313*9880d681SAndroid Build Coastguard Worker The fuzzer has completed initialization, which includes running each of 314*9880d681SAndroid Build Coastguard Worker the initial input samples through the code under test. 315*9880d681SAndroid Build Coastguard Worker``NEW`` 316*9880d681SAndroid Build Coastguard Worker The fuzzer has created a test input that covers new areas of the code 317*9880d681SAndroid Build Coastguard Worker under test. This input will be saved to the primary corpus directory. 318*9880d681SAndroid Build Coastguard Worker``pulse`` 319*9880d681SAndroid Build Coastguard Worker The fuzzer has generated 2\ :sup:`n` inputs (generated periodically to reassure 320*9880d681SAndroid Build Coastguard Worker the user that the fuzzer is still working). 321*9880d681SAndroid Build Coastguard Worker``DONE`` 322*9880d681SAndroid Build Coastguard Worker The fuzzer has completed operation because it has reached the specified 323*9880d681SAndroid Build Coastguard Worker iteration limit (``-runs``) or time limit (``-max_total_time``). 324*9880d681SAndroid Build Coastguard Worker``MIN<n>`` 325*9880d681SAndroid Build Coastguard Worker The fuzzer is minimizing the combination of input corpus directories into 326*9880d681SAndroid Build Coastguard Worker a single unified corpus (due to the ``-merge`` command line option). 327*9880d681SAndroid Build Coastguard Worker``RELOAD`` 328*9880d681SAndroid Build Coastguard Worker The fuzzer is performing a periodic reload of inputs from the corpus 329*9880d681SAndroid Build Coastguard Worker directory; this allows it to discover any inputs discovered by other 330*9880d681SAndroid Build Coastguard Worker fuzzer processes (see `Parallel Fuzzing`_). 331*9880d681SAndroid Build Coastguard Worker 332*9880d681SAndroid Build Coastguard WorkerEach output line also reports the following statistics (when non-zero): 333*9880d681SAndroid Build Coastguard Worker 334*9880d681SAndroid Build Coastguard Worker``cov:`` 335*9880d681SAndroid Build Coastguard Worker Total number of code blocks or edges covered by the executing the current 336*9880d681SAndroid Build Coastguard Worker corpus. 337*9880d681SAndroid Build Coastguard Worker``bits:`` 338*9880d681SAndroid Build Coastguard Worker Rough measure of the number of code blocks or edges covered, and how often; 339*9880d681SAndroid Build Coastguard Worker only valid if the fuzzer is run with ``-use_counters=1``. 340*9880d681SAndroid Build Coastguard Worker``indir:`` 341*9880d681SAndroid Build Coastguard Worker Number of distinct function `caller-callee pairs`_ executed with the 342*9880d681SAndroid Build Coastguard Worker current corpus; only valid if the code under test was built with 343*9880d681SAndroid Build Coastguard Worker ``-fsanitize-coverage=indirect-calls``. 344*9880d681SAndroid Build Coastguard Worker``units:`` 345*9880d681SAndroid Build Coastguard Worker Number of entries in the current input corpus. 346*9880d681SAndroid Build Coastguard Worker``exec/s:`` 347*9880d681SAndroid Build Coastguard Worker Number of fuzzer iterations per second. 348*9880d681SAndroid Build Coastguard Worker 349*9880d681SAndroid Build Coastguard WorkerFor ``NEW`` events, the output line also includes information about the mutation 350*9880d681SAndroid Build Coastguard Workeroperation that produced the new input: 351*9880d681SAndroid Build Coastguard Worker 352*9880d681SAndroid Build Coastguard Worker``L:`` 353*9880d681SAndroid Build Coastguard Worker Size of the new input in bytes. 354*9880d681SAndroid Build Coastguard Worker``MS: <n> <operations>`` 355*9880d681SAndroid Build Coastguard Worker Count and list of the mutation operations used to generate the input. 356*9880d681SAndroid Build Coastguard Worker 357*9880d681SAndroid Build Coastguard Worker 358*9880d681SAndroid Build Coastguard WorkerExamples 359*9880d681SAndroid Build Coastguard Worker======== 360*9880d681SAndroid Build Coastguard Worker.. contents:: 361*9880d681SAndroid Build Coastguard Worker :local: 362*9880d681SAndroid Build Coastguard Worker :depth: 1 363*9880d681SAndroid Build Coastguard Worker 364*9880d681SAndroid Build Coastguard WorkerToy example 365*9880d681SAndroid Build Coastguard Worker----------- 366*9880d681SAndroid Build Coastguard Worker 367*9880d681SAndroid Build Coastguard WorkerA simple function that does something interesting if it receives the input 368*9880d681SAndroid Build Coastguard Worker"HI!":: 369*9880d681SAndroid Build Coastguard Worker 370*9880d681SAndroid Build Coastguard Worker cat << EOF > test_fuzzer.cc 371*9880d681SAndroid Build Coastguard Worker #include <stdint.h> 372*9880d681SAndroid Build Coastguard Worker #include <stddef.h> 373*9880d681SAndroid Build Coastguard Worker extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) { 374*9880d681SAndroid Build Coastguard Worker if (size > 0 && data[0] == 'H') 375*9880d681SAndroid Build Coastguard Worker if (size > 1 && data[1] == 'I') 376*9880d681SAndroid Build Coastguard Worker if (size > 2 && data[2] == '!') 377*9880d681SAndroid Build Coastguard Worker __builtin_trap(); 378*9880d681SAndroid Build Coastguard Worker return 0; 379*9880d681SAndroid Build Coastguard Worker } 380*9880d681SAndroid Build Coastguard Worker EOF 381*9880d681SAndroid Build Coastguard Worker # Build test_fuzzer.cc with asan and link against libFuzzer.a 382*9880d681SAndroid Build Coastguard Worker clang++ -fsanitize=address -fsanitize-coverage=edge test_fuzzer.cc libFuzzer.a 383*9880d681SAndroid Build Coastguard Worker # Run the fuzzer with no corpus. 384*9880d681SAndroid Build Coastguard Worker ./a.out 385*9880d681SAndroid Build Coastguard Worker 386*9880d681SAndroid Build Coastguard WorkerYou should get an error pretty quickly:: 387*9880d681SAndroid Build Coastguard Worker 388*9880d681SAndroid Build Coastguard Worker #0 READ units: 1 exec/s: 0 389*9880d681SAndroid Build Coastguard Worker #1 INITED cov: 3 units: 1 exec/s: 0 390*9880d681SAndroid Build Coastguard Worker #2 NEW cov: 5 units: 2 exec/s: 0 L: 64 MS: 0 391*9880d681SAndroid Build Coastguard Worker #19237 NEW cov: 9 units: 3 exec/s: 0 L: 64 MS: 0 392*9880d681SAndroid Build Coastguard Worker #20595 NEW cov: 10 units: 4 exec/s: 0 L: 1 MS: 4 ChangeASCIIInt-ShuffleBytes-ChangeByte-CrossOver- 393*9880d681SAndroid Build Coastguard Worker #34574 NEW cov: 13 units: 5 exec/s: 0 L: 2 MS: 3 ShuffleBytes-CrossOver-ChangeBit- 394*9880d681SAndroid Build Coastguard Worker #34807 NEW cov: 15 units: 6 exec/s: 0 L: 3 MS: 1 CrossOver- 395*9880d681SAndroid Build Coastguard Worker ==31511== ERROR: libFuzzer: deadly signal 396*9880d681SAndroid Build Coastguard Worker ... 397*9880d681SAndroid Build Coastguard Worker artifact_prefix='./'; Test unit written to ./crash-b13e8756b13a00cf168300179061fb4b91fefbed 398*9880d681SAndroid Build Coastguard Worker 399*9880d681SAndroid Build Coastguard Worker 400*9880d681SAndroid Build Coastguard WorkerPCRE2 401*9880d681SAndroid Build Coastguard Worker----- 402*9880d681SAndroid Build Coastguard Worker 403*9880d681SAndroid Build Coastguard WorkerHere we show how to use libFuzzer on something real, yet simple: pcre2_:: 404*9880d681SAndroid Build Coastguard Worker 405*9880d681SAndroid Build Coastguard Worker COV_FLAGS=" -fsanitize-coverage=edge,indirect-calls,8bit-counters" 406*9880d681SAndroid Build Coastguard Worker # Get PCRE2 407*9880d681SAndroid Build Coastguard Worker wget ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre2-10.20.tar.gz 408*9880d681SAndroid Build Coastguard Worker tar xf pcre2-10.20.tar.gz 409*9880d681SAndroid Build Coastguard Worker # Build PCRE2 with AddressSanitizer and coverage; requires autotools. 410*9880d681SAndroid Build Coastguard Worker (cd pcre2-10.20; ./autogen.sh; CC="clang -fsanitize=address $COV_FLAGS" ./configure --prefix=`pwd`/../inst && make -j && make install) 411*9880d681SAndroid Build Coastguard Worker # Build the fuzzing target function that does something interesting with PCRE2. 412*9880d681SAndroid Build Coastguard Worker cat << EOF > pcre_fuzzer.cc 413*9880d681SAndroid Build Coastguard Worker #include <string.h> 414*9880d681SAndroid Build Coastguard Worker #include <stdint.h> 415*9880d681SAndroid Build Coastguard Worker #include "pcre2posix.h" 416*9880d681SAndroid Build Coastguard Worker extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) { 417*9880d681SAndroid Build Coastguard Worker if (size < 1) return 0; 418*9880d681SAndroid Build Coastguard Worker char *str = new char[size+1]; 419*9880d681SAndroid Build Coastguard Worker memcpy(str, data, size); 420*9880d681SAndroid Build Coastguard Worker str[size] = 0; 421*9880d681SAndroid Build Coastguard Worker regex_t preg; 422*9880d681SAndroid Build Coastguard Worker if (0 == regcomp(&preg, str, 0)) { 423*9880d681SAndroid Build Coastguard Worker regexec(&preg, str, 0, 0, 0); 424*9880d681SAndroid Build Coastguard Worker regfree(&preg); 425*9880d681SAndroid Build Coastguard Worker } 426*9880d681SAndroid Build Coastguard Worker delete [] str; 427*9880d681SAndroid Build Coastguard Worker return 0; 428*9880d681SAndroid Build Coastguard Worker } 429*9880d681SAndroid Build Coastguard Worker EOF 430*9880d681SAndroid Build Coastguard Worker clang++ -g -fsanitize=address $COV_FLAGS -c -std=c++11 -I inst/include/ pcre_fuzzer.cc 431*9880d681SAndroid Build Coastguard Worker # Link. 432*9880d681SAndroid Build Coastguard Worker clang++ -g -fsanitize=address -Wl,--whole-archive inst/lib/*.a -Wl,-no-whole-archive libFuzzer.a pcre_fuzzer.o -o pcre_fuzzer 433*9880d681SAndroid Build Coastguard Worker 434*9880d681SAndroid Build Coastguard WorkerThis will give you a binary of the fuzzer, called ``pcre_fuzzer``. 435*9880d681SAndroid Build Coastguard WorkerNow, create a directory that will hold the test corpus: 436*9880d681SAndroid Build Coastguard Worker 437*9880d681SAndroid Build Coastguard Worker.. code-block:: console 438*9880d681SAndroid Build Coastguard Worker 439*9880d681SAndroid Build Coastguard Worker mkdir -p CORPUS 440*9880d681SAndroid Build Coastguard Worker 441*9880d681SAndroid Build Coastguard WorkerFor simple input languages like regular expressions this is all you need. 442*9880d681SAndroid Build Coastguard WorkerFor more complicated/structured inputs, the fuzzer works much more efficiently 443*9880d681SAndroid Build Coastguard Workerif you can populate the corpus directory with a variety of valid and invalid 444*9880d681SAndroid Build Coastguard Workerinputs for the code under test. 445*9880d681SAndroid Build Coastguard WorkerNow run the fuzzer with the corpus directory as the only parameter: 446*9880d681SAndroid Build Coastguard Worker 447*9880d681SAndroid Build Coastguard Worker.. code-block:: console 448*9880d681SAndroid Build Coastguard Worker 449*9880d681SAndroid Build Coastguard Worker ./pcre_fuzzer ./CORPUS 450*9880d681SAndroid Build Coastguard Worker 451*9880d681SAndroid Build Coastguard WorkerInitially, you will see Output_ like this:: 452*9880d681SAndroid Build Coastguard Worker 453*9880d681SAndroid Build Coastguard Worker INFO: Seed: 2938818941 454*9880d681SAndroid Build Coastguard Worker INFO: -max_len is not provided, using 64 455*9880d681SAndroid Build Coastguard Worker INFO: A corpus is not provided, starting from an empty corpus 456*9880d681SAndroid Build Coastguard Worker #0 READ units: 1 exec/s: 0 457*9880d681SAndroid Build Coastguard Worker #1 INITED cov: 3 bits: 3 units: 1 exec/s: 0 458*9880d681SAndroid Build Coastguard Worker #2 NEW cov: 176 bits: 176 indir: 3 units: 2 exec/s: 0 L: 64 MS: 0 459*9880d681SAndroid Build Coastguard Worker #8 NEW cov: 176 bits: 179 indir: 3 units: 3 exec/s: 0 L: 63 MS: 2 ChangeByte-EraseByte- 460*9880d681SAndroid Build Coastguard Worker ... 461*9880d681SAndroid Build Coastguard Worker #14004 NEW cov: 1500 bits: 4536 indir: 5 units: 406 exec/s: 0 L: 54 MS: 3 ChangeBit-ChangeBit-CrossOver- 462*9880d681SAndroid Build Coastguard Worker 463*9880d681SAndroid Build Coastguard WorkerNow, interrupt the fuzzer and run it again the same way. You will see:: 464*9880d681SAndroid Build Coastguard Worker 465*9880d681SAndroid Build Coastguard Worker INFO: Seed: 3398349082 466*9880d681SAndroid Build Coastguard Worker INFO: -max_len is not provided, using 64 467*9880d681SAndroid Build Coastguard Worker #0 READ units: 405 exec/s: 0 468*9880d681SAndroid Build Coastguard Worker #405 INITED cov: 1499 bits: 4535 indir: 5 units: 286 exec/s: 0 469*9880d681SAndroid Build Coastguard Worker #587 NEW cov: 1499 bits: 4540 indir: 5 units: 287 exec/s: 0 L: 52 MS: 2 InsertByte-EraseByte- 470*9880d681SAndroid Build Coastguard Worker #667 NEW cov: 1501 bits: 4542 indir: 5 units: 288 exec/s: 0 L: 39 MS: 2 ChangeBit-InsertByte- 471*9880d681SAndroid Build Coastguard Worker #672 NEW cov: 1501 bits: 4543 indir: 5 units: 289 exec/s: 0 L: 15 MS: 2 ChangeASCIIInt-ChangeBit- 472*9880d681SAndroid Build Coastguard Worker #739 NEW cov: 1501 bits: 4544 indir: 5 units: 290 exec/s: 0 L: 64 MS: 4 ShuffleBytes-ChangeASCIIInt-InsertByte-ChangeBit- 473*9880d681SAndroid Build Coastguard Worker ... 474*9880d681SAndroid Build Coastguard Worker 475*9880d681SAndroid Build Coastguard WorkerOn the second execution the fuzzer has a non-empty input corpus (405 items). As 476*9880d681SAndroid Build Coastguard Workerthe first step, the fuzzer minimized this corpus (the ``INITED`` line) to 477*9880d681SAndroid Build Coastguard Workerproduce 286 interesting items, omitting inputs that do not hit any additional 478*9880d681SAndroid Build Coastguard Workercode. 479*9880d681SAndroid Build Coastguard Worker 480*9880d681SAndroid Build Coastguard Worker(Aside: although the fuzzer only saves new inputs that hit additional code, this 481*9880d681SAndroid Build Coastguard Workerdoes not mean that the corpus as a whole is kept minimized. For example, if 482*9880d681SAndroid Build Coastguard Workeran input hitting A-B-C then an input that hits A-B-C-D are generated, 483*9880d681SAndroid Build Coastguard Workerthey will both be saved, even though the latter subsumes the former.) 484*9880d681SAndroid Build Coastguard Worker 485*9880d681SAndroid Build Coastguard Worker 486*9880d681SAndroid Build Coastguard WorkerYou may run ``N`` independent fuzzer jobs in parallel on ``M`` CPUs: 487*9880d681SAndroid Build Coastguard Worker 488*9880d681SAndroid Build Coastguard Worker.. code-block:: console 489*9880d681SAndroid Build Coastguard Worker 490*9880d681SAndroid Build Coastguard Worker N=100; M=4; ./pcre_fuzzer ./CORPUS -jobs=$N -workers=$M 491*9880d681SAndroid Build Coastguard Worker 492*9880d681SAndroid Build Coastguard WorkerBy default (``-reload=1``) the fuzzer processes will periodically scan the corpus directory 493*9880d681SAndroid Build Coastguard Workerand reload any new tests. This way the test inputs found by one process will be picked up 494*9880d681SAndroid Build Coastguard Workerby all others. 495*9880d681SAndroid Build Coastguard Worker 496*9880d681SAndroid Build Coastguard WorkerIf ``-workers=$M`` is not supplied, ``min($N,NumberOfCpuCore/2)`` will be used. 497*9880d681SAndroid Build Coastguard Worker 498*9880d681SAndroid Build Coastguard WorkerHeartbleed 499*9880d681SAndroid Build Coastguard Worker---------- 500*9880d681SAndroid Build Coastguard WorkerRemember Heartbleed_? 501*9880d681SAndroid Build Coastguard WorkerAs it was recently `shown <https://blog.hboeck.de/archives/868-How-Heartbleed-couldve-been-found.html>`_, 502*9880d681SAndroid Build Coastguard Workerfuzzing with AddressSanitizer_ can find Heartbleed. Indeed, here are the step-by-step instructions 503*9880d681SAndroid Build Coastguard Workerto find Heartbleed with libFuzzer:: 504*9880d681SAndroid Build Coastguard Worker 505*9880d681SAndroid Build Coastguard Worker wget https://www.openssl.org/source/openssl-1.0.1f.tar.gz 506*9880d681SAndroid Build Coastguard Worker tar xf openssl-1.0.1f.tar.gz 507*9880d681SAndroid Build Coastguard Worker COV_FLAGS="-fsanitize-coverage=edge,indirect-calls" # -fsanitize-coverage=8bit-counters 508*9880d681SAndroid Build Coastguard Worker (cd openssl-1.0.1f/ && ./config && 509*9880d681SAndroid Build Coastguard Worker make -j 32 CC="clang -g -fsanitize=address $COV_FLAGS") 510*9880d681SAndroid Build Coastguard Worker # Get and build libFuzzer 511*9880d681SAndroid Build Coastguard Worker svn co http://llvm.org/svn/llvm-project/llvm/trunk/lib/Fuzzer 512*9880d681SAndroid Build Coastguard Worker clang -c -g -O2 -std=c++11 Fuzzer/*.cpp -IFuzzer 513*9880d681SAndroid Build Coastguard Worker # Get examples of key/pem files. 514*9880d681SAndroid Build Coastguard Worker git clone https://github.com/hannob/selftls 515*9880d681SAndroid Build Coastguard Worker cp selftls/server* . -v 516*9880d681SAndroid Build Coastguard Worker cat << EOF > handshake-fuzz.cc 517*9880d681SAndroid Build Coastguard Worker #include <openssl/ssl.h> 518*9880d681SAndroid Build Coastguard Worker #include <openssl/err.h> 519*9880d681SAndroid Build Coastguard Worker #include <assert.h> 520*9880d681SAndroid Build Coastguard Worker #include <stdint.h> 521*9880d681SAndroid Build Coastguard Worker #include <stddef.h> 522*9880d681SAndroid Build Coastguard Worker 523*9880d681SAndroid Build Coastguard Worker SSL_CTX *sctx; 524*9880d681SAndroid Build Coastguard Worker int Init() { 525*9880d681SAndroid Build Coastguard Worker SSL_library_init(); 526*9880d681SAndroid Build Coastguard Worker SSL_load_error_strings(); 527*9880d681SAndroid Build Coastguard Worker ERR_load_BIO_strings(); 528*9880d681SAndroid Build Coastguard Worker OpenSSL_add_all_algorithms(); 529*9880d681SAndroid Build Coastguard Worker assert (sctx = SSL_CTX_new(TLSv1_method())); 530*9880d681SAndroid Build Coastguard Worker assert (SSL_CTX_use_certificate_file(sctx, "server.pem", SSL_FILETYPE_PEM)); 531*9880d681SAndroid Build Coastguard Worker assert (SSL_CTX_use_PrivateKey_file(sctx, "server.key", SSL_FILETYPE_PEM)); 532*9880d681SAndroid Build Coastguard Worker return 0; 533*9880d681SAndroid Build Coastguard Worker } 534*9880d681SAndroid Build Coastguard Worker extern "C" int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size) { 535*9880d681SAndroid Build Coastguard Worker static int unused = Init(); 536*9880d681SAndroid Build Coastguard Worker SSL *server = SSL_new(sctx); 537*9880d681SAndroid Build Coastguard Worker BIO *sinbio = BIO_new(BIO_s_mem()); 538*9880d681SAndroid Build Coastguard Worker BIO *soutbio = BIO_new(BIO_s_mem()); 539*9880d681SAndroid Build Coastguard Worker SSL_set_bio(server, sinbio, soutbio); 540*9880d681SAndroid Build Coastguard Worker SSL_set_accept_state(server); 541*9880d681SAndroid Build Coastguard Worker BIO_write(sinbio, Data, Size); 542*9880d681SAndroid Build Coastguard Worker SSL_do_handshake(server); 543*9880d681SAndroid Build Coastguard Worker SSL_free(server); 544*9880d681SAndroid Build Coastguard Worker return 0; 545*9880d681SAndroid Build Coastguard Worker } 546*9880d681SAndroid Build Coastguard Worker EOF 547*9880d681SAndroid Build Coastguard Worker # Build the fuzzer. 548*9880d681SAndroid Build Coastguard Worker clang++ -g handshake-fuzz.cc -fsanitize=address \ 549*9880d681SAndroid Build Coastguard Worker openssl-1.0.1f/libssl.a openssl-1.0.1f/libcrypto.a Fuzzer*.o 550*9880d681SAndroid Build Coastguard Worker # Run 20 independent fuzzer jobs. 551*9880d681SAndroid Build Coastguard Worker ./a.out -jobs=20 -workers=20 552*9880d681SAndroid Build Coastguard Worker 553*9880d681SAndroid Build Coastguard WorkerVoila:: 554*9880d681SAndroid Build Coastguard Worker 555*9880d681SAndroid Build Coastguard Worker #1048576 pulse cov 3424 bits 0 units 9 exec/s 24385 556*9880d681SAndroid Build Coastguard Worker ================================================================= 557*9880d681SAndroid Build Coastguard Worker ==17488==ERROR: AddressSanitizer: heap-buffer-overflow on address 0x629000004748 at pc 0x00000048c979 bp 0x7fffe3e864f0 sp 0x7fffe3e85ca8 558*9880d681SAndroid Build Coastguard Worker READ of size 60731 at 0x629000004748 thread T0 559*9880d681SAndroid Build Coastguard Worker #0 0x48c978 in __asan_memcpy 560*9880d681SAndroid Build Coastguard Worker #1 0x4db504 in tls1_process_heartbeat openssl-1.0.1f/ssl/t1_lib.c:2586:3 561*9880d681SAndroid Build Coastguard Worker #2 0x580be3 in ssl3_read_bytes openssl-1.0.1f/ssl/s3_pkt.c:1092:4 562*9880d681SAndroid Build Coastguard Worker 563*9880d681SAndroid Build Coastguard WorkerNote: a `similar fuzzer <https://boringssl.googlesource.com/boringssl/+/HEAD/FUZZING.md>`_ 564*9880d681SAndroid Build Coastguard Workeris now a part of the BoringSSL_ source tree. 565*9880d681SAndroid Build Coastguard Worker 566*9880d681SAndroid Build Coastguard WorkerAdvanced features 567*9880d681SAndroid Build Coastguard Worker================= 568*9880d681SAndroid Build Coastguard Worker.. contents:: 569*9880d681SAndroid Build Coastguard Worker :local: 570*9880d681SAndroid Build Coastguard Worker :depth: 1 571*9880d681SAndroid Build Coastguard Worker 572*9880d681SAndroid Build Coastguard WorkerDictionaries 573*9880d681SAndroid Build Coastguard Worker------------ 574*9880d681SAndroid Build Coastguard WorkerLibFuzzer supports user-supplied dictionaries with input language keywords 575*9880d681SAndroid Build Coastguard Workeror other interesting byte sequences (e.g. multi-byte magic values). 576*9880d681SAndroid Build Coastguard WorkerUse ``-dict=DICTIONARY_FILE``. For some input languages using a dictionary 577*9880d681SAndroid Build Coastguard Workermay significantly improve the search speed. 578*9880d681SAndroid Build Coastguard WorkerThe dictionary syntax is similar to that used by AFL_ for its ``-x`` option:: 579*9880d681SAndroid Build Coastguard Worker 580*9880d681SAndroid Build Coastguard Worker # Lines starting with '#' and empty lines are ignored. 581*9880d681SAndroid Build Coastguard Worker 582*9880d681SAndroid Build Coastguard Worker # Adds "blah" (w/o quotes) to the dictionary. 583*9880d681SAndroid Build Coastguard Worker kw1="blah" 584*9880d681SAndroid Build Coastguard Worker # Use \\ for backslash and \" for quotes. 585*9880d681SAndroid Build Coastguard Worker kw2="\"ac\\dc\"" 586*9880d681SAndroid Build Coastguard Worker # Use \xAB for hex values 587*9880d681SAndroid Build Coastguard Worker kw3="\xF7\xF8" 588*9880d681SAndroid Build Coastguard Worker # the name of the keyword followed by '=' may be omitted: 589*9880d681SAndroid Build Coastguard Worker "foo\x0Abar" 590*9880d681SAndroid Build Coastguard Worker 591*9880d681SAndroid Build Coastguard WorkerData-flow-guided fuzzing 592*9880d681SAndroid Build Coastguard Worker------------------------ 593*9880d681SAndroid Build Coastguard Worker 594*9880d681SAndroid Build Coastguard Worker*EXPERIMENTAL*. 595*9880d681SAndroid Build Coastguard WorkerWith an additional compiler flag ``-fsanitize-coverage=trace-cmp`` (see SanitizerCoverageTraceDataFlow_) 596*9880d681SAndroid Build Coastguard Workerand extra run-time flag ``-use_traces=1`` the fuzzer will try to apply *data-flow-guided fuzzing*. 597*9880d681SAndroid Build Coastguard WorkerThat is, the fuzzer will record the inputs to comparison instructions, switch statements, 598*9880d681SAndroid Build Coastguard Workerand several libc functions (``memcmp``, ``strcmp``, ``strncmp``, etc). 599*9880d681SAndroid Build Coastguard WorkerIt will later use those recorded inputs during mutations. 600*9880d681SAndroid Build Coastguard Worker 601*9880d681SAndroid Build Coastguard WorkerThis mode can be combined with DataFlowSanitizer_ to achieve better sensitivity. 602*9880d681SAndroid Build Coastguard Worker 603*9880d681SAndroid Build Coastguard WorkerFuzzer-friendly build mode 604*9880d681SAndroid Build Coastguard Worker--------------------------- 605*9880d681SAndroid Build Coastguard WorkerSometimes the code under test is not fuzzing-friendly. Examples: 606*9880d681SAndroid Build Coastguard Worker 607*9880d681SAndroid Build Coastguard Worker - The target code uses a PRNG seeded e.g. by system time and 608*9880d681SAndroid Build Coastguard Worker thus two consequent invocations may potentially execute different code paths 609*9880d681SAndroid Build Coastguard Worker even if the end result will be the same. This will cause a fuzzer to treat 610*9880d681SAndroid Build Coastguard Worker two similar inputs as significantly different and it will blow up the test corpus. 611*9880d681SAndroid Build Coastguard Worker E.g. libxml uses ``rand()`` inside its hash table. 612*9880d681SAndroid Build Coastguard Worker - The target code uses checksums to protect from invalid inputs. 613*9880d681SAndroid Build Coastguard Worker E.g. png checks CRC for every chunk. 614*9880d681SAndroid Build Coastguard Worker 615*9880d681SAndroid Build Coastguard WorkerIn many cases it makes sense to build a special fuzzing-friendly build 616*9880d681SAndroid Build Coastguard Workerwith certain fuzzing-unfriendly features disabled. We propose to use a common build macro 617*9880d681SAndroid Build Coastguard Workerfor all such cases for consistency: ``FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION``. 618*9880d681SAndroid Build Coastguard Worker 619*9880d681SAndroid Build Coastguard Worker.. code-block:: c++ 620*9880d681SAndroid Build Coastguard Worker 621*9880d681SAndroid Build Coastguard Worker void MyInitPRNG() { 622*9880d681SAndroid Build Coastguard Worker #ifdef FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION 623*9880d681SAndroid Build Coastguard Worker // In fuzzing mode the behavior of the code should be deterministic. 624*9880d681SAndroid Build Coastguard Worker srand(0); 625*9880d681SAndroid Build Coastguard Worker #else 626*9880d681SAndroid Build Coastguard Worker srand(time(0)); 627*9880d681SAndroid Build Coastguard Worker #endif 628*9880d681SAndroid Build Coastguard Worker } 629*9880d681SAndroid Build Coastguard Worker 630*9880d681SAndroid Build Coastguard Worker 631*9880d681SAndroid Build Coastguard Worker 632*9880d681SAndroid Build Coastguard WorkerAFL compatibility 633*9880d681SAndroid Build Coastguard Worker----------------- 634*9880d681SAndroid Build Coastguard WorkerLibFuzzer can be used together with AFL_ on the same test corpus. 635*9880d681SAndroid Build Coastguard WorkerBoth fuzzers expect the test corpus to reside in a directory, one file per input. 636*9880d681SAndroid Build Coastguard WorkerYou can run both fuzzers on the same corpus, one after another: 637*9880d681SAndroid Build Coastguard Worker 638*9880d681SAndroid Build Coastguard Worker.. code-block:: console 639*9880d681SAndroid Build Coastguard Worker 640*9880d681SAndroid Build Coastguard Worker ./afl-fuzz -i testcase_dir -o findings_dir /path/to/program @@ 641*9880d681SAndroid Build Coastguard Worker ./llvm-fuzz testcase_dir findings_dir # Will write new tests to testcase_dir 642*9880d681SAndroid Build Coastguard Worker 643*9880d681SAndroid Build Coastguard WorkerPeriodically restart both fuzzers so that they can use each other's findings. 644*9880d681SAndroid Build Coastguard WorkerCurrently, there is no simple way to run both fuzzing engines in parallel while sharing the same corpus dir. 645*9880d681SAndroid Build Coastguard Worker 646*9880d681SAndroid Build Coastguard WorkerYou may also use AFL on your target function ``LLVMFuzzerTestOneInput``: 647*9880d681SAndroid Build Coastguard Workersee an example `here <https://github.com/llvm-mirror/llvm/blob/master/lib/Fuzzer/afl/afl_driver.cpp>`__. 648*9880d681SAndroid Build Coastguard Worker 649*9880d681SAndroid Build Coastguard WorkerHow good is my fuzzer? 650*9880d681SAndroid Build Coastguard Worker---------------------- 651*9880d681SAndroid Build Coastguard Worker 652*9880d681SAndroid Build Coastguard WorkerOnce you implement your target function ``LLVMFuzzerTestOneInput`` and fuzz it to death, 653*9880d681SAndroid Build Coastguard Workeryou will want to know whether the function or the corpus can be improved further. 654*9880d681SAndroid Build Coastguard WorkerOne easy to use metric is, of course, code coverage. 655*9880d681SAndroid Build Coastguard WorkerYou can get the coverage for your corpus like this: 656*9880d681SAndroid Build Coastguard Worker 657*9880d681SAndroid Build Coastguard Worker.. code-block:: console 658*9880d681SAndroid Build Coastguard Worker 659*9880d681SAndroid Build Coastguard Worker ASAN_OPTIONS=coverage=1:html_cov_report=1 ./fuzzer CORPUS_DIR -runs=0 660*9880d681SAndroid Build Coastguard Worker 661*9880d681SAndroid Build Coastguard WorkerThis will run all tests in the CORPUS_DIR but will not perform any fuzzing. 662*9880d681SAndroid Build Coastguard WorkerAt the end of the process it will dump a single html file with coverage information. 663*9880d681SAndroid Build Coastguard WorkerSee SanitizerCoverage_ for details. 664*9880d681SAndroid Build Coastguard Worker 665*9880d681SAndroid Build Coastguard WorkerYou may also use other ways to visualize coverage, 666*9880d681SAndroid Build Coastguard Workere.g. using `Clang coverage <http://clang.llvm.org/docs/SourceBasedCodeCoverage.html>`_, 667*9880d681SAndroid Build Coastguard Workerbut those will require 668*9880d681SAndroid Build Coastguard Workeryou to rebuild the code with different compiler flags. 669*9880d681SAndroid Build Coastguard Worker 670*9880d681SAndroid Build Coastguard WorkerUser-supplied mutators 671*9880d681SAndroid Build Coastguard Worker---------------------- 672*9880d681SAndroid Build Coastguard Worker 673*9880d681SAndroid Build Coastguard WorkerLibFuzzer allows to use custom (user-supplied) mutators, 674*9880d681SAndroid Build Coastguard Workersee FuzzerInterface.h_ 675*9880d681SAndroid Build Coastguard Worker 676*9880d681SAndroid Build Coastguard WorkerStartup initialization 677*9880d681SAndroid Build Coastguard Worker---------------------- 678*9880d681SAndroid Build Coastguard WorkerIf the library being tested needs to be initialized, there are several options. 679*9880d681SAndroid Build Coastguard Worker 680*9880d681SAndroid Build Coastguard WorkerThe simplest way is to have a statically initialized global object inside 681*9880d681SAndroid Build Coastguard Worker`LLVMFuzzerTestOneInput` (or in global scope if that works for you): 682*9880d681SAndroid Build Coastguard Worker 683*9880d681SAndroid Build Coastguard Worker.. code-block:: c++ 684*9880d681SAndroid Build Coastguard Worker 685*9880d681SAndroid Build Coastguard Worker extern "C" int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size) { 686*9880d681SAndroid Build Coastguard Worker static bool Initialized = DoInitialization(); 687*9880d681SAndroid Build Coastguard Worker ... 688*9880d681SAndroid Build Coastguard Worker 689*9880d681SAndroid Build Coastguard WorkerAlternatively, you may define an optional init function and it will receive 690*9880d681SAndroid Build Coastguard Workerthe program arguments that you can read and modify. Do this **only** if you 691*9880d681SAndroid Build Coastguard Workerrealy need to access ``argv``/``argc``. 692*9880d681SAndroid Build Coastguard Worker 693*9880d681SAndroid Build Coastguard Worker.. code-block:: c++ 694*9880d681SAndroid Build Coastguard Worker 695*9880d681SAndroid Build Coastguard Worker extern "C" int LLVMFuzzerInitialize(int *argc, char ***argv) { 696*9880d681SAndroid Build Coastguard Worker ReadAndMaybeModify(argc, argv); 697*9880d681SAndroid Build Coastguard Worker return 0; 698*9880d681SAndroid Build Coastguard Worker } 699*9880d681SAndroid Build Coastguard Worker 700*9880d681SAndroid Build Coastguard Worker 701*9880d681SAndroid Build Coastguard WorkerLeaks 702*9880d681SAndroid Build Coastguard Worker----- 703*9880d681SAndroid Build Coastguard Worker 704*9880d681SAndroid Build Coastguard WorkerBinaries built with AddressSanitizer_ or LeakSanitizer_ will try to detect 705*9880d681SAndroid Build Coastguard Workermemory leaks at the process shutdown. 706*9880d681SAndroid Build Coastguard WorkerFor in-process fuzzing this is inconvenient 707*9880d681SAndroid Build Coastguard Workersince the fuzzer needs to report a leak with a reproducer as soon as the leaky 708*9880d681SAndroid Build Coastguard Workermutation is found. However, running full leak detection after every mutation 709*9880d681SAndroid Build Coastguard Workeris expensive. 710*9880d681SAndroid Build Coastguard Worker 711*9880d681SAndroid Build Coastguard WorkerBy default (``-detect_leaks=1``) libFuzzer will count the number of 712*9880d681SAndroid Build Coastguard Worker``malloc`` and ``free`` calls when executing every mutation. 713*9880d681SAndroid Build Coastguard WorkerIf the numbers don't match (which by itself doesn't mean there is a leak) 714*9880d681SAndroid Build Coastguard WorkerlibFuzzer will invoke the more expensive LeakSanitizer_ 715*9880d681SAndroid Build Coastguard Workerpass and if the actual leak is found, it will be reported with the reproducer 716*9880d681SAndroid Build Coastguard Workerand the process will exit. 717*9880d681SAndroid Build Coastguard Worker 718*9880d681SAndroid Build Coastguard WorkerIf your target has massive leaks and the leak detection is disabled 719*9880d681SAndroid Build Coastguard Workeryou will eventually run out of RAM (see the ``-rss_limit_mb`` flag). 720*9880d681SAndroid Build Coastguard Worker 721*9880d681SAndroid Build Coastguard Worker 722*9880d681SAndroid Build Coastguard WorkerDeveloping libFuzzer 723*9880d681SAndroid Build Coastguard Worker==================== 724*9880d681SAndroid Build Coastguard Worker 725*9880d681SAndroid Build Coastguard WorkerBuilding libFuzzer as a part of LLVM project and running its test requires 726*9880d681SAndroid Build Coastguard Workerfresh clang as the host compiler and special CMake configuration: 727*9880d681SAndroid Build Coastguard Worker 728*9880d681SAndroid Build Coastguard Worker.. code-block:: console 729*9880d681SAndroid Build Coastguard Worker 730*9880d681SAndroid Build Coastguard Worker cmake -GNinja -DCMAKE_C_COMPILER=clang -DCMAKE_CXX_COMPILER=clang++ -DLLVM_USE_SANITIZER=Address -DLLVM_USE_SANITIZE_COVERAGE=YES -DCMAKE_BUILD_TYPE=Release -DLLVM_ENABLE_ASSERTIONS=ON /path/to/llvm 731*9880d681SAndroid Build Coastguard Worker ninja check-fuzzer 732*9880d681SAndroid Build Coastguard Worker 733*9880d681SAndroid Build Coastguard Worker 734*9880d681SAndroid Build Coastguard WorkerFuzzing components of LLVM 735*9880d681SAndroid Build Coastguard Worker========================== 736*9880d681SAndroid Build Coastguard Worker.. contents:: 737*9880d681SAndroid Build Coastguard Worker :local: 738*9880d681SAndroid Build Coastguard Worker :depth: 1 739*9880d681SAndroid Build Coastguard Worker 740*9880d681SAndroid Build Coastguard WorkerTo build any of the LLVM fuzz targets use the build instructions above. 741*9880d681SAndroid Build Coastguard Worker 742*9880d681SAndroid Build Coastguard Workerclang-format-fuzzer 743*9880d681SAndroid Build Coastguard Worker------------------- 744*9880d681SAndroid Build Coastguard WorkerThe inputs are random pieces of C++-like text. 745*9880d681SAndroid Build Coastguard Worker 746*9880d681SAndroid Build Coastguard Worker.. code-block:: console 747*9880d681SAndroid Build Coastguard Worker 748*9880d681SAndroid Build Coastguard Worker ninja clang-format-fuzzer 749*9880d681SAndroid Build Coastguard Worker mkdir CORPUS_DIR 750*9880d681SAndroid Build Coastguard Worker ./bin/clang-format-fuzzer CORPUS_DIR 751*9880d681SAndroid Build Coastguard Worker 752*9880d681SAndroid Build Coastguard WorkerOptionally build other kinds of binaries (ASan+Debug, MSan, UBSan, etc). 753*9880d681SAndroid Build Coastguard Worker 754*9880d681SAndroid Build Coastguard WorkerTracking bug: https://llvm.org/bugs/show_bug.cgi?id=23052 755*9880d681SAndroid Build Coastguard Worker 756*9880d681SAndroid Build Coastguard Workerclang-fuzzer 757*9880d681SAndroid Build Coastguard Worker------------ 758*9880d681SAndroid Build Coastguard Worker 759*9880d681SAndroid Build Coastguard WorkerThe behavior is very similar to ``clang-format-fuzzer``. 760*9880d681SAndroid Build Coastguard Worker 761*9880d681SAndroid Build Coastguard WorkerTracking bug: https://llvm.org/bugs/show_bug.cgi?id=23057 762*9880d681SAndroid Build Coastguard Worker 763*9880d681SAndroid Build Coastguard Workerllvm-as-fuzzer 764*9880d681SAndroid Build Coastguard Worker-------------- 765*9880d681SAndroid Build Coastguard Worker 766*9880d681SAndroid Build Coastguard WorkerTracking bug: https://llvm.org/bugs/show_bug.cgi?id=24639 767*9880d681SAndroid Build Coastguard Worker 768*9880d681SAndroid Build Coastguard Workerllvm-mc-fuzzer 769*9880d681SAndroid Build Coastguard Worker-------------- 770*9880d681SAndroid Build Coastguard Worker 771*9880d681SAndroid Build Coastguard WorkerThis tool fuzzes the MC layer. Currently it is only able to fuzz the 772*9880d681SAndroid Build Coastguard Workerdisassembler but it is hoped that assembly, and round-trip verification will be 773*9880d681SAndroid Build Coastguard Workeradded in future. 774*9880d681SAndroid Build Coastguard Worker 775*9880d681SAndroid Build Coastguard WorkerWhen run in dissassembly mode, the inputs are opcodes to be disassembled. The 776*9880d681SAndroid Build Coastguard Workerfuzzer will consume as many instructions as possible and will stop when it 777*9880d681SAndroid Build Coastguard Workerfinds an invalid instruction or runs out of data. 778*9880d681SAndroid Build Coastguard Worker 779*9880d681SAndroid Build Coastguard WorkerPlease note that the command line interface differs slightly from that of other 780*9880d681SAndroid Build Coastguard Workerfuzzers. The fuzzer arguments should follow ``--fuzzer-args`` and should have 781*9880d681SAndroid Build Coastguard Workera single dash, while other arguments control the operation mode and target in a 782*9880d681SAndroid Build Coastguard Workersimilar manner to ``llvm-mc`` and should have two dashes. For example: 783*9880d681SAndroid Build Coastguard Worker 784*9880d681SAndroid Build Coastguard Worker.. code-block:: console 785*9880d681SAndroid Build Coastguard Worker 786*9880d681SAndroid Build Coastguard Worker llvm-mc-fuzzer --triple=aarch64-linux-gnu --disassemble --fuzzer-args -max_len=4 -jobs=10 787*9880d681SAndroid Build Coastguard Worker 788*9880d681SAndroid Build Coastguard WorkerBuildbot 789*9880d681SAndroid Build Coastguard Worker-------- 790*9880d681SAndroid Build Coastguard Worker 791*9880d681SAndroid Build Coastguard WorkerA buildbot continuously runs the above fuzzers for LLVM components, with results 792*9880d681SAndroid Build Coastguard Workershown at http://lab.llvm.org:8011/builders/sanitizer-x86_64-linux-fuzzer . 793*9880d681SAndroid Build Coastguard Worker 794*9880d681SAndroid Build Coastguard WorkerFAQ 795*9880d681SAndroid Build Coastguard Worker========================= 796*9880d681SAndroid Build Coastguard Worker 797*9880d681SAndroid Build Coastguard WorkerQ. Why doesn't libFuzzer use any of the LLVM support? 798*9880d681SAndroid Build Coastguard Worker----------------------------------------------------- 799*9880d681SAndroid Build Coastguard Worker 800*9880d681SAndroid Build Coastguard WorkerThere are two reasons. 801*9880d681SAndroid Build Coastguard Worker 802*9880d681SAndroid Build Coastguard WorkerFirst, we want this library to be used outside of the LLVM without users having to 803*9880d681SAndroid Build Coastguard Workerbuild the rest of LLVM. This may sound unconvincing for many LLVM folks, 804*9880d681SAndroid Build Coastguard Workerbut in practice the need for building the whole LLVM frightens many potential 805*9880d681SAndroid Build Coastguard Workerusers -- and we want more users to use this code. 806*9880d681SAndroid Build Coastguard Worker 807*9880d681SAndroid Build Coastguard WorkerSecond, there is a subtle technical reason not to rely on the rest of LLVM, or 808*9880d681SAndroid Build Coastguard Workerany other large body of code (maybe not even STL). When coverage instrumentation 809*9880d681SAndroid Build Coastguard Workeris enabled, it will also instrument the LLVM support code which will blow up the 810*9880d681SAndroid Build Coastguard Workercoverage set of the process (since the fuzzer is in-process). In other words, by 811*9880d681SAndroid Build Coastguard Workerusing more external dependencies we will slow down the fuzzer while the main 812*9880d681SAndroid Build Coastguard Workerreason for it to exist is extreme speed. 813*9880d681SAndroid Build Coastguard Worker 814*9880d681SAndroid Build Coastguard WorkerQ. What about Windows then? The fuzzer contains code that does not build on Windows. 815*9880d681SAndroid Build Coastguard Worker------------------------------------------------------------------------------------ 816*9880d681SAndroid Build Coastguard Worker 817*9880d681SAndroid Build Coastguard WorkerVolunteers are welcome. 818*9880d681SAndroid Build Coastguard Worker 819*9880d681SAndroid Build Coastguard WorkerQ. When this Fuzzer is not a good solution for a problem? 820*9880d681SAndroid Build Coastguard Worker--------------------------------------------------------- 821*9880d681SAndroid Build Coastguard Worker 822*9880d681SAndroid Build Coastguard Worker* If the test inputs are validated by the target library and the validator 823*9880d681SAndroid Build Coastguard Worker asserts/crashes on invalid inputs, in-process fuzzing is not applicable. 824*9880d681SAndroid Build Coastguard Worker* Bugs in the target library may accumulate without being detected. E.g. a memory 825*9880d681SAndroid Build Coastguard Worker corruption that goes undetected at first and then leads to a crash while 826*9880d681SAndroid Build Coastguard Worker testing another input. This is why it is highly recommended to run this 827*9880d681SAndroid Build Coastguard Worker in-process fuzzer with all sanitizers to detect most bugs on the spot. 828*9880d681SAndroid Build Coastguard Worker* It is harder to protect the in-process fuzzer from excessive memory 829*9880d681SAndroid Build Coastguard Worker consumption and infinite loops in the target library (still possible). 830*9880d681SAndroid Build Coastguard Worker* The target library should not have significant global state that is not 831*9880d681SAndroid Build Coastguard Worker reset between the runs. 832*9880d681SAndroid Build Coastguard Worker* Many interesting target libraries are not designed in a way that supports 833*9880d681SAndroid Build Coastguard Worker the in-process fuzzer interface (e.g. require a file path instead of a 834*9880d681SAndroid Build Coastguard Worker byte array). 835*9880d681SAndroid Build Coastguard Worker* If a single test run takes a considerable fraction of a second (or 836*9880d681SAndroid Build Coastguard Worker more) the speed benefit from the in-process fuzzer is negligible. 837*9880d681SAndroid Build Coastguard Worker* If the target library runs persistent threads (that outlive 838*9880d681SAndroid Build Coastguard Worker execution of one test) the fuzzing results will be unreliable. 839*9880d681SAndroid Build Coastguard Worker 840*9880d681SAndroid Build Coastguard WorkerQ. So, what exactly this Fuzzer is good for? 841*9880d681SAndroid Build Coastguard Worker-------------------------------------------- 842*9880d681SAndroid Build Coastguard Worker 843*9880d681SAndroid Build Coastguard WorkerThis Fuzzer might be a good choice for testing libraries that have relatively 844*9880d681SAndroid Build Coastguard Workersmall inputs, each input takes < 10ms to run, and the library code is not expected 845*9880d681SAndroid Build Coastguard Workerto crash on invalid inputs. 846*9880d681SAndroid Build Coastguard WorkerExamples: regular expression matchers, text or binary format parsers, compression, 847*9880d681SAndroid Build Coastguard Workernetwork, crypto. 848*9880d681SAndroid Build Coastguard Worker 849*9880d681SAndroid Build Coastguard WorkerTrophies 850*9880d681SAndroid Build Coastguard Worker======== 851*9880d681SAndroid Build Coastguard Worker* GLIBC: https://sourceware.org/glibc/wiki/FuzzingLibc 852*9880d681SAndroid Build Coastguard Worker 853*9880d681SAndroid Build Coastguard Worker* MUSL LIBC: `[1] <http://git.musl-libc.org/cgit/musl/commit/?id=39dfd58417ef642307d90306e1c7e50aaec5a35c>`__ `[2] <http://www.openwall.com/lists/oss-security/2015/03/30/3>`__ 854*9880d681SAndroid Build Coastguard Worker 855*9880d681SAndroid Build Coastguard Worker* `pugixml <https://github.com/zeux/pugixml/issues/39>`_ 856*9880d681SAndroid Build Coastguard Worker 857*9880d681SAndroid Build Coastguard Worker* PCRE: Search for "LLVM fuzzer" in http://vcs.pcre.org/pcre2/code/trunk/ChangeLog?view=markup; 858*9880d681SAndroid Build Coastguard Worker also in `bugzilla <https://bugs.exim.org/buglist.cgi?bug_status=__all__&content=libfuzzer&no_redirect=1&order=Importance&product=PCRE&query_format=specific>`_ 859*9880d681SAndroid Build Coastguard Worker 860*9880d681SAndroid Build Coastguard Worker* `ICU <http://bugs.icu-project.org/trac/ticket/11838>`_ 861*9880d681SAndroid Build Coastguard Worker 862*9880d681SAndroid Build Coastguard Worker* `Freetype <https://savannah.nongnu.org/search/?words=LibFuzzer&type_of_search=bugs&Search=Search&exact=1#options>`_ 863*9880d681SAndroid Build Coastguard Worker 864*9880d681SAndroid Build Coastguard Worker* `Harfbuzz <https://github.com/behdad/harfbuzz/issues/139>`_ 865*9880d681SAndroid Build Coastguard Worker 866*9880d681SAndroid Build Coastguard Worker* `SQLite <http://www3.sqlite.org/cgi/src/info/088009efdd56160b>`_ 867*9880d681SAndroid Build Coastguard Worker 868*9880d681SAndroid Build Coastguard Worker* `Python <http://bugs.python.org/issue25388>`_ 869*9880d681SAndroid Build Coastguard Worker 870*9880d681SAndroid Build Coastguard Worker* OpenSSL/BoringSSL: `[1] <https://boringssl.googlesource.com/boringssl/+/cb852981cd61733a7a1ae4fd8755b7ff950e857d>`_ `[2] <https://openssl.org/news/secadv/20160301.txt>`_ `[3] <https://boringssl.googlesource.com/boringssl/+/2b07fa4b22198ac02e0cee8f37f3337c3dba91bc>`_ `[4] <https://boringssl.googlesource.com/boringssl/+/6b6e0b20893e2be0e68af605a60ffa2cbb0ffa64>`_ `[5] <https://github.com/openssl/openssl/pull/931/commits/dd5ac557f052cc2b7f718ac44a8cb7ac6f77dca8>`_ `[6] <https://github.com/openssl/openssl/pull/931/commits/19b5b9194071d1d84e38ac9a952e715afbc85a81>`_ 871*9880d681SAndroid Build Coastguard Worker 872*9880d681SAndroid Build Coastguard Worker* `Libxml2 873*9880d681SAndroid Build Coastguard Worker <https://bugzilla.gnome.org/buglist.cgi?bug_status=__all__&content=libFuzzer&list_id=68957&order=Importance&product=libxml2&query_format=specific>`_ and `[HT206167] <https://support.apple.com/en-gb/HT206167>`_ (CVE-2015-5312, CVE-2015-7500, CVE-2015-7942) 874*9880d681SAndroid Build Coastguard Worker 875*9880d681SAndroid Build Coastguard Worker* `Linux Kernel's BPF verifier <https://github.com/iovisor/bpf-fuzzer>`_ 876*9880d681SAndroid Build Coastguard Worker 877*9880d681SAndroid Build Coastguard Worker* Capstone: `[1] <https://github.com/aquynh/capstone/issues/600>`__ `[2] <https://github.com/aquynh/capstone/commit/6b88d1d51eadf7175a8f8a11b690684443b11359>`__ 878*9880d681SAndroid Build Coastguard Worker 879*9880d681SAndroid Build Coastguard Worker* file:`[1] <http://bugs.gw.com/view.php?id=550>`__ `[2] <http://bugs.gw.com/view.php?id=551>`__ `[3] <http://bugs.gw.com/view.php?id=553>`__ `[4] <http://bugs.gw.com/view.php?id=554>`__ 880*9880d681SAndroid Build Coastguard Worker 881*9880d681SAndroid Build Coastguard Worker* Radare2: `[1] <https://github.com/revskills?tab=contributions&from=2016-04-09>`__ 882*9880d681SAndroid Build Coastguard Worker 883*9880d681SAndroid Build Coastguard Worker* gRPC: `[1] <https://github.com/grpc/grpc/pull/6071/commits/df04c1f7f6aec6e95722ec0b023a6b29b6ea871c>`__ `[2] <https://github.com/grpc/grpc/pull/6071/commits/22a3dfd95468daa0db7245a4e8e6679a52847579>`__ `[3] <https://github.com/grpc/grpc/pull/6071/commits/9cac2a12d9e181d130841092e9d40fa3309d7aa7>`__ `[4] <https://github.com/grpc/grpc/pull/6012/commits/82a91c91d01ce9b999c8821ed13515883468e203>`__ `[5] <https://github.com/grpc/grpc/pull/6202/commits/2e3e0039b30edaf89fb93bfb2c1d0909098519fa>`__ `[6] <https://github.com/grpc/grpc/pull/6106/files>`__ 884*9880d681SAndroid Build Coastguard Worker 885*9880d681SAndroid Build Coastguard Worker* WOFF2: `[1] <https://github.com/google/woff2/commit/a15a8ab>`__ 886*9880d681SAndroid Build Coastguard Worker 887*9880d681SAndroid Build Coastguard Worker* LLVM: `Clang <https://llvm.org/bugs/show_bug.cgi?id=23057>`_, `Clang-format <https://llvm.org/bugs/show_bug.cgi?id=23052>`_, `libc++ <https://llvm.org/bugs/show_bug.cgi?id=24411>`_, `llvm-as <https://llvm.org/bugs/show_bug.cgi?id=24639>`_, Disassembler: http://reviews.llvm.org/rL247405, http://reviews.llvm.org/rL247414, http://reviews.llvm.org/rL247416, http://reviews.llvm.org/rL247417, http://reviews.llvm.org/rL247420, http://reviews.llvm.org/rL247422. 888*9880d681SAndroid Build Coastguard Worker 889*9880d681SAndroid Build Coastguard Worker.. _pcre2: http://www.pcre.org/ 890*9880d681SAndroid Build Coastguard Worker.. _AFL: http://lcamtuf.coredump.cx/afl/ 891*9880d681SAndroid Build Coastguard Worker.. _SanitizerCoverage: http://clang.llvm.org/docs/SanitizerCoverage.html 892*9880d681SAndroid Build Coastguard Worker.. _SanitizerCoverageTraceDataFlow: http://clang.llvm.org/docs/SanitizerCoverage.html#tracing-data-flow 893*9880d681SAndroid Build Coastguard Worker.. _DataFlowSanitizer: http://clang.llvm.org/docs/DataFlowSanitizer.html 894*9880d681SAndroid Build Coastguard Worker.. _AddressSanitizer: http://clang.llvm.org/docs/AddressSanitizer.html 895*9880d681SAndroid Build Coastguard Worker.. _LeakSanitizer: http://clang.llvm.org/docs/LeakSanitizer.html 896*9880d681SAndroid Build Coastguard Worker.. _Heartbleed: http://en.wikipedia.org/wiki/Heartbleed 897*9880d681SAndroid Build Coastguard Worker.. _FuzzerInterface.h: https://github.com/llvm-mirror/llvm/blob/master/lib/Fuzzer/FuzzerInterface.h 898*9880d681SAndroid Build Coastguard Worker.. _3.7.0: http://llvm.org/releases/3.7.0/docs/LibFuzzer.html 899*9880d681SAndroid Build Coastguard Worker.. _building Clang from trunk: http://clang.llvm.org/get_started.html 900*9880d681SAndroid Build Coastguard Worker.. _MemorySanitizer: http://clang.llvm.org/docs/MemorySanitizer.html 901*9880d681SAndroid Build Coastguard Worker.. _UndefinedBehaviorSanitizer: http://clang.llvm.org/docs/UndefinedBehaviorSanitizer.html 902*9880d681SAndroid Build Coastguard Worker.. _`coverage counters`: http://clang.llvm.org/docs/SanitizerCoverage.html#coverage-counters 903*9880d681SAndroid Build Coastguard Worker.. _`caller-callee pairs`: http://clang.llvm.org/docs/SanitizerCoverage.html#caller-callee-coverage 904*9880d681SAndroid Build Coastguard Worker.. _BoringSSL: https://boringssl.googlesource.com/boringssl/ 905*9880d681SAndroid Build Coastguard Worker.. _`fuzz various parts of LLVM itself`: `Fuzzing components of LLVM`_ 906