🤔
FISHFUZZ: Catch Deeper Bugs by Throwing Larger Nets
作者
目前的做法
目前定向灰盒测试的做法是
- 距离算法 -> 在较大的数据集中 由于种子-目标距离被分解成为单个标量 以此为指导可能会导致失真
- 定常优先级 -> 定常优先级可能会导致一直探索某些已经充分探索的区域
作者的做法
- 新的距离算法 -> 为每个目标设置一个距离度量 而不是所有目标的平均
- 动态目标排序 可以自动丢弃目标
- 队列剔除算法
动态优先级
作者为每个目标设置一个三元组(hit_frequency,reached,triggered)
- hit_frequency表示命中次数
- reached表示是否到达目标区域
- triggered表示是否触发crash
Fuzzer优先选择hit_frequency较少的目标进行fuzz
距离算法
因为基本块距离算法针对每个目标都进行计算的话 会导致计算开销过大 所以作者选用的计算方法是计算目标和函数之间的距离。
作者首先测算所有函数之间的静态距离 而后保存成静态距离图
作者为每个函数对(fi,f)分配了一个权重weight
- weight表示种子从入口函数fi到被调用函数f经过的条件边的最小数量
- 条件边的最小数量由函数dbb(ma,mb)计算 即基本块ma到基本块mb的距离
weight(fi,f)={mindbb(m,mf)if∃mf∈fi∞otherwise
其中基本块m是函数fi的起始基本块 基本块mf是函数fi中调用函数f的基本块 如果fi调用了f 则权重weight为基本块m和基本块mf之间的最小距离 否则为无穷
两个函数之间的距离的定义如下 其中sp(fa,fb)是使用Dijikstra算法的fa和fb之间的最短距离
dff(fa,fb)=∑fi∈sp(fa,fb)weight(fi,fi+1)
种子到函数f之间距离的定义如下
dsf(s,f)={minfs∈ξ(s)dff(fs,f)iff∈/ξ(s)0otherwise
Inter-function Exploration Phase (函数间探索阶段)
在这个阶段,FISHFUZZ选择种子来最大化包含未触发目标的已达到的功能。该阶段的剔除算法如算法1所示。具体来说,给定一个种子队列和一组来自目标程序的函数,FISHFUZZ为每个包含目标的未探索函数设置最接近的种子的preferred = 1(第6行)。在将受青睐的种子提交给程序后,FISHFUZZ更新已探索函数列表并重复该过程。getClosestSeedToFun通过种子函数距离(§3.2)找到最接近函数f的种子s。如果多个种子与f的距离相等,我们会选择执行时间最短的那个。
Exploitation Phase (利用阶段)
Q1: 作者全文没有提到target是如何注入进去的?
作者通过SanitizerCoveragePCGRARD.so 针对源代码的bc进行插桩 然后将所有插桩位置记录下来作为target
缺点
- 直接使用Sanitizer的标签作为target 显然缺少漏洞导向的指向性
- 没有指标显示是否覆盖到target