T-fuzz--fuzzing by program transformation论文概要

摘要

fuzz的问题,有限覆盖率和深度bug挖掘。

为了提高覆盖率,常用的方法是依靠不精确的启发式算法或者复杂的输入变异等技术。
T-fuzz通过去掉santiy check来提高覆盖率。T-fuzz利用覆盖率来引导产生输入。
当不能访问到新的路径时,T-fuzz会去掉check,以保证fuzz能继续进行,发现新的路径和bug。
这个方法有2个问题:1.去除check,导致结果不准确并会产生误报;2. 即使是真的bug,那么这个crash的input也有可能在原始的程序中执行不会引发bug。作为辅助的后处理步骤,一个符号执行器将过滤这些误报、复现真的bug。

最后,实验比较了t-fuzz和其他fuzz工具,结果更好。

1. Introduction 介绍

fuzz大致可以分为2类:generational fuzzers 和 mutational fuzzer。前者代表PROTOS,SPIKE和PEACH,依赖于特定格式的定义来产生输入;后者的代表AFL、honggfuzz和zzuf,通过随机变异来产生输入。本文采用方法为后者。

无论什么策略的变异方式,都很难产生满足复杂santiy check的输入。想afl采用覆盖率引导、driller等采用符号执行或者污点分析,面临santiy check问题时,作用还是有限的。

本文采用了一个新颖的fuzz技术–transformational fuzzing,通过直接跳过santiy check来提高fuzz找到bug的能力。

当剔除santiy check后,会产生误报等情况。t-fuzz还有一个后端工具,采用符号执行去复现先前产生的bug。虽然符号执行很复杂而且代价很大,但是由于只需要去验证潜在bug的情况,所以不会对性能有很大影响。

为了证明t-fuzz的有效性,我们开发了一个t-fuzz的原型。t-fuzz在现成的覆盖率引导的fuzz的基础上进行开发。当fuzzer不能产生能发现新路径的输入时,一个轻量的动态的基于trace的工具会探索那些导致所有input fail的check。然后会根据这些check选择性的修改程序,使得fuzzer能在修改后的程序上继续运行。

本文工作的贡献

  1. 证明了通过转化目标应用程序相比于应用更复杂更重量的分析工具和技术能够更高效的找到bug。
  2. 实现了一系列编译输入和程序的技术,包括:(1).在目标程序中自动探测santiy check方法;(2). 目标程序转化取出santiy check的方法;(3). 在原始程序中复现bug并过滤误报的方法。
  3. 在CGC/LAVA-M数据库和4个真实的程序中测试评估了t-fuzz,并与现有的技术进行比较。
  4. 发现了3个现实程序bug。

2. Motivation 动机

举了一个例子,包含3个check,第一是字符串比较(C1),第二是带循环的数值比较(C2),第三是crc比较(C3),afl对这种check比较难处理,如果使用driller可以轻松应对check 1和2,但是对于3还是很难的,因为现在的约束求解器比较难处理复杂算法的约束。
对santiy check进行了一些探讨和研究:
1). santiy check 可以分为2类:NCC(Non-Critical Check) 和 CC (Critical Check)。NCC是那些用来过滤数据的check,CC是严重影响程序功能和逻辑的check。
2). NCC可以在不产生假性bug的情况下去掉;
3). 去掉NCC后产生的bug能在原始程序中复现
4). 去掉CC,可能引入假性bug。假性bug不能复现。
基于NCC在现实的程序中无处不在,在设计t-fuzz时,通过探测发现NCC并去掉NCC来提高fuzz的性能。通过去掉NCC,被NCC保护的代码才能暴露给Fuzz,才能更好的发现潜在的bug。
尤其的,t-fuzz能很好的帮助fuzzer去fuzz check 3(C3)保护的代码。

3. T-Fuzz intuition 结构和框架


T-Fuzz的结构如上图所示,包含以下这些组件,将会在后续章节详细讨论:

  • Fuzzer: 使用AFL或者honggfuzz生成输入文件。T-fuzz依赖fuzzer工具来跟踪路径和判断是否stuck。
  • program Transformer: 当程序stuck时,t-fuzz采用program transfromer来生成修改的程序。使用fuzzer产生的输入文件,Program transformer trace这个程序,以发现NCC,然后复制一个去处NCC条件的程序。
  • Crash Analyzer: 如果在转化后的程序中发现了一个crash,Crash analyzer会通过符号执行技术过滤掉误报的错误。

T-fuzz的基本算法和流程如下图所示伪代码,t-fuzz迭代发现和关闭程序中遇到的NCC。迭代时,将原始program和所有转化产生的program保存到一个队列中。每次迭代时,从队列中取出一个program,加载到fuzzer中进行fuzz,直到它不能再提高覆盖率(stuck)。此时,T-fuzz会使用探测器去发现NCC,然后使用program transformer产生多个program,并添加到队列中。所有在迭代中发现的crash会在crash analyzer中去识别并剔除误报的bug。
T-fuzz--fuzzing by program transformation论文概要_第1张图片

4. T-Fuzz design 设计细节

未完待续。。。

你可能感兴趣的:(二进制安全)