Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(260)

Side by Side Diff: third_party/afl/src/docs/README

Issue 2238013002: Roll src/third_party/afl/src/ 2.14b..2.30b (16 versions). (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Note in "Local Modifications" that we have removed dictionaries/. Created 4 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 ================== 1 ==================
2 american fuzzy lop 2 american fuzzy lop
3 ================== 3 ==================
4 4
5 Written and maintained by Michal Zalewski <lcamtuf@google.com> 5 Written and maintained by Michal Zalewski <lcamtuf@google.com>
6 6
7 Copyright 2013, 2014, 2015, 2016 Google Inc. All rights reserved. 7 Copyright 2013, 2014, 2015, 2016 Google Inc. All rights reserved.
8 Released under terms and conditions of Apache License, Version 2.0. 8 Released under terms and conditions of Apache License, Version 2.0.
9 9
10 For new versions and additional information, check out: 10 For new versions and additional information, check out:
(...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after
108 data from stdin or from a file and passes it to the tested library. In such a 108 data from stdin or from a file and passes it to the tested library. In such a
109 case, it is essential to link this executable against a static version of the 109 case, it is essential to link this executable against a static version of the
110 instrumented library, or to make sure that the correct .so file is loaded at 110 instrumented library, or to make sure that the correct .so file is loaded at
111 runtime (usually by setting LD_LIBRARY_PATH). The simplest option is a static 111 runtime (usually by setting LD_LIBRARY_PATH). The simplest option is a static
112 build, usually possible via: 112 build, usually possible via:
113 113
114 $ CC=/path/to/afl/afl-gcc ./configure --disable-shared 114 $ CC=/path/to/afl/afl-gcc ./configure --disable-shared
115 115
116 Setting AFL_HARDEN=1 when calling 'make' will cause the CC wrapper to 116 Setting AFL_HARDEN=1 when calling 'make' will cause the CC wrapper to
117 automatically enable code hardening options that make it easier to detect 117 automatically enable code hardening options that make it easier to detect
118 simple memory bugs. 118 simple memory bugs. Libdislocator, a helper library included with AFL (see
119 libdislocator/README.dislocator) can help uncover heap corruption issues, too.
119 120
120 PS. ASAN users are advised to review notes_for_asan.txt file for important 121 PS. ASAN users are advised to review notes_for_asan.txt file for important
121 caveats. 122 caveats.
122 123
123 4) Instrumenting binary-only apps 124 4) Instrumenting binary-only apps
124 --------------------------------- 125 ---------------------------------
125 126
126 When source code is *NOT* available, the fuzzer offers experimental support for 127 When source code is *NOT* available, the fuzzer offers experimental support for
127 fast, on-the-fly instrumentation of black-box binaries. This is accomplished 128 fast, on-the-fly instrumentation of black-box binaries. This is accomplished
128 with a version of QEMU running in the lesser-known "user space emulation" mode. 129 with a version of QEMU running in the lesser-known "user space emulation" mode.
(...skipping 140 matching lines...) Expand 10 before | Expand all | Expand 10 after
269 redundant verbiage - notably including HTML, SQL, or JavaScript. 270 redundant verbiage - notably including HTML, SQL, or JavaScript.
270 271
271 To avoid the hassle of building syntax-aware tools, afl-fuzz provides a way to 272 To avoid the hassle of building syntax-aware tools, afl-fuzz provides a way to
272 seed the fuzzing process with an optional dictionary of language keywords, 273 seed the fuzzing process with an optional dictionary of language keywords,
273 magic headers, or other special tokens associated with the targeted data type 274 magic headers, or other special tokens associated with the targeted data type
274 - and use that to reconstruct the underlying grammar on the go: 275 - and use that to reconstruct the underlying grammar on the go:
275 276
276 http://lcamtuf.blogspot.com/2015/01/afl-fuzz-making-up-grammar-with.html 277 http://lcamtuf.blogspot.com/2015/01/afl-fuzz-making-up-grammar-with.html
277 278
278 To use this feature, you first need to create a dictionary in one of the two 279 To use this feature, you first need to create a dictionary in one of the two
279 formats discussed in testcases/README.testcases; and then point the fuzzer to 280 formats discussed in dictionaries/README.dictionaries; and then point the fuzzer
280 it via the -x option in the command line. 281 to it via the -x option in the command line.
282
283 (Several common dictionaries are already provided in that subdirectory, too.)
281 284
282 There is no way to provide more structured descriptions of the underlying 285 There is no way to provide more structured descriptions of the underlying
283 syntax, but the fuzzer will likely figure out some of this based on the 286 syntax, but the fuzzer will likely figure out some of this based on the
284 instrumentation feedback alone. This actually works in practice, say: 287 instrumentation feedback alone. This actually works in practice, say:
285 288
286 http://lcamtuf.blogspot.com/2015/04/finding-bugs-in-sqlite-easy-way.html 289 http://lcamtuf.blogspot.com/2015/04/finding-bugs-in-sqlite-easy-way.html
287 290
288 PS. Even when no explicit dictionary is given, afl-fuzz will try to extract 291 PS. Even when no explicit dictionary is given, afl-fuzz will try to extract
289 existing syntax tokens in the input corpus by watching the instrumentation 292 existing syntax tokens in the input corpus by watching the instrumentation
290 very closely during deterministic byte flips. This works for some types of 293 very closely during deterministic byte flips. This works for some types of
291 parsers and grammars, but isn't nearly as good as the -x mode. 294 parsers and grammars, but isn't nearly as good as the -x mode.
292 295
296 If a dictionary is really hard to come by, another option is to let AFL run
297 for a while, and then use the token capture library that comes as a companion
298 utility with AFL. For that, see libtokencap/README.tokencap.
299
293 10) Crash triage 300 10) Crash triage
294 ---------------- 301 ----------------
295 302
296 The coverage-based grouping of crashes usually produces a small data set that 303 The coverage-based grouping of crashes usually produces a small data set that
297 can be quickly triaged manually or with a very simple GDB or Valgrind script. 304 can be quickly triaged manually or with a very simple GDB or Valgrind script.
298 Every crash is also traceable to its parent non-crashing test case in the 305 Every crash is also traceable to its parent non-crashing test case in the
299 queue, making it easier to diagnose faults. 306 queue, making it easier to diagnose faults.
300 307
301 Having said that, it's important to acknowledge that some fuzzing crashes can be 308 Having said that, it's important to acknowledge that some fuzzing crashes can be
302 difficult quickly evaluate for exploitability without a lot of debugging and 309 difficult quickly evaluate for exploitability without a lot of debugging and
(...skipping 26 matching lines...) Expand all
329 The minimizer accepts the -m, -t, -f and @@ syntax in a manner compatible with 336 The minimizer accepts the -m, -t, -f and @@ syntax in a manner compatible with
330 afl-fuzz. 337 afl-fuzz.
331 338
332 Another recent addition to AFL is the afl-analyze tool. It takes an input 339 Another recent addition to AFL is the afl-analyze tool. It takes an input
333 file, attempts to sequentially flip bytes, and observes the behavior of the 340 file, attempts to sequentially flip bytes, and observes the behavior of the
334 tested program. It then color-codes the input based on which sections appear to 341 tested program. It then color-codes the input based on which sections appear to
335 be critical, and which are not; while not bulletproof, it can often offer quick 342 be critical, and which are not; while not bulletproof, it can often offer quick
336 insights into complex file formats. More info about its operation can be found 343 insights into complex file formats. More info about its operation can be found
337 near the end of technical_details.txt. 344 near the end of technical_details.txt.
338 345
339 11) Common-sense risks 346 11) Going beyond crashes
347 ------------------------
348
349 Fuzzing is a wonderful and underutilized technique for discovering non-crashing
350 design and implementation errors, too. Quite a few interesting bugs have been
351 found by modifying the target programs to call abort() when, say:
352
353 - Two bignum libraries produce different outputs when given the same
354 fuzzer-generated input,
355
356 - An image library produces different outputs when asked to decode the same
357 input image several times in a row,
358
359 - A serialization / deserialization library fails to produce stable outputs
360 when iteratively serializing and deserializing fuzzer-supplied data,
361
362 - A compression library produces an output inconsistent with the input file
363 when asked to compress and then decompress a particular blob.
364
365 Implementing these or similar sanity checks usually takes very little time;
366 if you are the maintainer of a particular package, you can make this code
367 conditional with #ifdef FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION (a flag also
368 shared with libfuzzer) or #ifdef __AFL_COMPILER (this one is just for AFL).
369
370 12) Common-sense risks
340 ---------------------- 371 ----------------------
341 372
342 Please keep in mind that, similarly to many other computationally-intensive 373 Please keep in mind that, similarly to many other computationally-intensive
343 tasks, fuzzing may put strain on your hardware and on the OS. In particular: 374 tasks, fuzzing may put strain on your hardware and on the OS. In particular:
344 375
345 - Your CPU will run hot and will need adequate cooling. In most cases, if 376 - Your CPU will run hot and will need adequate cooling. In most cases, if
346 cooling is insufficient or stops working properly, CPU speeds will be 377 cooling is insufficient or stops working properly, CPU speeds will be
347 automatically throttled. That said, especially when fuzzing on less 378 automatically throttled. That said, especially when fuzzing on less
348 suitable hardware (laptops, smartphones, etc), it's not entirely impossible 379 suitable hardware (laptops, smartphones, etc), it's not entirely impossible
349 for something to blow up. 380 for something to blow up.
350 381
351 - Targeted programs may end up erratically grabbing gigabytes of memory or 382 - Targeted programs may end up erratically grabbing gigabytes of memory or
352 filling up disk space with junk files. AFL tries to enforce basic memory 383 filling up disk space with junk files. AFL tries to enforce basic memory
353 limits, but can't prevent each and every possible mishap. The bottom line 384 limits, but can't prevent each and every possible mishap. The bottom line
354 is that you shouldn't be fuzzing on systems where the prospect of data loss 385 is that you shouldn't be fuzzing on systems where the prospect of data loss
355 is not an acceptable risk. 386 is not an acceptable risk.
356 387
357 - Fuzzing involves billions of reads and writes to the filesystem. On modern 388 - Fuzzing involves billions of reads and writes to the filesystem. On modern
358 systems, this will be usually heavily cached, resulting in fairly modest 389 systems, this will be usually heavily cached, resulting in fairly modest
359 "physical" I/O - but there are many factors that may alter this equation. 390 "physical" I/O - but there are many factors that may alter this equation.
360 It is your responsibility to monitor for potential trouble; with very heavy 391 It is your responsibility to monitor for potential trouble; with very heavy
361 I/O, the lifespan of many HDDs and SSDs may be reduced. 392 I/O, the lifespan of many HDDs and SSDs may be reduced.
362 393
363 A good way to monitor disk I/O on Linux is the 'iostat' command: 394 A good way to monitor disk I/O on Linux is the 'iostat' command:
364 395
365 $ iostat -d 3 -x -k [...optional disk ID...] 396 $ iostat -d 3 -x -k [...optional disk ID...]
366 397
367 12) Known limitations & areas for improvement 398 13) Known limitations & areas for improvement
368 --------------------------------------------- 399 ---------------------------------------------
369 400
370 Here are some of the most important caveats for AFL: 401 Here are some of the most important caveats for AFL:
371 402
372 - AFL detects faults by checking for the first spawned process dying due to 403 - AFL detects faults by checking for the first spawned process dying due to
373 a signal (SIGSEGV, SIGABRT, etc). Programs that install custom handlers for 404 a signal (SIGSEGV, SIGABRT, etc). Programs that install custom handlers for
374 these signals may need to have the relevant code commented out. In the same 405 these signals may need to have the relevant code commented out. In the same
375 vein, faults in child processed spawned by the fuzzed target may evade 406 vein, faults in child processed spawned by the fuzzed target may evade
376 detection unless you manually add some code to catch that. 407 detection unless you manually add some code to catch that.
377 408
(...skipping 15 matching lines...) Expand all
393 need to make simple code changes to make them behave in a more traditional 424 need to make simple code changes to make them behave in a more traditional
394 way. Preeny may offer a relatively simple option, too - see: 425 way. Preeny may offer a relatively simple option, too - see:
395 https://github.com/zardus/preeny 426 https://github.com/zardus/preeny
396 427
397 Some useful tips for modifying network-based services can be also found at: 428 Some useful tips for modifying network-based services can be also found at:
398 https://www.fastly.com/blog/how-to-fuzz-server-american-fuzzy-lop 429 https://www.fastly.com/blog/how-to-fuzz-server-american-fuzzy-lop
399 430
400 - AFL doesn't output human-readable coverage data. If you want to monitor 431 - AFL doesn't output human-readable coverage data. If you want to monitor
401 coverage, use afl-cov from Michael Rash: https://github.com/mrash/afl-cov 432 coverage, use afl-cov from Michael Rash: https://github.com/mrash/afl-cov
402 433
434 - Occasionally, sentient machines rise against their creators. If this
435 happens to you, please consult http://lcamtuf.coredump.cx/prep/.
436
403 Beyond this, see INSTALL for platform-specific tips. 437 Beyond this, see INSTALL for platform-specific tips.
404 438
405 13) Special thanks 439 14) Special thanks
406 ------------------ 440 ------------------
407 441
408 Many of the improvements to afl-fuzz wouldn't be possible without feedback, 442 Many of the improvements to afl-fuzz wouldn't be possible without feedback,
409 bug reports, or patches from: 443 bug reports, or patches from:
410 444
411 Jann Horn Hanno Boeck 445 Jann Horn Hanno Boeck
412 Felix Groebert Jakub Wilk 446 Felix Groebert Jakub Wilk
413 Richard W. M. Jones Alexander Cherepanov 447 Richard W. M. Jones Alexander Cherepanov
414 Tom Ritter Hovik Manucharyan 448 Tom Ritter Hovik Manucharyan
415 Sebastian Roschke Eberhard Mattes 449 Sebastian Roschke Eberhard Mattes
(...skipping 16 matching lines...) Expand all
432 Alex Moneger Dmitry Vyukov 466 Alex Moneger Dmitry Vyukov
433 Keegan McAllister Kostya Serebryany 467 Keegan McAllister Kostya Serebryany
434 Richo Healey Martijn Bogaard 468 Richo Healey Martijn Bogaard
435 rc0r Jonathan Foote 469 rc0r Jonathan Foote
436 Christian Holler Dominique Pelle 470 Christian Holler Dominique Pelle
437 Jacek Wielemborek Leo Barnes 471 Jacek Wielemborek Leo Barnes
438 Jeremy Barnes Jeff Trull 472 Jeremy Barnes Jeff Trull
439 Guillaume Endignoux ilovezfs 473 Guillaume Endignoux ilovezfs
440 Daniel Godas-Lopez Franjo Ivancic 474 Daniel Godas-Lopez Franjo Ivancic
441 Austin Seipp Daniel Komaromy 475 Austin Seipp Daniel Komaromy
442 Daniel Binderman 476 Daniel Binderman Jonathan Metzman
477 Vegard Nossum Jan Kneschke
478 Kurt Roeckx
443 479
444 Thank you! 480 Thank you!
445 481
446 14) Contact 482 15) Contact
447 ----------- 483 -----------
448 484
449 Questions? Concerns? Bug reports? The author can be usually reached at 485 Questions? Concerns? Bug reports? The author can be usually reached at
450 <lcamtuf@google.com>. 486 <lcamtuf@google.com>.
451 487
452 There is also a mailing list for the project; to join, send a mail to 488 There is also a mailing list for the project; to join, send a mail to
453 <afl-users+subscribe@googlegroups.com>. Or, if you prefer to browse 489 <afl-users+subscribe@googlegroups.com>. Or, if you prefer to browse
454 archives first, try: 490 archives first, try:
455 491
456 https://groups.google.com/group/afl-users 492 https://groups.google.com/group/afl-users
457 493
458 PS. If you wish to submit raw code to be incorporated into the project, please 494 PS. If you wish to submit raw code to be incorporated into the project, please
459 be aware that the copyright on most of AFL is claimed by Google. While you do 495 be aware that the copyright on most of AFL is claimed by Google. While you do
460 retain copyright on your contributions, they do ask people to agree to a simple 496 retain copyright on your contributions, they do ask people to agree to a simple
461 CLA first: 497 CLA first:
462 498
463 https://cla.developers.google.com/clas 499 https://cla.developers.google.com/clas
464 500
465 Sorry about the hassle. Of course, no CLA is required for feature requests or 501 Sorry about the hassle. Of course, no CLA is required for feature requests or
466 bug reports. 502 bug reports.
OLDNEW
« no previous file with comments | « third_party/afl/src/docs/QuickStartGuide.txt ('k') | third_party/afl/src/docs/env_variables.txt » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698