标题: Multiple Targets Directed Greybox Fuzzing (Hongliang Liang,2024)
作者: Hongliang Liang, Xinglin Yu, Xianglin Cheng, Jie Liu, Jin Li
期刊: IEEE Transactions on Dependable and Secure Computing
研究问题:
发现局限性:之前的定向灰盒测试在有多个目标的时候表现的不好
原因(problems):粗粒度的能量调度和静态阶段划分
AFLGO
1.problem1(能量):为了覆盖多个目标,为所有目标追求全局最优调度会忽略某些目标的局部最优调度
2.two stages:(exploration and exploitation )首先从探索阶段开始,随机变异初始种子以生成许多新输入,以增加代码覆盖率。然后进入开发阶段,产生更多新的投入,越来越接近目标。
3.problem2:(静态阶段划分):exploration和exploitation 的时间不好分配。
勘探越少,可供开发利用的覆盖信息就越少,导致在开发阶段难以产生高质量的定向种子。但过度探索会耗费大量资源,延误开发进度,失去方向性。
Lolly 和 Berry
1.problem1(能量):容易陷入局部最优调度 : 为单个目标寻求最优调度会导致其他目标难以实现
2.problem2:(静态阶段划分):exploration和exploitation 的时间不好分配。
研究假设:
1.提出自适应的搜索策略
2.提出一种新的能量调度策略
研究方法:
1.提出一种能量调度方法(MES)
考虑种子序列和目标序列之间的三种关系进行能量调度,即s的序列覆盖率(seqCov)、ts'(序列的)优先级(priority)和全局最大值覆盖率(gM axCov)。具体来说,MES 为具有高 seqCov、高优先级、低 gM axCov 的种子分配更多能量 ->为全局最大覆盖率低的种子给予更多能量:
可以避免像 AFLGo 这样忽略局部最优,也可以避免陷入像 Lolly 或 Berry 这样容易陷入局部最优。
2.提出一种协调exploration和exploitation的方法(CEE)
根据覆盖种子和定向种子的产生情况来分配两阶段的时间(根据两个队列中种子的比例灵活协调探索和利用阶段 )。有两个队列来存储种子。使用一个队列来存储有助于到达目标的种子(简称定向种子),另一个队列来存储提高代码覆盖率的种子(简称覆盖种子)。 如果在探索时覆盖种子在总种子中的比例太高(例如,超过阈值率),我们的模糊器将切换到利用阶段(定向种子)。 如果在利用时代码覆盖率信息不足(例如,模糊器在很长一段时间内没有生成新的定向种子),我们的模糊器就会转向探索阶段。 此外,CEE通过记录每个开发阶段的持续时间和生成的定向种子的数量来动态调整阈值率,以自适应地协调探索和开发阶段。
3.将上述两种策略应用于LeoFuzz
研究动力
图一 是过程间控制流图 Inter-CFG,里面每一个节点是基本块BB,M和P是我们的目标错误target problem Select an Image
回顾:在AFLGO里面提到
「CG和CFG
Call Graph:是调用图,打开IDA就可以看到一个函数调用另一个函数,CG的单元是函数function。函数function是比基本块BB大的量,因为一个function里面有循环、分支跳转。
CFG:是控制流图,单元量是基本块BB。不同function的BB跳转构成的CFG叫做Inter-CFG,Intra-CFG就是一个function里面的BB跳转。AFLGO采用了Intra-CFG,因为这个更简单操作,在原先AFL的代码上改动不大,不会加上过多的overhead。」
Problem 1: unsuitable energy scheduling hinders covering multiple targets.
- 现存的DGF的两种能量调度策略:
1.AFLGo 采用 Dijkstra 算法来调度种子 ,执行跟踪三种种子,i.e., a-c-e-i-q-m, a-b-d-k-o and a-b-d-f-g-j-k-p, 这些路径中的每个节点到两个目标之间的harmonic distance (谐波距离,也叫调和平均值);
Select an Image
2.Lolly 或 Berry 在能量调度中利用目标序列覆盖。
如果通过目标 m 的路径比通过目标 p 的路径更难探索(例如,由于复杂的条件),则接近 m 的种子的目标序列覆盖率将比另一个种子的目标序列覆盖率增加得更慢种子接近p。因此,这两个工具都会生成大量探索图 1 右分支的种子,而只有少数种子覆盖图 1 左分支。即使达到目标,它们也会继续探索图 1 右分支p。因此,他们很难安排接近目标 m 的种子。
Problem 2: improper exploration-exploitation division.
现存的两阶段的协调方法有3种:
- uses the seed selection strategy without considering the exploration-exploitation switchover, like Lolly (不考虑划分为两阶段,以Lolly 为典型代表):生成的覆盖种子或定向种子被放置在队列的末尾以进行顺序调度。这种方法很简单,但可能需要很长时间才能使队列尾部(或附近)的定向种子发生变异,从而减慢了目标的到达速度。
- gives each stage a fixed period. (两阶段的时间是固定的,以AFLGo 和RDFuzz为典型代表)
- 开发优先策略(以Berry 为典型代表):将种子队列分成三个优先级,且定向种子比覆盖率种子优先级高。缺点是当代码覆盖率信息不足时,策略不佳,生成种子质量低。
方法框架
框架名:LeoFuzz
includes two phases:static analysis and dynamic analysis.(静态分析和动态分析)
Fig. 2. LeoFuzz’s architecture Select an Image
静态分析阶段:
step1:从待测程序中使用图像抽取器抽取CG和CFG。注:Lolly and Berry,only use CFG
step2:目标序列生成器映射目标中的语句到基本块。为每一个目标生成一个目标序列(包括了从entry function 通往目标的路径上必要的基本块BB)。
domcg:由P获得的CG转化成的支配树。(line2,3) domCG:由CFG转化成的支配树(line4,5) e target function name funN ame (lines 4-6). Select an Image
使用案例来辅助理解算法1:main1-A1-entry-a-f-g是目标g的目标序列,其中main1和A1分别表示main和A函数的入口节点 Select an Image
step3:对 PUT 进行检测以收集运行时信息,例如代码覆盖率和执行跟踪,并将检测后的二进制文件发送到执行器。
动态分析阶段:Fuzzer的input为Initial seed 和instrumented binary
从执行步骤来划分:
step1:the stage coordinator judges the stage of the fuzzer (exploration stage or exploitation stage).
初始是exploration阶段,生成的覆盖种子的比例达到一个阈值就会转为exploitaion阶段 。反之亦然,两个阶段相互转换。
step2:根据stage,种子选择器从对应的队列(覆盖种子队列(简称CQ)或定向种子队列(简称DQ)) 中获取一个种子
step3:编译器变异种子,送入执行器
step4:如果这个种子导致了PUT crash,存储在crash queue中
进入 DQ(如果它增加了目标序列覆盖率)
存入CQ(如果它增加了代码覆盖率)
否则丢弃
从组成部分来划分:
A. Fuzzer
fuzzer的工作流程如图算法二所示 Select an Image
1) Exploration-exploitation Coordination:
2) Seed Energy Scheduling for Multiple Targets:
B. Concolic Executor