编辑
2024-03-16
Paper
00
请注意,本文编写于 249 天前,最后修改于 248 天前,其中某些信息可能已经过时。

目录

FISHFUZZ: Catch Deeper Bugs by Throwing Larger Nets
作者
目前的做法
作者的做法
动态优先级
距离算法
Inter-function Exploration Phase (函数间探索阶段)
Exploitation Phase (利用阶段)
缺点

🤔

FISHFUZZ: Catch Deeper Bugs by Throwing Larger Nets

作者

目前的做法

目前定向灰盒测试的做法是

  • 距离算法 -> 在较大的数据集中 由于种子-目标距离被分解成为单个标量 以此为指导可能会导致失真
  • 定常优先级 -> 定常优先级可能会导致一直探索某些已经充分探索的区域

作者的做法

  • 新的距离算法 -> 为每个目标设置一个距离度量 而不是所有目标的平均
  • 动态目标排序 可以自动丢弃目标
  • 队列剔除算法

动态优先级

作者为每个目标设置一个三元组(hit_frequency,reached,triggered)(hit\_frequency, reached, triggered)

  • hit_frequencyhit\_frequency表示命中次数
  • reachedreached表示是否到达目标区域
  • triggeredtriggered表示是否触发crash

Fuzzer优先选择hit_frequencyhit\_frequency较少的目标进行fuzz

距离算法

因为基本块距离算法针对每个目标都进行计算的话 会导致计算开销过大 所以作者选用的计算方法是计算目标和函数之间的距离。

作者首先测算所有函数之间的静态距离 而后保存成静态距离图

作者为每个函数对(fi,f)(f_i,f)分配了一个权重weightweight

  • weightweight表示种子从入口函数fif_i到被调用函数ff经过的条件边的最小数量
  • 条件边的最小数量由函数dbb(ma,mb)dbb(m_a, m_b)计算 即基本块mam_a到基本块mbm_b的距离

weight(fi,f)={mindbb(m,mf)ifmffiotherwiseweight(f_i, f) = \begin{cases} \min dbb(m,m_f) \quad if\exist m_f\in f_i \\ \infty \quad\quad\quad\quad\quad\quad\quad otherwise \end{cases}

其中基本块mm是函数fif_i的起始基本块 基本块mfm_f是函数fif_i中调用函数ff的基本块 如果fif_i调用了ff 则权重weightweight为基本块mm和基本块mfm_f​之间的最小距离 否则为无穷

两个函数之间的距离的定义如下 其中sp(fa,fb)sp(f_a, f_b)是使用Dijikstra算法的faf_afbf_b之间的最短距离

dff(fa,fb)=fisp(fa,fb)weight(fi,fi+1)dff(f_a, f_b) = \sum_{f_i \in sp(f_a,f_b)} weight(f_i, f_{i+1})

种子到函数ff之间距离的定义如下

dsf(s,f)={minfsξ(s)dff(fs,f)iffξ(s)0otherwisedsf(s,f) = \begin{cases} min_{f_s \in \xi(s) }dff(f_s, f) \quad if\quad f\notin \xi(s) \\ 0 \quad\quad\quad\quad\quad\quad\quad\quad\quad otherwise\end{cases}

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

缺点

  1. 直接使用Sanitizer的标签作为target 显然缺少漏洞导向的指向性
  2. 没有指标显示是否覆盖到target

本文作者:Du4t

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!