定向Fuzz技术概述
定向Fuzz的概念出现在2017年[1],其设计理念与传统Fuzz截然不同:我们假设一个应用场景,我们只想知道某一个函数(或某一个代码段)是否存在漏洞,并且可能测试时间有限的情况下,那么以AFL[2]为代表的传统Fuzz工具能否适应这样的场景?
显然答案是否定的,AFL没有办法将自己引导到目标点的代码段。定向Fuzz技术应运而生:定向Fuzz需要事先给定target(代码段的位置),认为只要输入能够到达target,就算完成任务,并不优先关注除了target以外的其他代码段可能存在的漏洞。定向Fuzz主要应用在补丁测试、漏洞PoC、静态分析验证等场景。尤其当测试时间有限,或者目标代码量很大的情况下,定向Fuzz更能体现出其优势,相比于以往的Fuzz技术,可以大幅度的减少测试的开销。
目前,学界关于定向Fuzz的主要研究方向分为以下两类:(1)如何确定目标点?一种是通过预先给定目标点,如AFLGo和Hawkeye。另一种是通过深度学习的方法,通过学习大量的漏洞代码样本建立模型,预测程序中可能存在漏洞的函数(或基本块)并以此为目标点,如V-Fuzz[5]和Suzzer[6]。(2)基于什么指标引导Fuzzer到达目标点?AFLGo[3]和Hawkeye[4]通过在静态分析时提取CFG与CG,计算每一个基本块到达目标点的Dijkstra距离,基于此距离为每一个种子分配不同的能量,使得Fuzzer趋向于距离目标点更近的种子。另一种是基于深度学习模型预测分数引导,对每一个基本块(或函数)打分,分数越高意味着越有可能存在漏洞,Fuzzer更倾向于执行经过更高分数的基本块(或函数)的种子。
在下文中,我们将介绍具有代表性的AFLGo:Directed Greybox Fuzzing(17' CCS)和Hawkeye:Towards a Desired Directed Grey-box Fuzzer(18' CCS)两篇文章,以展示定向Fuzz的具体逻辑。
AFLGo是第一款灰盒定向Fuzz工具,通过在插桩时计算Dijkstra距离,使得每一个种子运行到程序任何位置时,Fuzzer都可以发现该种子与target之间的距离,为每一个种子分配不同的能量。其能量分配基于模拟退火算法,当运行时间越长,距离越近的种子获得的能量越高,变异的次数越多。
图1 AFLGo整体流程示意图
如图所示,首先提取目标程序的CFG与CG,然后通过AFLGo的Distance Calculator计算Dijkstra距离,将距离作为桩代码的一部分。插桩后的程序送入Fuzzer,AFLGo同样将边覆盖率提升的种子加入队列,并根据其距离等因素为每一个种子分配不同的score,以增加或减少其havoc次数。
图2 AFLGo采用的模拟退火算法
如图2所示,刚开始运行时,AFLGo会平等对待每一个种子;当运行时间越长,距离越远的种子分配的能量就越少,那么会存在一个问题即长路径可能会被“饿死”,但是长路径并不意味着不能触发crash[7];同时,AFLGo仅采用havoc变异策略,havoc的确可以探索更多的程序分支,但是当距离目标点很近时,havoc大概率会破坏掉现有的种子结构,缺乏一种适应性的变异策略。
即使AFLGo存在部分缺陷,但其思想开创了定向Fuzz的先河,具有很高的借鉴意义。接下来这篇文章是发表在2018年CCS会议上的Hawkeye,对AFLGo存在的问题进行了完善。
Hawkeye定义了定向Fuzz的4个特征:
P1.DGF必须有个鲁棒性很好的路径机制,能引导Fuzzer走所有到达目标点的路径,而不是偏向特定路径。
P2.DGF的静态分析应该平衡开销和实用性,搜集必要信息。
P3.DGF应该优先调度种子以快速到达目标点,根据距离合理分配能量。
P4.DGF应该根据种子覆盖的不同程序状态,采取适应性的变异策略。
而在上述特征中,AFLGo存在一些问题:
P1:AFLGo采用短路径优先且权重默认为1,路径越短则认为越快到达target。但是短路径不一定能够触发漏洞,且在AFLGo中,长路径随着Fuzz时间增加,被分配的能量越来越少。
P2:AFLGo仅考虑显示函数调用,即忽略了函数指针调用。那么很有可能导致某些函数没有前序调用,导致CG不完整,路径距离无意义。
P3:虽然AFLGo应用了模拟退火策略来使短距离种子具有更多的时间被Fuzz,但是在种子队列的排序中,短距离种子并没有优先级。
P4:AFLGo放弃了确定性变异策略,只采用havoc/splice两种策略。但是当种子离target距离很近时,AFLGo会大概率破坏种子。缺少一种适应性的策略。
因此,Hawkeye在设计中进行了一些完善:细化了函数距离,如对于不同次数的函数调用分配不同的距离、不考虑循环语句次数、不考虑分支难易等;引入指针分析,采用了上下文不敏感流不敏感的指针分析;在距离计算中加入了覆盖期望集,考虑覆盖函数的相似度,相似度越高能量越高;设计了三层种子队列,将种子的优先级分为重要、次要、一般三个等级;引入了适应性的变异策略,在程序早期采用havoc等粗粒度变异,进入目标函数后转为细粒度变异策略防止破坏种子结构。
图3 Hawkeye总体流程图
总结
在本文中,我们简单介绍了定向Fuzz的研究意义与研究方向,以及两篇在定向Fuzz领域有代表性的文章,简单分析了两篇文章的优点与不足。定向Fuzz是当前研究热点,仍存在一些问题:定向Fuzz的引导机制并不完善以及在较难触发的target的命中次数上表现仍有不足;Hawkeye这种三层种子队列的设计是否能够完全实现种子优先级有待商榷;基于深度学习的定向Fuzz在实际应用中的效果并不理想等。这些都是未来工作中将要解决的问题,欢迎有兴趣的读者与我们互相交流,互相学习。
参考文献
[1] Chen Chen, Baojiang Cui, Jinxin Ma, Runpu Wu, Jianchao Guo, and WenqianLiu. 2018. A systematic review of fuzzing techniques. Computers & Security 75 (2018), 118–137.
[2] American Fuzzy Lop (AFL) Fuzzer. http://lcamtuf.coredump.cx/afl/technical_detais.txt. (2017). Accessed: 2017-05-13.
[3]Marcel Böhme, Van-Thuan Pham, Manh-Dung Nguyen, and Abhik Roychoudhury.2017. Directed Greybox Fuzzing (CCS ’17). ACM Press, New York, NY, USA, 2329–2344.
[4] Chen H , Xue Y , Li Y , et al. Hawkeye: Towards a Desired Directed Grey-box Fuzzer[C]// the 2018 ACM SIGSAC Conference. ACM, 2018.
[5]Li Y , Ji S , Lv C , et al. V-Fuzz: Vulnerability-Oriented Evolutionary Fuzzing[J]. 2019.
[6] Zhao Y , Li Y , Yang T,et al. Suzzer: A Vulnerability-Guided Fuzzer Based on Deep Learning[C]// International Conference on Information Security and Cryptology. Springer, Cham, 2019.
[7] LLVM. 2015. libFuzzer. https://llvm.org/docs/LibFuzzer.html
微信:
FuzzWiki
原文始发于微信公众号(FuzzWiki):定向Fuzz技术概述
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论