AFL中使用的环境变量 以及状态栏、fuzzer_stats文件、plot_data文件中各字段的含义

参考:https://afl-1.readthedocs.io/en/latest/user_guide.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/a
  • stability:稳定性参数,对于相同的输入数据总是表现相同,则为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 - 进程ID
  • cycles_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:启用 ASAN
  • AFL_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-trace
  • AFL_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(),我们需要一种检测故障的方法。
  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值