作者:Gwangmu Lee,Woochul Shim,Byoungyoung Lee
出处:USENIX 2021
概要
定向模糊测试致力于引导模糊测试向特定的程序区域探索。然而作者发现现有的定向模糊测试有两方面的局限性。
- 现有的DGF假设目标位置彼此之间是独立的,实际上目标位置之间可能存在顺序依赖,也就是要覆盖一个目标位置必须先覆盖另一个目标位置。比如,use-after-free,程序得先执行free的代码然后再执行use的代码才能触发这个crash。
- 现有的DGF没有考虑crash触发所需要的数据条件,只根据控制流来计算种子之间的距离在一些情况下是不准确的。比如buffer overflow这种crash,应该找种子访问的内存区域和buffer boundary之间的距离。
因此,作者提出了一种constraint-guided grey-box fuzzing (CDGF),它会致力于满足一个约束序列,把能够更好地满足这个序列的输入的优先级提高。对此,他提出了一种新的距离评估方式评估种子和满足约束之间的距离,以及提出一种自动生成约束的方法。
方法设计
DFG是引导种子覆盖某个位置,所以它会选择距离目标位置最近的种子。这篇论文提出的CDFG是引导种子满足一个约束序列,所以它选择种子的依据是:
- 能够满足更多数量的约束。
- 距离第一个没有满足的约束更近。
约束定义
约束的定义是:一个目标以及满足这个目标的数据条件。当一个程序到达这个目标位置并且满足所有的数据条件时就称为满足约束。约束的样子如下图所示:
- 变量提取:一旦目标位置被覆盖,系统就会收集目标位置用到的变量,根据目标位置的类型推测变量。比如 "&buf[i*10+10]"会被识别为addr,
- 数据条件:它是一个有关上述提取的变量以及目标位置的比较运算符相关的布尔表达式。比如“%alloc.size <= %access.addr - %alloc.ret”。
- 顺序:当约束的数量大于一时,它们需要排个序。
距离计算
目标位置距离
- 两个基本块之间的距离为:
即:一个基本块到自身的距离为0;如果基本块 B 1 B_1 B1和基本块 B 2 B_2 B2是可达的,距离就是所有可达路径中最短的那个;如果不可达,那就是无穷。
- 对于一个种子覆盖了基本块集合
B
n
B^n
Bn,它距离目标基本快
B
∗
B^*
B∗的距离为:
数据条件距离
- 单独的数据条件是一个整数值,它的计算方式如下:
- 当程序执行第n个基本块后它的数据条件为:
- 当有多个数据条件的时候,这个距离的含义就是这个种子和满足所有数据条件的距离,距离计算如下。这个公式可以理解为Q是一堆要满足的数据条件,
ρ
\rho
ρ表示它目前没有满足的第一个数据条件的index。
约束距离
约束距离就是目标位置距离和数据条件距离的和。
总距离
到一组约束的距离为总距离。计算方式如下: D i n D_i^n Din是到每个单独的约束的距离, τ n \tau^n τn是第一个没有满足的约束的index。
约束生成
约束生成有两种途径,一种是用内存检测工具获取crash dump,一种是通过patch changelogs。
- Crash dump:这种目前支持7种bug类型。
- nT类型就是n个target sites。支持use-after-free,double free, use-of-uninitialized-value。
- 2T+D就是两个target sites以及数据条件。支持stack-buffer-overflow, heap-buffer-overflow。
- 1T+D就是一个target site和数据条件。支持assertion-failure, divide-by-zero。
- patch changelogs:
- 如果只给一个地方打了补丁,这种就是1T+D,根据给的patch changelogs首先引导输入到达目标位置,然后引导数据满足数据条件。
- 如果补丁修改了好几个地方,就在每一个改了的位置加一个sentinel函数,然后搞一个统一的函数来调用所有的sentinel函数。
方法实现
- 输入源码以及约束。系统进行插桩,插桩一方面是用于收集代码覆盖,另一方面是用于计算距离。
- 在运行fuzzing的过程中,根据插桩代码不断更新距离,选择距离最近的种子。
- 当一个种子到达目标位置的时候,系统会提取变量来计算数据条件。
- 为了避免陷入局部最优,它会根据fuzzing的次数、种子所处的深度来调整种子的分数。
总结
这篇论文相当于在现有DGF的基础上加了一层距离计算。原有的DGF只考虑控制流层面的距离,这个论文考虑了数据流的距离。它这个主要是根据具体的漏洞类型来推测应该有的数据条件,而且很大程度上依赖于初始给定的条件信息。它的这个数据条件也只限于整数数值。