论文题目:ProFuzzer:On-the-fly Input Type Probing for Better Zero-day Vulnerability Discovery(本文为S&P 2019录用论文)
论文作者:Wei You,Xueqiang Wang,Shiqing Ma,Jianjun Huang,Xiangyu Zhang,XiaoFeng Wang,Bin Liang
作者单位:普渡大学,印第安纳大学,中国人民大学
论文地址:https://www.cs.purdue.edu/homes/ma229/papers/SP19.pdf
PPT下载: https://www.inforsec.org/wp/?attachment_id=3808
一、背景
模糊测试(Fuzzing),作为一种有效的漏洞检测技术,被广泛应用于各类软件的安全测试中。现有的基于变异的模糊测试工具,在测试用例生成策略上依然具有较大的盲目性,无法针对目标文件格式和特定漏洞类型进行有效的变异。研究表明,AFL( American Fuzzy Lop, 当前最流行的模糊测试工具)在24小时的测试过程中,超过60%的变异操作集中在不会产生任何新代码路径的无效字节上。如何提升变异策略的有效性是模糊测试领域的热点研究问题。
二、功能
ProFuzzer提出了一种基于运行时类型嗅探的模糊测试技术。它能够自动推测输入域类型信息,并智能适配相应的变异策略,从而提高路径覆盖率和漏洞触发几率。ProFuzzer的系统架构如图1所示,包括四个功能模块:类型嗅探引擎、智能变异引擎、程序执行引擎、漏洞报告引擎。类型嗅探引擎的任务是为目标程序的每个输入文件进行产生一个类型模板,类型模板中包含了输入域的类型信息。智能变异引擎的任务是根据嗅探得到的类型模板,按预先制定的类型策略,对输入文件进行变异。程序执行引擎和漏洞报告引擎复用了AFL的底层部件,分别负责执行目标程序并收集路径覆盖信息,以及观测程序执行状态并报告异常。
图1. ProFuzzer系统架构
三、方法
ProFuzzer的两个核心技术是:运行时类型嗅探和基于类型的智能变异。ProFuzzer中所使用的类型是文件解析类程序通用的数据类型,主要包括:断言、裸数据、枚举、循环计数、偏移、长度。
运行时类型嗅探是一个轻量级的类型分析方案,无需借助动态污点分析等开销巨大的程序分析技术,通过取样分析程序的执行路径推测输入字段的类型。具体而言,在模糊测试过程中,首先对单个字节进行枚举变异,通过分析变异后的执行路径,将相关联的字节组成一个输入域,并根据“变异—执行路径”的不同模式,确定该输入域类型。
基于类型的智能变异以输入域为操作单位,对同一个输入域中的多个字节按预先定义的类型策略进行变异,从而缩小测试用例的搜索空间。类型策略包括:路径探索型策略和漏洞触发型策略。前者尝试在相应类型的合法值域内进行取值,目标是尽可能地覆盖更多的代码路径。后者则尝试选取相应类型的边界值或不合法值,目标是尽可能地触发漏洞。
图2以OpenJPEG的BMP输入文件为例,形象说明ProFuzzer的工作原理。图中,属于同一个输入域的相邻字节被框在了一起,这些字节具有相似的“变异—执行路径”模式。各个输入域按照“变异—执行路径”模式的特征进行分类。(0x1c, 0x1d)是一个枚举类型的输入域,其合法的枚举值是0x1, 0x4, 0x8, 0x10, 0x18, 0x20。路径探索型策略在对该输入域变异时,会将取值范围限定在所有合法的枚举值中。(0x16, 0x19)是一个长度类型的输入域,漏洞触发型策略会尝试各种边界值,例如文件的大小0xe3。
图2. ProFuzzer工作原理示例
四、效果
我们在10款常用开源软件上对ProFuzzer进行了功能验证和性能验证。测试所用的软件涉及图像处理、音频处理、文本处理和压缩处理等多种类型。同时,我们还将ProFuzzer同多款最新的模糊测试工具进行了对比。
ProFuzzer在两个月的部署实施中,挖掘出10款常用开源软件的42个未知安全漏洞,其中30个获得了CVE认证。这些安全漏洞未被其它模糊测试工具挖掘出来,有些漏洞甚至在目标软件中存在长达3年之久。
同其他模糊测试引擎相比,ProFuzzer多覆盖27% ~ 227%的代码路径,少使用53% ~ 79%的时间开销达到其它模糊测试工具的路径覆盖峰值,并且保持较高的有效变异率。
作者简介:
游伟博士,现为中国人民大学副教授。他在中国人民大学获得了博士学位,并在美国印第安纳大学和普渡大学进行博士后研究工作。游伟博士在信息安全和软件工程领域的顶级学术会议(如 CCS,S&P,ICSE)上发表了十余篇论文。他的研究兴趣包括漏洞检测、恶意软件分析、移动安全和Web安全。