摘要
灰盒模糊已经成为最具可扩展性和实用性的软件测试方法。大多数灰盒模糊工具都是基于覆盖率的,因为代码覆盖率与bug覆盖率是紧密相关的。然而,由于大多数覆盖的代码可能不包含错误,盲目扩展代码覆盖的效率较低,特别是在角落的情况下。不像基于覆盖的fuzzer以一种无方向的方式扩展代码覆盖,有方向的fuzzer将大部分的时间预算花在到达特定的目标位置(例如,bug倾向区)而不会浪费资源去强调不相关的部分。因此,直接灰盒模糊特别适合于补丁测试、bug复制和特殊bug查找等场景。本文首次对定向灰盒模糊进行了深入的研究。我们调查了28个与DGF密切相关的最先进的fuzzer(82%是在2019年之后发布的),这些fuzzer有各种定向类型和优化技术。基于DGF的特征,我们提取了15个度量指标,对收集到的工具进行全面评估,并将该领域的知识系统化。最后,总结了该领域面临的挑战,并提出了该领域的展望,旨在促进和推动未来的研究。
介绍
我们调查了28个与DGF密切相关的最先进的fuzzer(82%是在2019年之后发布的),这些fuzzer有各种定向类型和优化技术。我们根据DGF的特征提取15个指标,对收集到的工具进行全面评估,并将该领域的知识系统化。-在评价已有研究成果的基础上,总结了DGF研究面临的六个挑战,包括二进制代码支持、目标自动识别、权重区分、全局最优偏差、缺少间接调用和勘探开发协调。我们揭示了这些挑战背后的深层原因,并提出了可能的解决方案。-我们对未来的发展方向进行展望,旨在促进和推动该领域的研究。
内容
CGF与DGF的区别:种子优先级,目标的参与,勘探-开发。
DGF的应用:
- 补丁测试,
- bug复现,
- 知识提升。DGF可以通过集成人类分析师的知识或辅助技术来促进程序测试。人在回路通常用于软件测试,这有助于根据以前的经验识别关键系统调用或安全敏感程序站点(例如,内存分配函数malloc()、字符串操作函数strcpy()),从而将模糊化引导到容易出错的部分[35]。辅助技术,如符号执行[44]和tait分析[46]可以用来克服测试中的障碍。静态分析[12]和基于机器学习的检测方法[32]的初步结果可作为DGF的潜在易受攻击目标。
- 节能。
- 特殊的bug查找。最后,DGF可以用于根据定制的指标寻找特殊的bug。例如,在内存使用[31]的指导下找到不受控制的内存消耗错误,在类型状态违背[28]的指导下找到useafter-free错误。使用DGF可以大大提高发现行为复杂bug的效率。
为了进行全面的评估,我们根据DGF的特征提取了15个指标。我们进一步将指标分为三类,包括基本信息、实现细节和优化方法。接下来,我们将集中讨论与DGF关键技术相关的特性,包括定向类型、输入优化、种子优先级排序、功率分配、变异调度和数据流分析。详细评估见表一。
定向类型
G定向灰盒模糊,H定向混合模糊
对于定向型DGF, DGF最初是由PUT中手动标记的目标位点引导的,如AFLGo[21]和Hawkeye[42]。然后,研究人员注意到目标之间的关系也有帮助。例如,为了触发释放后再使用的漏洞,必须按照特定的顺序执行一系列操作(例如分配内存、使用内存和释放内存)。UAFuzz[22]和UAFL[28]利用目标序列而不是目标站点来寻找免费后使用的漏洞。LOLLY[23]还使用目标语句序列来指导greybox模糊处理,以触发由多个语句的连续执行导致的错误。Berry[24]使用符号执行来增强LOLLY沿着复杂路径到达深层目标时的方向性。除了目标序列,研究人员还提出了多种机制来指导模糊过程。Memlock[31]由内存使用情况指导,以发现不受控制的内存消耗错误。v - fuzzy[32]由脆弱性概率指导,通过深度学习模型预测脆弱性概率,将模糊过程引导到可能存在脆弱性的代码区域。SemFuzz[25]和DrillerGo[26]利用从CVE描述和git日志中获取的语义信息来直接模糊并生成PoC漏洞。1DVUL[44]由补丁相关分支直接更改原始数据流或控制流来发现1天内的漏洞。SAVIOR[30]和ParmeSan[29]的指导信息来自于消毒剂。IJON[35]利用人工分析师的注释来指导fuzzer克服重大障碍。RVFUZZER[34]由控制不稳定性指导,以发现机器人车辆的输入验证错误。PFUZZER[27]显式地指向输入解析器,以很好地覆盖可能的输入空间。DGF已经从到达目标位置发展到捕捉复杂的深层行为bug。
输入优化
标记目标之后,DGF需要生成种子输入来调用模糊过程。良好的种子输入可以使模糊过程更接近目标位置,提高后续突变过程的性能。根据Zonget al.,平均超过91.7%的AFLGo输入无法到达有bug的代码[54]。因此,优化输入生成对于提高DGF的方向性有很大的空间。seeddedfuzz[46]致力于改进初始种子的生成和选择,