网络攻防综合实践

MOpt: Optimized Mutation Scheduling for Fuzzers

一.论文介绍及研究背景

1.1论文信息

论文题目:MOpt: Optimized Mutation Scheduling for Fuzzers
作者:Chenyang Lyu, Zhejiang University;
Shouling Ji, Zhejiang University & Alibaba-Zhejiang University Joint Research Institute of Frontier Technologies;
Chao Zhang, BNRist & INSC, Tsinghua University;
Yuwei Li, Zhejiang University;
Wei-Han Lee, IBM Research;
Yu Song, Zhejiang University;
Raheem Beyah, Georgia Institute of Technology
论文链接https://www.usenix.org/conference/usenixsecurity19/presentation/lyu
这篇论文被列入了《纽约时报》的议事录第 28 届 USENIX 安全研讨会。
时间地点:2019 年 8 月 14 日至 16 日·美国加利福尼亚州圣克拉拉

1.2 论文内容

本文提出了一种新的突变调度方案 MOPT,使基于突变的模糊器能够更有效地发现漏洞。MOPT 利用自定义粒子群优化(PSO)算法来寻找算子在引信有效性方面的最优选择概率分布,并提供起搏器引信模式来加速 PSO 的收敛速度。解决了现有的模糊器通常遵循特定的分布来选择突变算子,寻找一般程序的漏洞方面效率低下的问题。

1.3 研究背景

1.3.1基于突变的 Fuzzing
基于突变的模糊处理善于发现漏洞,而不利用目标程序的先验知识。 相反,它通过以某些方式变异一些格式良好的种子测试用例来生成新的测试用例。
基于突变的引信一般工作流程如下:
(1)维护种子测试用例队列,可以在运行时更新;
(2)按一定顺序从队列中选择一些种子;
(3)以各种方式变异种子;
(4)用新生成的测试用例测试目标程序,并报告漏洞或在必要时更新种子队列;
(5)最后再回到步骤(2)。
本文主要研究突变阶段(即步骤(3))
1.3.2 变异算子
基于突变的模糊子可以以无限多的方式变异种子。 考虑到性能和可用性,在实践中,这些模糊器,包括 AFL 及其后代,通常预先定义一组突变算子,并选择其中一些在运行时突变种子。 这些突变运算符描述了在哪里突变(例如,哪个字节)和如何突变(例如,添加、删除或替换字节)。

1.3.3突变计划
在 AFL 的三个阶段中使用的三种突变调度方案,如下图:

  1. 确定性阶段调度器: AFL 对首次选择变异的种子测试用例应用确定性调度方案。 该调度器按顺序使用 6 种确定性类型的突变算子,并将它们逐一应用于种子测试用例。
  2. havoc 阶段调度器:在大破坏阶段采用 AFL 的主要突变调度方案。

AFL 首先决定数字,表示为 Rt 在这个阶段生成新的测试用例。 每次AFL 选择一系列遵循均匀分布的 Ro 突变算子,并将它们应用于种子上生成一个测试用例。破坏阶段结束后,Rt 新的测试用例已经产生。
3. 拼接阶段调度器: 在一些罕见的情况下,AFL 工作通过上述两个阶段的所有种子,但未能发现任何独特的崩溃或路径在一轮。 然后 AFL 将进入特殊的拼接阶段,在这个阶段,AFL 只使用一个操作符交叉来生成新的测试用例。 这些新的测试用例将被输入到破坏阶段调度程序,而不是正在测试的程序,以生成新的测试用例。

1.3.4变异效率
不同的突变算子的工作方式截然不同。一个直观的假设是,它们在不同的目标程序上有不同的效率。测量了 12 个突变算子在确定性阶段产生测试用例。 结果如图所示:

在确定性阶段,突变算子的顺序和选择的时间是固定的。下图显示了顺序和操作符在引信 avconv 期间被 AFL 选择的时间,指示引信花费的时间。

二.MOPT 概述

2.1设计思路

突变调度器旨在为给定的运行时上下文选择下一个最优突变算子,该算子可以找到更有趣的测试用例。 我们将这个问题简化为寻找突变算子的最优概率分布,然后调度器在测试目标程序时选择下一个算子。 寻找所有突变算子的最优概率分布是具有挑战性的。相反,我们可以首先让每个算子探索自己的最优概率。 然后,基于这些最优概率,我们可以得到突变算子的全局最优概率分布。

2.2粒子群优化(PSO)

粒子群算法是由 Eberhart 和 Kennedy 提出的,旨在寻找问题的最优解。
它采用多个粒子迭代搜索解空间,其中一个位置是候选解。

在每次迭代中,每个粒子被移动到一个新的位置 xnow,基于(1)它的惯性(即,先前的运动 now ),(2)位移到它的局部最佳位置 Lest,到目前为止这个粒子已经发现,(3)位移到全球最佳位置 Gest, 到目前为止所有粒子已经发现。 具体地,粒子 P 的运动计算如下:

每个粒子都向 Lest 和 Gest 移动,并且可能继续移动到更好的位置。通过向 Gest 移动,多个粒子可以同步工作,避免陷入局部最优。 因此,群将被引导到最优解。 此外,PSO 易于实现,计算量小,是优化突变调度的一个很好的方法。

2.3设计细节

MOPT 旨在找到最优的概率分布。首先探索每个算子的最优概率,然后构造最优概率分布。
2.3.1粒子
每个算子都使用一个粒子,并试图在预定义的概率空间[x]中为每个算子探索一个最佳位置 m在Xmax,粒子(即算子)在概率空间中的当前位置,即 Xnow,表 示调度程序将选择该算子的概率。 由于概率的性质,一次迭代中所有粒子概率的和都应该归一化为 1。
2.3.2当地最佳位置最佳
对于给定的粒子,Lest 是粒子的位置,其中相应的运算符产生测试用例(给定相同数量的调用)。 为了进行这种比较,对于每个粒子(即算子),我们测量了它的局部效率,即这个算子贡献的测试用例的数量除以这个算子在一次迭代中的调用次数。 我们把最大的 effnow 表示为 effbest。 因此,Lest 是操作者在历史上获得有效的位置。
2.3.3全球最佳位置
测量了到目前为止在所有群中每个操作符贡献的测试用例的数量,并将其用作粒子的全局效率 globaleff。 然后计算所有粒子的全局效率分布。 对于每个算子(即粒子),它的全局最佳位置 Gbest 被定义为它的 globaleff 在这个分布中的比例。 通过这种分布,效率较高的粒子(即算子)可以获得更高的概率被选择。

2.3.4群

MOPT 使用多个群,并将定制的 PSO 算法应用于每个群。在引信期间,执行以下三项额外任务

在 PSO 的每次迭代中。
• 找到每个群体中所有粒子的局部最佳位置。
• T2:定位所有粒子在群中的最佳位置。每个粒子的全局效率全局 eFF 是跨群评估的。 然后对粒子的全局效率分布进行了评价。
• 选择最好的蜂群来引导引信。在一次迭代中对每个群的效率进行了评估。 选择具有最高 swarmef 的群,并将其在当前迭代中的概率分布应用于进一步的模糊化,然后,在每次迭代结束时,MOPT 以类似于 PSO 的方式移 动每个群中的粒子。

三.执行MOPT

3.1主要框架

3.2具体框架

3.2.1 PSO 初始化模块
(1)将每个粒子在每个群中的初始位置 Xnow 设置为一个随机值,并将 x 的和归一化在一个群中的所有粒子中;
(2)将每个粒子在每个群中的粒子运动 VNow的位移设置为 0.1;
(3)将每个粒子在每个群中的初始局部效率 efnow 设置为 0;
(4)设置初始局部最佳位置 每个群中的每个粒子到 0.5;
(5)将每个粒子跨群的初始全局最佳位置 Gest 设置为 0.5。注意,初始化模块只在 fuzzer 开始运行时执行一次。
3.2.2 先导模糊模块
该模块使用多个群集执行模糊,其中每个群集探索不同的概率分布。 该模块按顺序计算每个群,并在生成新测试用例的可配置数量(表示为周期导航)后停止测试一个群。 用特定的蜂群进行引信的过程如下。 在引信过程中,该模块将测量三个测量:(1) 特定粒子(即算子)贡献的有趣测试用例的数量;
(2)特定粒子的调用数量;
(3)通过对目标程序进行仪器化,测量该群体发现的测试用例的数量。
每个粒子的局部效率(在电流群中)是第一次测量除以第二次测量。因此,我们可以定位每个粒子的局部最佳位置。电流群的效率是第三次测量除以测试用例计数周期。 因此,我们可以找到最有效的群体。
3.2.3核心模糊模块
该模块将采用最佳群,并利用其概率分布进行引信。它将在生成新测试用例的可配置数字后停止。一旦它停止,我们可以测量每个粒子贡献的测试用例的数量,而不管它属于哪个群,从 PSO 初始化开始到现在,我们可以计算粒子之间的分布,并定位每个粒子的全局最佳位置。
3.2.4PSO 更新模块
该模块按照方程更新每个群中的粒子,更新每个粒子后,我们将进入 PSO 更新的下一次迭代。因此,我们可以接近一个最优群(即算子的概率分布),使用它来指导核心引信模块,并帮助提高引信效率。

四.实验

4.1实验环境

我们论文中使用的 AFL 版本是 2.52b。我们将 MOPT 应用于 AFL 的 破 坏 阶 段 , 并 实 现 MOPT-AFL-tmp 和 MOPT-AFL-ever 的原型,其中-tmp 和-ever 表示上一节中讨论的相应的起搏器模糊模式。 在 C 中实现 MOPT 的核心功能平台。
所有实验都运行在一个虚拟机上,该虚拟机配置了1 个 CPU 核心 2.40GHz、E5-2640、V4、4.5GB RAM 和 64 位 Ubuntu16.04LTS 的操作系统。

4.2实验过程及分析

进入evaluation部分,首先介绍的是测试对象,我们从以往论文中选取了通常使用的一些目标程序作为测试对象。

实验结果如图所示,MOPT-AFL-tmp和-ever发现的crash数量为AFL的四倍,两者也发现了比AFL多一倍的程序路径。

随后我们使用address sanitizer对crash筛选,得到unique bugs,对比已公开的CVE,将未发现的bugs提交给厂商并申请CVE,最后总结得到上表内容。其中,AFL发现了20个新的CVE和7个已公开的CVE。而MOPT-AFL-tmp发现了58个新的CVE和14个已公开的CVE。MOPT-AFL-ever发现的CVE总数也达到了AFL的两倍。所以,MOPT-AFL的漏洞挖掘效率很高。

在实验过程中我们记录了3个fuzzers的crash个数与时间的关系,可以看到MOPT-AFL发现crash的速率显著快于AFL。

现存fuzzers使用均一分布来选择变异操作,于是我们在AFL-Fast和VUzzer上实现了MOPT调度策略来测试兼容性。由实验结果可知,MOPT可以提高AFL-Fast和VUzzer的漏洞挖掘表现。

随后我们在LAVA-M数据集上测试了10种fuzzers组合,并发现了一些有趣的结果。首先MOPT可以提高fuzzers的表现;其次在与Angora和QSYM的实验中,MOPT显著提高了漏洞个数,说明MOPT和符号执行技术(或近似的技术)是互补的,一同使用可以发现最多数量的漏洞。

后续进行统计学性质的实验。我们选取MOPT-AFL-ever,AFL,Anogra和VUzzer在五个目标程序上进行测试(分别使用三种不同的初始种子集),每次测试持续240小时,重复30次,评价标准是发现的crash和bug的数量,并且用p value分析两个fuzzers的表现是否有显著差别,p值很小说明存在显著差别,反之无显著差别。

首先是crash的统计分析结果,可以看到大部分测试用例中,MOPT-AFL-ever显著多于其它fuzzers。从箱型图看出,很多实验中MOPT-AFL-ever的最小值都大于其它fuzzers。

随后是bug的统计分析结果,可以看出MOPT-AFL-ever发现的bug多于其它fuzzers,p value也证实两个分布是差距显著的。

分析MOPT主要框架和pacemaker fuzzing mode对漏洞挖掘的影响,实现了不使用pacemaker fuzzing mode的MOPT-AFL-off,和只实现pacemaker fuzzing mode的AFL-ever进行测试。从实验结果可以得出,两个部分都能提高AFL效率,结合在一起提高的最多。

然后分析实验中不同的mutation operators的选择概率变化。我们列出三个operators在两个目标程序上的概率迭代图。首先纵向对比,不同的operator最终具有不同的选择概率,如测试pdfimages时三个概率分别大约是6.5%,4%,7.5%。纵向对比亦证实了在不同的目标程序上,同一个operator最终收敛的概率并不相同。

对MOPT引入的计算消耗进行分析,我们使用fuzzer的执行速率来分析MOPT是否对fuzzing过程造成计算负担。结果证实,大部分案例中,MOPT几乎没有影响执行效率,部分情况下执行速率快于AFL。在mp3gain实验中,虽然MOPT-AFL比AFL的执行速率慢,但是仍发现了更多的crash和bug。

最后进行长时间的并行试验。对于每一个fuzzer工具,我们运行了三个进程并行地挖掘pdfimages的漏洞,实验持续了24天,每个fuzzer的CPU时间超过了70天。结果表示,MOPT-AFL发现的crash和path显著多于AFL。
一些安装过程
Ubuntu 16.04 LTS 安装
参考链接:https://jingyan.baidu.com/album/0202781141acb71bcc9ce50a.html
AFL fuzz的安装非常简单,只需要去官网下载最新版本的源代码,解压缩后依次执行下面的指令:
make
sudo make install
参考链接 https://www.cnblogs.com/studyskill/p/7115913.html
cd afl-2.52b后,进行make
安装结果

afl-fuzz.c的大体流程:

建立整个out目录结构及相关文件
处理测试用例并写到out目录
通过drrun.exe运行fuzzing对象程序并插入winafl.dll,使用变形后的测试用例进行测试,并返回结果。那么具体out目录结构如下:
out/
/crashes 使应用程序crash的用例,也就是Winafl存放最终结果的目录
/hangs 存放使应用程序挂起的用例,这个目录的文件同样可能使应用程序crash
/queue fuzzing的一些过程文件
/.cur_input 当前fuzzing的用例
/fuzz_bitmap 被fuzzing函数的映射

学期总结

随着总结的写完,这个网络攻防课程也就彻底结束了,作为一个计算机小白,在这门课上面花费的时间比较多,从计算机网络基本知识到攻防实践,学了很多从来没有接触过的知识,第一次安装虚拟机,第一次运用C之外的其他语言,第一次环境配置,第一次完成实验,实现了很多的任务与挑战,哦对,还有修电脑的技能以及耐心程度提高了不少(捂脸笑),这门课也是学到的东西最多最广的一门课,也让我感受了自主学习的好处。远程的实验也感受到了周围同学的优秀程度,很荣幸和这样优秀的同学们在一个班,老师也很负责任,这门课给了我太多体验。最后,感谢王老师!感谢给我提供帮助的同学!

posted @ 2020-06-19 18:46  付元元  阅读(506)  评论(0编辑  收藏  举报