HTFuzz: Heap Operation Sequence Sensitive Fuzzing
ASE 2022,
Yuanping Yu , Xiangkun Jia , Yuwei Liu , Yanhao Wang , Qian Sang , Chao Zhang , Purui Su .
<font size=4.5>Motivation</font>
时序类堆内存漏洞,即释放后重引用(use-after-free)、二次释放(double-free)和空指针解引用(null-pointer-dereference)漏洞,对软件系统危害严重,甚至被恶意攻击者利用造成系统任意代码执行。时序类堆内存漏洞因其与内存状态及程序的执行顺序有关,对堆操作序列高度敏感。对于提升堆时序漏洞的挖掘效率,需要在传统基于代码覆盖率引导的模糊测试技术中,引入堆操作序列信息。然而,现有基于序列问题的模糊测试解决方案在实际应用中存在较大局限。
以视频播放器软件GPAC中编号为CVE-2019-2016的UAF漏洞为例,其发生在𝑔𝑓_𝑖𝑠𝑜𝑚_𝑏𝑜𝑥_𝑑𝑒𝑙()中的函数指针指向free()函数,非安全的释放了堆对象,后续再次访问该对象的时候出错。现有通用模糊测试解决方案基于代码覆盖率、危险代码区域覆盖反馈等信息对程序执行序列的感知力度有限(例如AFL)。另外有一些将堆操作序列用于模糊测试的专用时序类漏洞挖掘工作,其首先通过先验知识或者静态分析识别候选堆操作,然后引导模糊测试工具进行类似定向模糊测试的方法按照顺序来覆盖堆操作。但是,该方法在实际应用中受限于专家领域知识或者静态分析技术性能瓶颈(例如UAFL)。
<font size=4.5>HTFuzz</font>
本文提出了一种新颖的挖掘时序类堆内存漏洞的模糊测试解决方案HTFuzz。方案核心思想是,在不依赖预定义或者预分析堆操作序列信息的基础上,通过引导模糊测试提高执行时堆操作序列的覆盖率和指针敏感指令的访问频度,在增加堆操作序列的的控制流和数据流敏感度基础上,提升时序类堆内存漏洞的挖掘概率。主要包括以下三方面改进:
1. 轻量级堆操作序列反馈机制。一般而言,程序一次执行中堆操作序列量非常大,在模糊测试中记录和比较堆操作序列需要花费大量内存和时间。文中为平衡堆操作序列的记录粒度和时间开销,设计环形缓冲区记录最新的堆分配、释放操作序列,将环形缓冲区的哈希值作为更新内存访问位置处的sequence_bitmap反馈信息的索引值。换句话说,文中将堆内存操作序列在内存访问点切分,将分段序列记录进一个sequence_bitmap,类似于AFL将程序执行边切分存入code_coverage_bitmap。
2. 指针别名追踪机制。时序类堆内存漏洞的发生不仅与堆操作序列有关,还与指针访问有关。指针存在大量别名引用以及交错复杂的生命周期,开发者正确管理和操作指针存在困难,执行中更多的堆指针及别名访问信息则更可能出错。由于精确的指针追踪开销大,本文通过指针访问频度计数优先选择有更多指针访问的种子进行来一轮种子变异。
3. 堆操作序列与代码覆盖率协作。代码覆盖率信息在漏洞挖掘中起到了很好的效果,在引进堆操作序列反馈时保留代码覆盖率反馈信息是合理的。但会在某些场景中发生策略冲突,例如AFL中为代码覆盖率设计的effector_ map会跳过产生新堆操作序列覆盖而未产生新代码覆盖的字节变异。本文用堆操作序列信息升级AFL的effector_ map识别算法,利用MOPT算法来动态调度变异操作,从而平衡代码覆盖率反馈和和堆操作序列反馈信息。
<font size=4.5>实验总结</font>
本文实现了方案的原型系统HTFuzz,在14个真实应用软件上对比了11个基准模糊测试工作(UAFL、UAFuzz、AFL、Angora、MOPT、PathAFL、Memlock、Ankou、TortoiseFuzz的mem模式、AFL-sensitive的2种实现)。结果表明HTFuzz优于相关对比基准模糊测试工具。另外,HTFuzz发现了37个新的0day漏洞并获取37个CVE编号,包括32个时序类堆内存漏洞和5个其他类型的漏洞。HTFuzz中三方面改进的消融实验数据,即:堆操作序列反馈机制AFL-S、指针别名追踪机制AFL-SP和堆操作序列与代码覆盖率协作AFL-SM,如下图表所示。通过对实验数据分析可以发现,三方面的改进是提升HTFuzz漏洞挖掘效果和效率的关键因素。
论文还有许多不足之处,欢迎大家交流讨论:
作者介绍
余媛萍,中科院软件所博士,主要研究方向为程序分析、模糊测试和漏洞挖掘与分析。