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 |