FairFuzz 论文简读+源码分析+整体流程简述

FairFuzz是针对AFL的改进,旨在提高模糊测试的覆盖率,特别是针对稀有分支。它通过识别由少量输入覆盖的稀有分支,并使用mutation mask策略,使变异更倾向于生成覆盖这些分支的输入。FairFuzz首先通过一轮变异实验确定稀有分支,然后在后续变异中避免在已知关键部分进行变异,以提高达到稀有分支的可能性。此外,它还放宽了输入修剪策略,允许覆盖相同分支但不同路径的输入。实验表明,FairFuzz在增加分支覆盖率方面表现优越。

FairFuzz: A Targeted Mutation Strategy for Increasing Greybox Fuzz Testing Coverage

一、论文阅读

Abstract

FairFuzz两个关键点:1.自动识别由少数输入覆盖的分支(稀有分支),通过变异往往很难覆盖到这些分支。2. mutation mask 变异算法,使变异偏向于产生覆盖稀有分支的输入

1. Introduction

AFL通常无法覆盖关键程序功能,例如,AFL没有涵盖djpeg中的colorspace转换代码,xmllint中的属性列表处理代码以及tcpdump中的大量数据包结构。

自动识别稀有分支,使变异偏向于生成覆盖稀有分支的输入,因为已经覆盖稀有分支的输入的某些部分(称为关键部分吧)已经满足覆盖该分支所需的条件,因此不应该在关键部分上进行变异,FairFuzz通过执行许多小型变异实验来识别输入中的关键部分。

该变异算法和魔法字节检查以及能量分配策略是正交的。

本文贡献:

  • 提出了一种新颖的轻量级 mutation mask 策略
  • 开发了FairFuzz
  • 对FairFuzz进行了评估

2. Overview

需要注意的是,这篇文章将AFL中的边的表示方式称为分支

2.1 Limitations of AFL

作者在如下图所示的Xmllint代码段上进行了20次24小时的实验,只有一次AFL产生了通过第一行的输入,但是没有通过第六行,所以31行后的大量代码都是未被探索过的。一个例子:在产生了 ”<!ATTLIST BD“ 的输入后, ”<!ATTLIST“ 这部分就是关键部分,就不需要再变异了,但是AFL往往会继续变异关键部分

在这里插入图片描述

2.2 Overview of FairFuzz

识别稀有分支,根据覆盖到分支的输入的数量区分吗,识别后就可以进行靶向处理了。还有一点是稀有分支所保护的代码往往比非稀有分支所保护的代码要少得多

改变变异策略,使用确定性变异阶段来近似确定输入中不应变异的关键部分,以使变异用例稀有分支。

3. FairFuzz Algorithm

两点:1.修改从队列中选择种子进行变异的策略;2.修了对这些输入执行变异的方式。

3.1 Mutation Masking

给定输入 x ,fuzz目标 Tsatisfies(x, T) 为真仅当 x 满足 T

定义一: 元组 (c, m) ,其中 m 是变异的字节数, c 是以下三个变异类型之一:

  • O:用一些值从位置 k 处开始覆盖 m 个字节
  • I:在位置 k 处插入 m 字节
  • D:从位置 k 处开始删除 m 字节

对于 O 和 I ,要插入或是复写的字节内容需要明确,

mutate(x, u, i) 表示在输入 x 的 i 位置处进行 u = (c, m) 变异

定义二: 对于输入 x 和目标 T 的变异蒙版 maskx,T:N→P({ O,I,D})mask_{x,T}:N \rightarrow P(\{O,I,D\})maskx,T:NP({ O,I,D}) 输入 ix 的变异位置, 返回 $ {O,I,D}$ 的一个子集。一个变异类型 c∈maskx,T(i)c\in mask_{x,T}(i)cmaskx,T(i) 仅当 staisfies(mutate(x,(c,1),i),T)staisfies(mutate(x,(c,1),i),T)staisfies(mutate(x,(c,1),i),T) 为真,即如果在 x 的位置 i 处应用变异 c 的变异结果满足 T ,则 c 存在于 maskx,T(i)mask_{x,T}(i)maskx,T(i) 中。

变异蒙版表示输入 x 的位置 i 处变异产生的输入能否到达目标代码。

在这里插入图片描述

如图所示,第12 行,在确定性阶段过滤掉不能到达目标代码的变异。在随机性阶段不再随机选择变异位置,而是通过 randomOkToMutate(maskx,T,u)randomOkToMutate(mask_{x,T},u)randomOkToMutate(maskx,T,u) 确定变异位置,就是对 的okToMutate(maskx,T,u,i)okToMutate(mask_{x,T},u,i)okToMutate(maskx,T,u,i)一个调用,但是参数 i[0, x -m-1] 之间平均取样,所有符合要求的 i 组成一个集合,从集合中随机选择一个作为变异位置。如果okToMutate(maskx,T,u,i)okToMutate(mask_{x,T},u,i)okToMutate(maskx,T,u,i) 得出的位置集合为空,则跳过此次变异(25行),并在下一轮循环中选择一个新的 u=(c,m)u = (c,m)u=(c,m)

3.2 Targeting Rare Branches

FairFuzz仅对覆盖稀有分支的种子进行变异。

定义三: hits(x,b)hits(x, b)hits(x,b) 表示输入 x 覆盖到分支 b,命中计数表示覆盖到某个分支的输入数量

定义四: L 表示迄今为止产生的所有输入的集合,对分支 b 的命中计数为:numHits[b]=∣x∈L:hits(x,b)∣numHits[b]=|x \in L : hits(x,b)|numHits[b]=xL:hits(x,b) ,具体地说numHits 是一个分支命中计数的映射,每测试一个输入就会更新。FairFuzz会首先在没有变异蒙版的情况下对种子进行一轮变异,以建立numHits

经过实验,将被最少输入覆盖的n个分支指定为稀有,或者被少于p % 的输入覆盖的分支指定为稀有是不可行的,因为如果 n=2,最少被覆盖的2个都将被认为是稀有分支,即使他们的命中计数分别为20和5000,显然是不合理的。其次,阈值需要针对不同的目标程序进行修改。于是作者将稀有分支定义为命中计数小于动态

定义五: Bv={ b∈B:numHits[b]>0}B_v=\{b \in B : numHits[b]>0\}Bv={ bB:numHits[b]>0},其中 B 为目标程序中所有分支集合,则 BvB_vBv 表示已经覆盖到的分支集合。如果numHits[b]≤ratity_cutoffnumHits[b]\leq ratity\_cutoffnumHits[b]ratity_cutoff,则 b 为稀有分支,其中 ratity_cutoff=2iratity\_cutoff=2^iratity_cutoff=2i 其中i满足 2i−1<min(numHits[b′])≤2i,b′∈Bv2^{i-1} < min(numHits[b\prime])\leq 2^i, b\prime \in B_v2i1<min(numHits[b])2i,bBv

比如,如果最少的命中次数为17,则 ratity_cutoff=25ratity\_cutoff=2^5ratity_cutoff=25

定义六: branches(x)=b∈B:hits(x,b)branches(x)={b \in B:hits(x,b)}branches(x)=bB:hits(x,b)branches(x) 表示输入 x 覆盖到的分支集合。则 x 覆盖的命中次数最少分支 b∗=argmin(numHits[b]),b∈branches(x)b^*=argmin (numHits[b]), b \in branches(x)b=argmin(numHits[b]),bbranches(

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值