论文笔记《Directed Greybox Fuzzing》
本文第一次提出定向模糊测试。
摘要
现有的Greybox模糊器(GF)无法有效地定向到有问题的更改或补丁,关键系统调用或危险位置,或者指向我们希望重现的报告漏洞的堆栈跟踪中的功能。
在本文中,我们引入了定向灰盒模糊测试(DGF),它生成输入,目的是有效地到达一组给定的目标程序位置。我们开发和评估基于退火的模拟能量计划,该计划逐渐将更多能量分配给更接近目标位置的种子,同时减少更远的种子的能量。我们的实现AFLGo的实验表明,DGF优于基于符号执行的有向白盒模糊测试和非定向灰盒模糊测试。我们展示了DGF在补丁测试和崩溃再现中的应用,并讨论了AFLGo与Google的持续模糊测试平台OSS-Fuzz的集成。由于其针对性,AFLGo可以在几个模糊不清的安全关键型项目(如LibXML2)中找到39个错误。分配了 17 个 CVE。
Introduction
在本文中,我们介绍了定向灰盒模糊控制(DGF) ,它的重点是到达一组给定的目标位置在程序中。 在高层次上,我们将可达性强制转换为最优化问题,并使用一种特殊的启发式算法,来最小化生成的种子到目标的距离。 为了计算种子距离,我们首先计算和插桩每个基本块到目标的距离。 虽然种子距离是过程间的,但是我们的新方法只需要对调用图和每个过程内的 CFG 进行一次分析。 在运行时,模糊器聚合每个运行的基本块的距离值来计算种子距离作为它们的平均值。 DGF以模拟退火算法作为最小化种子间距的元启发式算法 ,并以能量调度的形式实现。 能量调度控制所有种子的能量。 种子的能量特性决定了种子fuzzing的时间。 与所有灰盒模糊技术一样,通过将分析移动到编译时,我们可以最小化运行时的开销
DGF 将目标位置的可达性转换为最优化问题,而现有的定向(白盒)模糊方法将可达性转换为迭代约束补偿问题。
本文的定向灰盒模糊是基于CG(Call graph)和CFG(Control flow graph)的,使用距离测量和基于退火的能量调度的实现方法,在补丁测试和crash复制领域很有用
本文的主要工作:
- 灰盒模拟和模拟退火的集成
- 一种跨过程的距离的正式测量方法,可以同时考虑多个目标,可以在测量时有效地预先计算,并在运行时得到最佳结果
- 将定向灰盒模糊作为 AFLGo 实施,该功能在 https://github.com/AFLGo/AFLGo 公开提供,
- 将 AFLGo 作为补丁测试工具整合到 OSS-Fuzz 的全自动化工具链中,该工具在
https://github.com/AFLGo/OSS-Fuzz 公开发布 - 大规模评估定向灰盒燃烧作为补丁测试和碰撞复制工具的效率和实用性
Technology
种子输入和多个目标之间的距离测量
为了计算各函数之间的距离,本文在函数级别的调用图和基本块级别的程序内控制流图中为每个节点分配一个值。
为了计算跨函数的距离