DARWIN: Survival of the Fittest Fuzzing Mutators
作者背景
达姆施塔特工业大学:成立于1877年,是德国著名理工科大学
‡萨格勒布大学: 是克罗地亚最大的大学,也是该地区历史最悠久的大学
§拉德堡德大学:位于荷兰奈梅亨市,又称奈梅亨大学,欧洲顶尖的研究型学术院校
发表时间
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wtjRTCBW-1683793219416)(null)]
研究支持
这项工作得到了德国联邦教育和研究部StartUpSecure资助项目 “Sanctuary”(16KIS1417)、德国联邦教育和研究部和黑森州高等教育、研究和艺术部在ATHENE内的支持,以及欧洲研究理事会(ERC)在欧盟地平线2020研究和创新计划(赠款协议号952697)的支持
相关链接
[论文链接](ndss2023_s159_paper.pdf (ndss-symposium.org))
这篇论文虽然是2023年发表的,但研究是从2020年开始做,因此一些数据并没有及时更新,这里可以和另一篇发表在2022 IEEE/ACM 44th International Conference on Software Engineering (ICSE)上的论文One Fuzzing Strategy to Rule Them All进行对比,这篇论文相关内容可以参考以下链接:
这篇论文作为对比,记为HavocMAB
背景
优化种子调度策略存在瓶颈
基于变异的模糊测试中的交互非常复杂且模糊实例具有随机性常常导致不可预测的结果,改善这种脆弱交互的大多数努力都集中在优化种子调度上。然而,像 Google 的 FuzzBench 这样的实际结果突出表明,这些方法在实践中并没有始终如一地显示出改进
现有的优化变异调度表现较差,且参数配置较为复杂
现有的变异策略(论文以MOPT为例)
MOPT
- 提出了一种改进的粒子群优化算法(PSO)来学习全局最优变异概率分布
- MOPT 的粒子群算法同时具有局部和全局最优概率分布,使得寻找最优解和算法本身变得复杂,并且在模糊化过程中使用成本更高
- MOPT 引入了各种用户可配置的参数,直接引导优化过程,因此用户需要解决另一个复杂的问题来避免非最优调度
- MOPT在fuzzbench上并没有比AFL优秀
此处插入前不久发表的另一篇论文为例(在论文中作者并没有提及这篇论文):
Havoc
-
现有的变异策略都需要用户对参数进行设置
-
使用不同的编译器叠加次数(stacking size)和使用不同的变异方法(单元变异和块变异)对Havoc的影响,作者提出对于不同的程序,应该设置不同的stacking size
-
作者提出了以stacking size 和变异方法为臂,建立一个多臂老虎机模型,记为HavocMAB
-
作者只对比了Havoc的覆盖信息,评估结果表明,与采用三个并行线程增加计算资源的 QSYM 相比,HavocMAB 可以使所有测试项目的边覆盖率平均提高11.1% ,甚至略高于最先进的 QSYM。进一步使用三个并行线程执行 HavocMAB,在所有的基准项目上,QSYM 的平均边缘覆盖率提高了9%。
-
但是作者在文中并没有提到发现任何crash
问题:寻找(近似)最优变异调度策略来改进模糊化算法
通过以上一些说明,可以发现现有的变异调度方法也未能令人信服,因为缺乏实际的改进或太多的用户控制参数,其配置需要关于目标程序的专家知识,这对用户的能力具有较高要求。
因此作者提出了一个不需要用户进行参数设置的寻找(近似)最优变异调度策略来改进模糊化算法的变异调度器,通过进化算法推断出下一个模糊迭代的最优选择是哪个变异算子,该算法在AFL的基础上进行构建,称为Darvin。
Metaheuristics
- 该方法协调局部改进和更高层次策略之间的交互,以创建一个能够逃避局部最优并在解决方案空间中执行鲁棒搜索的过程
- 元启发式优化算法一般分为基于单个解的元启发式算法和基于种群的元启发式算法
- 基于种群的元启发法对一组解进行处理(例如,进化算法(EA)和粒子群优化(PSO)等群算法
- 元启发式优化算法需要平衡“多样化”与“集中化”两种性质;
- 多样化是指算法能够探索搜索空间中的有希望区域并逃逸局部最优解。这有助于发现更广阔的搜索范围。
- 集中化是指算法能够聚焦在当前最优解附近寻找更好的相邻解。这有助于充分利用有希望的搜索范围获得更优的结果。
- 元启发式方法在应用于具体的优化问题时,多样化与集中化性质的交互作用决定了其效果的好坏。如果两者达到良好平衡,则有助于算法寻找到更优的全局解
方法
DARWIN利用进化策略,在一个类似于强化学习的设置中,为变异操作符选择近似理想的概率分布,以避免在次优变异体上浪费模糊迭代
生成的概率分布不是静态设置的,而是在模糊过程中学习的,并且动态地适应目标程序
具体方法之下:
执行过程
如上图所示,Darvin的执行包括四个步骤:
- 在havoc阶段模糊测试器从队列中选择一个输入用例,并随机选择下一个要应用的变异方法。最初,变异选择的概率分布是均匀的
- 应用一次变异之后,模糊测试器决定是否应继续变异此输入用例,或者将其在插桩的目标应用程序上进行测试
- 生成报告,变异调度器通过DARWIN 进化策略学习报告并优化概率分布
- 在下一次迭代中应用优化后的概率分布
进化算法
ES在μ个父节点上执行,在每次迭代中通过随机扰动算子产生一系列不同的修正解,个数用 λ 表示。在评估每个子解决方案之后,将在下一次迭代中选择所有子解决方案和当前父解决方案中的最佳子解决方案作为父解决方案λ通常设置为4,μ作者通过测试将其设置为5,它的值主要影响覆盖速度,对覆盖影响较为轻微
伪代码如下图所示:
解的编码和扰动
作者使用二进制向量的方式(0 1)来表示是否选择一个变异操作,扰动则通过一位的字节翻转来实现,如下图所示:
目标函数
作者以发现的新的独特路径作为反馈信号来作为评估单个解决方案的主要标准
同时Darwin并不需要用户进行参数的选择和输入
实现效果
如上图所示为各个模糊器在10个benchmark中的路径覆盖数,通过对比可以发现对于大部分的测试用例,Darvin都能到达最高的路径和边缘数量,同时在第一小时内都有最快速的增长。
对于cxxfilt,AFL的性能明显优于基于变异调度的MOPT和Darvin,且MOPT和Darvin表现效果相似,作者对cxxfilt的变异历史进行分析:如下图
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SSB8uMNr-1683793219390)(null)]
作者提出导致这一差异主要有两个原因:
- 在40分钟后DARWIN和MOPT更重视mutator 8和10
- cxxfilt更重视分解重载函数,变异调度器只能给严重依赖解析的模糊目标带来一点好处。然而,它们的性能影响降低了模糊器的原始执行速度,导致覆盖率较低
结论
通过以上实验,Darvin的平均边覆盖相比于Mopt提高了6.77%,相比于AFL提高了1.73%
fuzzbench 代码覆盖评分
作者还将这一方法在Ecofuzz上进行集成,在fuzzbench上的覆盖评分如下:
Crash
作者对比了在21个crash中三个fuzzer发现的crash的数量和时间,如上图所示,可以发现:
- 在总共发现的21个错误中,Darvin可以最快地找到其中的15个
- MOPT 在4种情况下是最快的,但仅仅是因为在其中两种情况下,Darvin不能触发 bug (MOPT 平均需要两天以上才能找到 bug)。
- AFL 只能找到12个缺陷
因此,在发现crash上AFL明显优于其他两个fuzzer,作者接下来还测试了在24小时连续10次运行中发现的bug数量,"max "指的是在一次运行中遇到的最大错误。"uniq "指的是在所有10次运行中的独特崩溃的数量,如下图所示:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-guyVAJbq-1683793219406)(null)]
DARWIN 还在 objeccopy 中发现了一个全新的错误(一直到24年前引入的 binutils 2.39) ,这个错误导致了内存泄漏。Objeccopy.c 中的 copy _ relocation _ in _ section 并不是在所有可能的情况下都释放缓冲区(relpp)。这个 bug 很难触发,因为函数只在高堆栈深度调用。导致 bug 的测试用例是通过基于相对较早的测试用例和来自实验中期的测试用例的拼接发现的。我们负责任地向各自的开发人员披露了分类错误,他们承认并修复了这个错误
工作总结
- 提出了一种新的变异调度方法 DAR-WIN,这是第一种利用进化策略的变异来优化变异算子的概率分布的变异调度方法
- 利用变异调度算法对 AFL 进行扩展,实现了一个 DARWIN 原型系统,并将其在EcoFuzz上也进行了扩展,并且,这一工具并没有引入任何新的参数来避免用户的应用障碍
露了分类错误,他们承认并修复了这个错误
工作总结
- 提出了一种新的变异调度方法 DAR-WIN,这是第一种利用进化策略的变异来优化变异算子的概率分布的变异调度方法
- 利用变异调度算法对 AFL 进行扩展,实现了一个 DARWIN 原型系统,并将其在EcoFuzz上也进行了扩展,并且,这一工具并没有引入任何新的参数来避免用户的应用障碍
- 评估了Darvin和MOPT,AFL的覆盖效果,在代码覆盖方面,Darvin明显优于AFL和MOPT,尤其是在binutils上。此外,在 MAGMA 上对 DARWIN 进行评估,结果显示 DARWIN 最快的触发了21个错误中的15个。最后,DARWIN 发现了20个独特的 bug (包括一个之前未报告的 bug) ,比 AFL 多出66% ,