状态栏、fuzzer"/>
AFL中使用的环境变量 以及状态栏、fuzzer
参考:.html#status-screen
1. 状态栏中各字段的含义
前言
状态栏在默认的黑底白字状态下会正确呈现,如果没有正确呈现,很有可能默认的UI被修改了。
process timing
run time
:已运行时间last new path
:自上一次发现新路径已经过去了多久last uniq crash
:自上一次发现新唯一崩溃已经过去了多久last uniq hang
:自上一次发现新唯一挂起已经过去了多久
需要注意的是,如果启动AFL后的几分钟内都没有找到新路径,可能是没有正确调用目标二进制文件,以致于它无法正确解析输入的测试用例;还有可能默认的内存使用太小了,以致于程序没有分配到足够的内存而提前退出了;或者种子用例是无效的。
overall results
cycles done
:队列循环次数。通常来讲,第一轮循环可能需要一天或者更长时间,可以通过-d
选项跳过确定性变异加快速度,但是挖漏洞的能力可能会收到些影响。此外,这个字段的显示颜色也有讲究,第一轮循环时显示为洋红色,如果在随后的轮次中仍有新发现,则变为黄色,然后在结束时变为蓝色,最后,在模糊器较长时间没有看到任何动作后变为绿色。total paths
:队列中测试用例总数量uniq crashes
:发现的唯一崩溃的总数量uniq hangs
:发现的唯一挂起的总数量
cycles process
-
now process
:当前正在fuzz队列中的第几个测试用例(队列中已完成fuzz的用例占比),“*” 表示不是青睐的用例 -
paths timed out
:超时的用例数量,也是放弃的用例数量(队列中已完成fuzz的用例占比)
map coverage
-
map density
:当前用例使用的位图大小占总位图大小的比例 / 所有用例使用的位图大小占总位图大小的比例。如果全局位图(virgin_bits)中被命中的字节数小于200,表明目标程序很简单;或是目标程序没有被正确插桩(如,目标程序与一个库的副本链接,而未对这个库的副本插桩);或者测试用例不合适导致程序过早退出。如果显示的百分比超过70%或是红色,即位图的使用密度很高,此时AFL可能就不能正确地识别覆盖的边了,可以设置环境变量AFL_INST_RATIO=10
后重新编译目标文件,将插桩率由100%降到10% -
count coverage
:位图中每个被命中的字节平均改变的位数(取值为[1, 8])
stage process
-
now trying
:当前正在执行的变异阶段(calibration, trim, bitflip, arith, interest, auto extras, havoc, splic) -
stage execs
:当前执行次数 / 该阶段需要执行的次数 (执行进度) -
total execs
:总执行次数 -
exec speed
:平均执行速度,单位为秒。大多数情况下应该超过 500 execs/sec ,如果它保持在 100 以下,说明很慢。
findings in depth
favored paths
:队列中青睐的测试用例数量(占队列中总测试用例的比例)new edges on
:队列中覆盖新路径的测试用例数量(占队列中总测试用例的比例)total crashes
:总的崩溃数量(唯一崩溃数量)total tmouts
:总的超时数量(唯一超时数量)
fuzzing strategy yields
bit flips
:分别对应 bit flips 1/1, bit flips 2/1, bit flips 4/1 各阶段 添加到队列中的用例数量与唯一崩溃数量和(总的执行次数)byte flips
:分别对应 bit flips 8/8, bit flips 16/8, bit flips 32/8 各阶段 添加到队列中的用例数量与唯一崩溃数量和(总的执行次数)arithmetics
:分别对应 arith 8/8, arith 16/8, arith 32/8 各阶段 添加到队列中的用例数量与唯一崩溃数量和(总的执行次数)known ints
:分别对应 interest 8/8, interes 16/8, interes 32/8 各阶段 添加到队列中的用例数量与唯一崩溃数量和(总的执行次数)dictionary
:分别对应 user extras (over), user extras (insert), auto extras (over), 各阶段 添加到队列中的用例数量与唯一崩溃数量和(总的执行次数)havoc
:分别对应 havoc, splice 各阶段 添加到队列中的用例数量与唯一崩溃数量和(总的执行次数)trim
:种子用例中删除字节的比例,
path geometry
levels
:当前探索深度pending
:队列中待fuzz的用例数量pen fav
:队列中待fuzz的青睐用例数量own finds
:添加到队列中的用例数量imported
:并行fuzz时,从其它工程中导入的用例数量,非并行fuzz则为 n/astability
:稳定性参数,对于相同的输入数据总是表现相同,则为100%,通常为100%。触发新路径的用例会保存在<out_dir>/queue/.state/variable_behavior/
cpu load
- 表示cpu利用率,计算方式为 处于“可运行”状态的进程数闭上系统上的逻辑核心数。绿色表示良好,可以并行以提高性能;红色表示负载很高。
2. fuzzer_stats 文件中各字段含义
start_time
- 开始时间(unix 时间,从1970年1月1日0时0分0秒起至开始时间的总秒数)last_update
- 此文件的最后一次更新对应的 unix 时间fuzzer_pid
- 进程IDcycles_done
- 已经完成的循环轮数execs_done
- 尝试调用 execve() 次数execs_per_sec
- 当前每秒执行数paths_total
- 队列中的测试用例总数paths_found
- fuzz 过程中发现的测试用例数量paths_imported
- 从其他实例导入的测试用例数max_depth
- 最大探索深度cur_path
- 当前fuzz的测试用例号pending_favs
- 待fuzz的青睐测试用例数量pending_total
- 待fuzz的测试用例数量stability
- 表现一致的位图字节的百分比variable_paths
- 触发新路径的测试用例数unique_crashes
- 唯一崩溃数unique_hangs
- 唯一挂起数
3. plot_data 文件中各字段的含义
unix_time
- 各个时间点,unix 时间cycles_done
- 完成的循环轮数cur_path
- 正在fuzz的测试用例号paths_total
- 队列中测试用例数量pending_total
- 待fuzz的测试用例数量pending_favs
- 待fuzz的青睐测试用例数量map_size
- 所有用例使用的位图比例unique_crashes
- 唯一崩溃数unique_hangs
- 唯一挂起数max_depth
- 最大探索深度execs_per_sec
- 每秒执行数
4. AFL中使用的环境变量
afl-gcc、afl-clang 和 afl-as 的设置
AFL_HARDEN
:添加代码强化,包括-D_FORTIFY_SOURCE=2
和-fstack-protector-all
。对于捕获内存错误很有用,但有轻微(低于 5%)的性能损失AFL_DONT_OPTIMIZE
:禁用优化,默认情况下,包装后的编译器会附加 -O3 以优化编译。在极少数情况下,这会导致使用 -Werror 构建的程序出现问题,这仅仅是因为 -O3 可以进行更彻底的代码分析并发出额外的警告,要禁用优化可以设置此环境变量。AFL_USE_ASAN
:启用 ASANAFL_USE_MSAN
:启用 MSAN,与ASAN互斥AFL_CC
,AFL_CXX
,AFL_AS
:设置后可以使用原生的编译器AFL_PATH
:指定寻找 afl-as 的位置AFL_INST_RATIO
:控制插桩密度(0—100%),如果设置为0,则只插桩函数入口的跳转块AFL_NO_BUILTIN
:使编译器生成适合与 libtokencap.so 一起使用的代码,可以会稍微影响速度TMPDIR
:afl-as.c 文件中设置临时文件时会用到AFL_KEEP_ASSEMBLY
:防止 afl-as 删除插完桩的文件,默认是删除的。可以结合TMPDIR
直接设置如下的一套
$ mkdir assembly_here
$ TMPDIR=$PWD/assembly_here
$ AFL_KEEP_ASSEMBLY=1
AFL_QUIET
:禁止显示横幅
afl-gcc、afl-clang 和 afl-as 的设置
同上,但不包括AFL_AS
(不调用as),TMPDIR
,和AFL_KEEP_ASSEMBLY
(没有创建临时程序集文件), 此外AFL_INST_RATIO
不能设置为0
afl-fuzz 的设置
AFL_SKIP_CPUFREQ
:会跳过对 CPU 扩展策略的检查,会有一些性能损失。AFL_NO_FORKSRV
:禁用 forkserver,使用 fork + execve。这对一些不同寻常的库有用,但是性能会显著下降。AFL_EXIT_WHEN_DONE
:一段时间内没有新发现时自动终止,常由 UI 中的循环计数器变为绿色来指示。AFL_NO_AFFINITY
:禁止尝试绑定到 Linux 系统上的特定 CPU 内核,会影响速度。AFL_SKIP_CRASHES
:令AFL 接受输入种子中的崩溃文件,默认情况下 AFL 不允许包含导致目标程序崩溃的种子AFL_HANG_TMOUT
:可以指定不同的超时来确定特定测试用例是否是“挂起”。默认值为 1 秒或 -t 参数的值中的较大者。AFL_NO_ARITH
:禁止变异阶段的算数运算,对于 fuzz 基于文件格式的目标程序很有用AFL_SHUFFLE_QUEUE
:随机打乱队列条目AFL_SKIP_BIN_CHECK
:跳过插桩检查,以供自定义的插桩。和AFL_DUMB_FORKSRV
以及-n
一起设置可以在 dumb模式下仍然使用forkserver,并且不返回任何插桩数据AFL_DUMB_FORKSRV
:dumb模式下仍然使用forkserver,dumb模式下默认是不使用forkserver的AFL_IMPORT_FIRST
:在 -M 或 -S 模式下运行时,AFL会导入其它测试进程的测试用例AFL_POST_LIBRARY
:可以为变异文件配置后处理器AFL_FAST_CAL
:快速校验,减少校验中的循环次数,度提高了约 2.5 倍,但会降低精度AFL_NO_CPU_RED
:禁止UI底部的CPU使用率显示红色AFL_PATH
:在 QEMU 模式 (-Q) 中,用于搜索 afl-qemu-traceAFL_PRELOAD
:会导致 AFL 为目标二进制文件设置 LD_PRELOAD,而不会中断 afl-fuzz 进程本身。除其他外,这对于引导 libdislocator.so 很有用。AFL_NO_UI
:禁用UI,只定期打印一些基本统计信息。afl-fuzz 的输出重定向到文件或管道时,也会自动触发此行为。AFL_I_DONT_CARE_ABOUT_MISSING_CRASHES
AFL_BENCH_JUST_ONE
:fuzz 完一个测试用例后就退出AFL_BENCH_UNTIL_CRASH
:fuzz 到一个崩溃后退出
afl-qemu-trace 的设置
AFL_INST_RATIO
:跳过一些基本块的插桩,这在处理非常复杂的二进制文件时很有用AFL_INST_LIBS
:插桩动态链接库QEMU_STACK_SIZE
:底层的 QEMU 二进制文件将识别任何标准的“用户空间仿真”变量
afl-cmin 的设置
AFL_PATH
:指定 afl-showmap 和 afl-qemu-trace(-Q模式下) 位置AFL_KEEP_TRACES
:使工具保留用于最小化的痕迹和其他元数据,并且通常在退出时删除。 这些文件可以在 <out_dir>/.traces/* 中找到。AFL_ALLOW_TMP
:许此脚本和其他一些脚本在 /tmp 中运行。 这在具有恶意用户的多用户系统上是一个适度的安全风险,但在专用的模糊测试盒上应该是安全的。
afl-tmin 的设置
AFL_PATH
:指定 afl-qemu-trace(-Q模式下) 位置TMPDIR
:如果无法在当前工作目录中创建临时文件,可以用到这个。AFL_TMIN_EXACT
:如果您希望 afl-tmin 在最小化崩溃时要求执行路径匹配,则可以指定此。这将使最小化变得不那么有用,但可能会阻止工具在非常有问题的软件中从一个崩溃条件“跳转”到另一个崩溃条件。 您可能希望将它与 -e 标志结合使用。
afl-analyze 的设置
AFL_ANALYZE_HEX
:将文件偏移量打印为十六进制而不是十进制
libdislocator.so 的设置
AFL_LD_LIMIT_MB
:限制库允许的最大堆使用大小,以M为单位。 默认值为 1 GB。 一旦超过此值, alloca 将返回 NULL。AFL_LD_HARD_FAIL
:通过在过度分配上调用 abort() 来改变行为,从而导致 AFL 将其视为崩溃。 对于应该保持特定内存占用的程序很有用。AFL_LD_VERBOSE
:使库输出一些诊断消息,这些消息可能有助于查明任何观察到的问题的原因。AFL_LD_NO_CALLOC_OVER
:在 calloc() 溢出时禁止 abort()。 大多数常见的分配器在内部检查它并返回 NULL,因此只有在更奇特的设置中才有安全风险。
libtokencap.so 的设置
AFL_TOKEN_FILE
:指示应存放已自动检测的 token 的位置
afl-fuzz & 其他工具设置的第三方变量
AFL不直接解释这几个环境变量,但是如果存在,则将其设置为最佳值
- 默认情况下,LD_BIND_NOW 设置为通过强制链接器在分叉服务器启动之前完成所有工作来加速模糊测试。您可以通过预先设置 LD_BIND_LAZY 来覆盖它,但这几乎可以肯定是没有意义的。
- 默认情况下,ASAN_OPTIONS 设置为:abort_on_error=1 detect_leaks=0 symbolize=0 allocator_may_return_null=1 如果您想设置自己的选项,请确保包含 abort_on_error=1 - 否则,fuzzer 将无法检测到测试应用程序中的崩溃。类似地,包括 symbolize=0,因为没有它,AFL 可能难以分辨崩溃和挂起。
- 同样,默认情况下,MSAN_OPTIONS 设置为:exit_code=86(由于遗留原因需要) abort_on_error=1 symbolize=0 msan_track_origins=0 allocator_may_return_null=1 自定义任何东西时一定要包括第一个,因为某些 MSAN 版本不会在错误时调用 abort(),我们需要一种检测故障的方法。
更多推荐
AFL中使用的环境变量 以及状态栏、fuzzer
发布评论