大家好,今天分享 COMPASS Lab 在 RAID’24 上发表的一篇论文。
题目:Efficiently Rebuilding Coverage in Hardware-Assisted Greybox Fuzzing
会议:RAID 2024
作者:Tai Yue, Yibo Jin, Fengwei Zhang*, Zhenyu Ning, Pengfei Wang*, Xu Zhou, Kai Lu
Motivation
覆盖率引导的灰盒模糊测试(Coverage-based Greybox Fuzzing, CGF)技术已经成为了漏洞挖掘领域最流行的技术之一。例如,大名鼎鼎的AFL以其高效率的编译时插桩技术成为了备受学术界与工业界关注的工具之一。然而,现有的CGF技术在面向闭源二进制(即Binary-only Fuzzing)的场景下,其覆盖率反馈机制存在一定的不足。例如,动态二进制插桩(Dynamic Binary Instrumentation, DBI)技术的运行时开销过高,静态二进制重写(Static Binary Rewriting, SBR)技术的开销虽然很低,但对二进制的要求过高。因此,硬件追踪(Hardware Tracing)技术,如Intel PT和Arm CoreSight,凭借其运行时开销低、追踪能力强、对二进制仅有架构要求等优点成为了Binary-only Fuzzing领域关注的一类技术。研究人员也基于此提出了基于硬件辅助的灰盒模糊测试(Hardware-assited Greybox Fuzzing, HGF)技术。
然而,现有HGF技术在覆盖率重建方面主要面临两大挑战:一是难以平衡覆盖率的开销和敏感度。AFL的分支计数覆盖率(Branch-count Coverage)成为了CGF领域常用的覆盖率算法,但硬件追踪技术所产生的信息(通常只记录间接分支目的地址和分支是否跳转)难以直接转化为分支计数覆盖率。为此,一些工作如PTFuzz采用对照反汇编代码恢复全部基本块信息的方式来重建分支计数覆盖率, 引入了高额的运行时开销。一些工作如PTrix为了降低开销,采用了直接从追踪信息中重建覆盖率的方式,但引入了过于敏感的路径覆盖率,带来了种子爆炸的问题。最新的工作如𝜇AFL采用了ETM(CoreSight中的追踪单元)的硬件特性(在分支广播模式下可记录直接分支的目的地址),直接从追踪信息中构建分支粒度的覆盖率,但分支广播模式引入了额外的解码开销。因此,如何高效率重建粒度适中(通常为分支粒度)的覆盖率成为了HGF技术的挑战之一。
二是容易受到硬件追踪缓冲区溢出的影响。如上图所示。现有硬件追踪技术如Arm CoreSight通常采用一块较小的on-chip buffer(例如图中的ETF)来临时缓冲硬件追踪单元所产生的追踪数据,当硬件追踪单元ETM产生数据带宽过高时,会发生硬件追踪缓冲区溢出,导致追踪信息丢失,从而使得构建出的覆盖率不稳定、不精确,进而降低了fuzzer的效率。
Overview
本工作聚焦上述两大挑战,基于Arm CoreSight,提出了高效率的HGF技术,并实现了原型工具Stalker。为了解决挑战一,我们创新性地提出了双层覆盖率机制(Double-Layer Coverage Mechanism),通过构建两种不同粒度和开销的覆盖率算法,即轻量级的路径覆盖率和粒度适中的分支覆盖率,将执行测试用例和筛选种子分别交给不同的覆盖率,来充分发挥它们各自的优点,在高效率重建覆盖率的同时避免种子爆炸的问题。为了解决挑战二,我们提出了自适应CPU调频机制(Adaptive CPU Frequency Modulation Mechanism,ACFMM),通过在测试时自适应调整CPU频率来控制ETM产生数据的带宽频率,进而尽可能减缓追踪缓冲区溢出带来的影响。
其中,双层覆盖率算法如上图所示。在底层,我们基于PTrix的思路,设计了一种基于ETM默认模式的轻量级路径覆盖率,能够高效率执行测试用例并初步筛选出路径种子(Path Seed);在上层,我们设计了一种基于ETM分支广播模式的分支覆盖率,在不依赖反汇编代码的情况下重建分支粒度的覆盖率。该覆盖率会重新执行路径种子,从中筛选出分支种子(Branch Seed)并加入到种子队列中,进而避免种子爆炸的问题。考虑到覆盖率的效率和稳定性,我们在设计和实现这两种覆盖率的时候采用了直接解码数据包并重建覆盖率的方式,以避免恢复全部基本块的开销。此外,我们还采用了多种策略,例如微架构代码优化、过滤噪音数据包、禁用formatter等来进一步提高效率和稳定性。通过双层覆盖率机制和多种优化策略,Stalker可以在大多数情况下使用轻量级的路径覆盖率高效率执行测试用例,并使用粒度适中的分支覆盖率来进一步过滤种子以避免种子爆炸的问题。
由于ETM产生数据的带宽频率与CPU频率、目标程序执行的指令、ETM配置等因素相关,降低CPU频率可以降低ETM的带宽,进而减缓追踪缓冲区溢出问题。理论上,可以将CPU频率设置在最低以最大限度避免溢出问题,但会严重影响测试效率。为此,我们提出了自适应CPU调频机制,尽可能在减缓缓冲区溢出的同时保证测试效率,其算法如下图所示。
ACFMM的思路非常直接,每次在结束测试后检查是否发生追踪缓冲区溢出,一旦发生溢出,则下调当前CPU频率。如果测试了一定次数内均没有发生溢出,则上调CPU频率。特别地,调整CPU频率的测试次数阈值会自适应进行调整。
我们基于AFL开发了Stalker,其框架如下图所示。Stalker沿用了AFL的主要框架,只是在覆盖率反馈机制方面采用Arm CoreSight技术来构建。为了进一步提高效率,我们对CoreSight的驱动进行了优化,以加快获取追踪数据。此外,我们还对解码器进行了优化,来提高解码效率。
Evaluation
文章对Stalker的性能与各个方法的有效性进行了全面实验。具体来说,我们在Arm Juno R2开发板上部署了Stalker,选取了10个真实世界程序进行测试,并将Stalker与AFL-QEMU、AFL-QEMU++、Armored-CoreSight(包含Armored-Path和Armored-Edge)、𝜇AFL(通过Stalker-Branch-Fmt进行模拟)、PTrix、libxdc等进行了比较。实验结果表明,Stalker重建相同粒度的覆盖率比其他工具都要快。此外,在24小时覆盖率测试实验中,Stalker执行了最多的测试用例,覆盖了最多的分支和路径。具体实验数据和内容可以在论文中获取。
Conclusion
本文对当前HGF技术中如何重建覆盖率这一关键核心问题进行了深入研究,指出了当前技术存在的问题,并提出了高效率的HGF技术,实现了原型工具Stalker。Stalker采用双层覆盖率机制来高效率重建覆盖率并避免了种子爆炸问题,通过自适应CPU调频机制来减缓缓冲区溢出带来的影响。
在未来的工作中,我们将探索基于Stalker的特定目标漏洞挖掘技术,将Stalker用于TEE OS、TA、Hypervisor等目标的漏洞挖掘中。
如果您对此项工作感兴趣,欢迎阅读论文原文或者联系我们,谢谢。
论文地址:https://dl.acm.org/doi/10.1145/3678890.3678933
原文始发于微信公众号(COMPASS Lab):近期工作分享 | Stalker