| OLD | NEW |
| 1 =============================== | 1 =============================== |
| 2 Understanding the status screen | 2 Understanding the status screen |
| 3 =============================== | 3 =============================== |
| 4 | 4 |
| 5 This document provides an overview of the status screen - plus tips for | 5 This document provides an overview of the status screen - plus tips for |
| 6 troubleshooting any warnings and red text shown in the UI. See README for | 6 troubleshooting any warnings and red text shown in the UI. See README for |
| 7 the general instruction manual. | 7 the general instruction manual. |
| 8 | 8 |
| 9 0) A note about colors | 9 0) A note about colors |
| 10 ---------------------- | 10 ---------------------- |
| (...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 112 The "*" suffix sometimes shown in the first line means that the currently | 112 The "*" suffix sometimes shown in the first line means that the currently |
| 113 processed path is not "favored" (a property discussed later on, in section 6). | 113 processed path is not "favored" (a property discussed later on, in section 6). |
| 114 | 114 |
| 115 If you feel that the fuzzer is progressing too slowly, see the note about the | 115 If you feel that the fuzzer is progressing too slowly, see the note about the |
| 116 -d option in section 2 of this doc. | 116 -d option in section 2 of this doc. |
| 117 | 117 |
| 118 4) Map coverage | 118 4) Map coverage |
| 119 --------------- | 119 --------------- |
| 120 | 120 |
| 121 +--------------------------------------+ | 121 +--------------------------------------+ |
| 122 | map density : 4763 (29.07%) | | 122 | map density : 10.15% / 29.07% | |
| 123 | count coverage : 4.03 bits/tuple | | 123 | count coverage : 4.03 bits/tuple | |
| 124 +--------------------------------------+ | 124 +--------------------------------------+ |
| 125 | 125 |
| 126 The section provides some trivia about the coverage observed by the | 126 The section provides some trivia about the coverage observed by the |
| 127 instrumentation embedded in the target binary. | 127 instrumentation embedded in the target binary. |
| 128 | 128 |
| 129 The first line in the box tells you how many branch tuples we have already | 129 The first line in the box tells you how many branch tuples we have already |
| 130 hit, in proportion to how much the bitmap can hold. Be wary of extremes: | 130 hit, in proportion to how much the bitmap can hold. The number on the left |
| 131 describes the current input; the one on the right is the value for the entire |
| 132 input corpus. |
| 133 |
| 134 Be wary of extremes: |
| 131 | 135 |
| 132 - Absolute numbers below 200 or so suggest one of three things: that the | 136 - Absolute numbers below 200 or so suggest one of three things: that the |
| 133 program is extremely simple; that it is not instrumented properly (e.g., | 137 program is extremely simple; that it is not instrumented properly (e.g., |
| 134 due to being linked against a non-instrumented copy of the target | 138 due to being linked against a non-instrumented copy of the target |
| 135 library); or that it is bailing out prematurely on your input test cases. | 139 library); or that it is bailing out prematurely on your input test cases. |
| 136 The fuzzer will try to mark this in pink, just to make you aware. | 140 The fuzzer will try to mark this in pink, just to make you aware. |
| 137 | 141 |
| 138 - Percentages over 70% may very rarely happen with very complex programs | 142 - Percentages over 70% may very rarely happen with very complex programs |
| 139 that make heavy use of template-generated code. | 143 that make heavy use of template-generated code. |
| 140 | 144 |
| (...skipping 123 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 264 | 268 |
| 265 8) Path geometry | 269 8) Path geometry |
| 266 ---------------- | 270 ---------------- |
| 267 | 271 |
| 268 +---------------------+ | 272 +---------------------+ |
| 269 | levels : 5 | | 273 | levels : 5 | |
| 270 | pending : 1570 | | 274 | pending : 1570 | |
| 271 | pend fav : 583 | | 275 | pend fav : 583 | |
| 272 | own finds : 0 | | 276 | own finds : 0 | |
| 273 | imported : 0 | | 277 | imported : 0 | |
| 274 | variable : 0 | | 278 | stability : 100.00% | |
| 275 +---------------------+ | 279 +---------------------+ |
| 276 | 280 |
| 277 The first field in this section tracks the path depth reached through the | 281 The first field in this section tracks the path depth reached through the |
| 278 guided fuzzing process. In essence: the initial test cases supplied by the | 282 guided fuzzing process. In essence: the initial test cases supplied by the |
| 279 user are considered "level 1". The test cases that can be derived from that | 283 user are considered "level 1". The test cases that can be derived from that |
| 280 through traditional fuzzing are considered "level 2"; the ones derived by | 284 through traditional fuzzing are considered "level 2"; the ones derived by |
| 281 using these as inputs to subsequent fuzzing rounds are "level 3"; and so forth. | 285 using these as inputs to subsequent fuzzing rounds are "level 3"; and so forth. |
| 282 The maximum depth is therefore a rough proxy for how much value you're getting | 286 The maximum depth is therefore a rough proxy for how much value you're getting |
| 283 out of the instrumentation-guided approach taken by afl-fuzz. | 287 out of the instrumentation-guided approach taken by afl-fuzz. |
| 284 | 288 |
| 285 The next field shows you the number of inputs that have not gone through any | 289 The next field shows you the number of inputs that have not gone through any |
| 286 fuzzing yet. The same stat is also given for "favored" entries that the fuzzer | 290 fuzzing yet. The same stat is also given for "favored" entries that the fuzzer |
| 287 really wants to get to in this queue cycle (the non-favored entries may have to | 291 really wants to get to in this queue cycle (the non-favored entries may have to |
| 288 wait a couple of cycles to get their chance). | 292 wait a couple of cycles to get their chance). |
| 289 | 293 |
| 290 Next, we have the number of new paths found during this fuzzing section and | 294 Next, we have the number of new paths found during this fuzzing section and |
| 291 imported from other fuzzer instances when doing parallelized fuzzing; and the | 295 imported from other fuzzer instances when doing parallelized fuzzing; and the |
| 292 number of inputs that produce seemingly variable behavior in the tested binary. | 296 number of inputs that produce seemingly variable behavior in the tested binary. |
| 293 | 297 |
| 294 That last bit is actually fairly interesting. There are four quasi-common | 298 That last bit is actually fairly interesting: it measures the consistency of |
| 295 explanations for variable behavior of the tested program: | 299 observed traces. If a program always behaves the same for the same input data, |
| 300 it will earn a score of 100%. When the value is lower but still shown in purple, |
| 301 the fuzzing process is unlikely to be negatively affected. If it goes into red, |
| 302 you may be in trouble, since AFL will have difficulty discerning between |
| 303 meaningful and "phantom" effects of tweaking the input file. |
| 296 | 304 |
| 297 - Use of uninitialized memory in conjunction with some intrinsic sources of | 305 Now, most targets will just get a 100% score, but when you see lower figures, |
| 298 entropy in the tested binary. This can be indicative of a security bug. | 306 there are several things to look at: |
| 299 | 307 |
| 300 - Attempts to create files that were already created during previous runs, or | 308 - The use of uninitialized memory in conjunction with some intrinsic sources |
| 301 otherwise interact with some form of persistent state. This is harmless, | 309 of entropy in the tested binary. Harmless to AFL, but could be indicative |
| 302 but you may want to instruct the targeted program to write to stdout or to | 310 of a security bug. |
| 303 /dev/null to avoid surprises (and disable the creation of temporary files | |
| 304 and similar artifacts, if applicable). | |
| 305 | 311 |
| 306 - Hitting functionality that is actually designed to behave randomly. For | 312 - Attempts to manipulate persistent resources, such as left over temporary |
| 307 example, when fuzzing sqlite, the fuzzer will dutifully detect variable | 313 files or shared memory objects. This is usually harmless, but you may want |
| 308 behavior once the mutation engine generates something like: | 314 to double-check to make sure the program isn't bailing out prematurely. |
| 315 Running out of disk space, SHM handles, or other global resources can |
| 316 trigger this, too. |
| 309 | 317 |
| 310 select random(); | 318 - Hitting some functionality that is actually designed to behave randomly. |
| 319 Generally harmless. For example, when fuzzing sqlite, an input like |
| 320 'select random();' will trigger a variable execution path. |
| 311 | 321 |
| 312 - Multiple threads executing at once in semi-random order. This is usually | 322 - Multiple threads executing at once in semi-random order. This is harmless |
| 313 just a nuisance, but if the number of variable paths is very high, try the | 323 when the 'stability' metric stays over 90% or so, but can become an issue |
| 314 following options: | 324 if not. Here's what to try: |
| 315 | 325 |
| 316 - Use afl-clang-fast from llvm_mode/ - it uses a thread-local tracking | 326 - Use afl-clang-fast from llvm_mode/ - it uses a thread-local tracking |
| 317 model that is less prone to concurrency issues, | 327 model that is less prone to concurrency issues, |
| 318 | 328 |
| 319 - See if the target can be compiled or run without threads. Common | 329 - See if the target can be compiled or run without threads. Common |
| 320 ./configure options include --without-threads, --disable-pthreads, or | 330 ./configure options include --without-threads, --disable-pthreads, or |
| 321 --disable-openmp. | 331 --disable-openmp. |
| 322 | 332 |
| 323 - Replace pthreads with GNU Pth (https://www.gnu.org/software/pth/), which | 333 - Replace pthreads with GNU Pth (https://www.gnu.org/software/pth/), which |
| 324 allows you to use a deterministic scheduler. | 334 allows you to use a deterministic scheduler. |
| 325 | 335 |
| 326 Less likely causes may include running out of disk space, SHM handles, or other | 336 - In persistent mode, minor drops in the "stability" metric can be normal, |
| 327 globally limited resources. | 337 because not all the code behaves identically when re-entered; but major |
| 338 dips may signify that the code within __AFL_LOOP() is not behaving |
| 339 correctly on subsequent iterations (e.g., due to incomplete clean-up or |
| 340 reinitialization of the state) and that most of the fuzzing effort goes |
| 341 to waste. |
| 328 | 342 |
| 329 The paths where variable behavior is detected are marked with a matching entry | 343 The paths where variable behavior is detected are marked with a matching entry |
| 330 in the <out_dir>/queue/.state/variable_behavior/ directory, so you can look | 344 in the <out_dir>/queue/.state/variable_behavior/ directory, so you can look |
| 331 them up easily. | 345 them up easily. |
| 332 | 346 |
| 333 If you can't suppress variable behavior and don't want to see these warnings, | |
| 334 simply set AFL_NO_VAR_CHECK=1 in the environment before running afl-fuzz. This | |
| 335 will also dramatically speed up session resumption. | |
| 336 | |
| 337 9) CPU load | 347 9) CPU load |
| 338 ----------- | 348 ----------- |
| 339 | 349 |
| 340 [cpu: 25%] | 350 [cpu: 25%] |
| 341 | 351 |
| 342 This tiny widget shows the apparent CPU utilization on the local system. It is | 352 This tiny widget shows the apparent CPU utilization on the local system. It is |
| 343 calculated by taking the number of processes in the "runnable" state, and then | 353 calculated by taking the number of processes in the "runnable" state, and then |
| 344 comparing it to the number of logical cores on the system. | 354 comparing it to the number of logical cores on the system. |
| 345 | 355 |
| 346 If the value is shown in green, you are using fewer CPU cores than available on | 356 If the value is shown in green, you are using fewer CPU cores than available on |
| (...skipping 24 matching lines...) Expand all Loading... |
| 371 - cycles_done - queue cycles completed so far | 381 - cycles_done - queue cycles completed so far |
| 372 - execs_done - number of execve() calls attempted | 382 - execs_done - number of execve() calls attempted |
| 373 - execs_per_sec - current number of execs per second | 383 - execs_per_sec - current number of execs per second |
| 374 - paths_total - total number of entries in the queue | 384 - paths_total - total number of entries in the queue |
| 375 - paths_found - number of entries discovered through local fuzzing | 385 - paths_found - number of entries discovered through local fuzzing |
| 376 - paths_imported - number of entries imported from other instances | 386 - paths_imported - number of entries imported from other instances |
| 377 - max_depth - number of levels in the generated data set | 387 - max_depth - number of levels in the generated data set |
| 378 - cur_path - currently processed entry number | 388 - cur_path - currently processed entry number |
| 379 - pending_favs - number of favored entries still waiting to be fuzzed | 389 - pending_favs - number of favored entries still waiting to be fuzzed |
| 380 - pending_total - number of all entries waiting to be fuzzed | 390 - pending_total - number of all entries waiting to be fuzzed |
| 391 - stability - percentage of bitmap bytes that behave consistently |
| 381 - variable_paths - number of test cases showing variable behavior | 392 - variable_paths - number of test cases showing variable behavior |
| 382 - unique_crashes - number of unique crashes recorded | 393 - unique_crashes - number of unique crashes recorded |
| 383 - unique_hangs - number of unique hangs encountered | 394 - unique_hangs - number of unique hangs encountered |
| 384 | 395 |
| 385 Most of these map directly to the UI elements discussed earlier on. | 396 Most of these map directly to the UI elements discussed earlier on. |
| 386 | 397 |
| 387 On top of that, you can also find an entry called 'plot_data', containing a | 398 On top of that, you can also find an entry called 'plot_data', containing a |
| 388 plottable history for most of these fields. If you have gnuplot installed, you | 399 plottable history for most of these fields. If you have gnuplot installed, you |
| 389 can turn this into a nice progress report with the included 'afl-plot' tool. | 400 can turn this into a nice progress report with the included 'afl-plot' tool. |
| OLD | NEW |