刁培金,刘嘉勇
(四川大学电子信息学院,成都 610065)
针对复合文档的漏洞挖掘技术研究
刁培金,刘嘉勇
(四川大学电子信息学院,成都610065)
Fuzzing测试是目前软件漏洞挖掘工作中广泛使用的技术,它通过对样本进行变异并输入到目标程序中监控发生的异常,来挖掘程序的漏洞。但是传统的Fuzzing测试效率低,盲目性比较强,未反馈测试用例的使用情况是否有效、对异常类型的分类比较粗糙,导致后期漏洞分析工作效率较低[1]。本文根据复合文档结构化存储的特征和上述Fuzzing测试中存在的问题,设计了一套原型工具DocuFuzzer,并通过实验证明了该工具在复合文档漏洞挖掘方面的有效性。
复合文档与文件系统的结构类似,它将数据分成许多流,这些流存储在不同的仓库里。每个复合文档都包含一个根仓库。流和仓库的命名规则与文件系统相似,同一个仓库下的流不能重名,不同仓库下可以有同名的流[2-4]。复合文档的结构如图1所示。
所有的流分成更小的数据块,叫做数据扇区(Sectors)。数据扇区包含控制数据或者用户数据。整个文件由一个头结构 (Header)以及其后的所有数据扇区组成。扇区的大小在头部中确定,并且每个sectors的大小都相同。
图1 复合文档结构
以二进制方式打开一个样本,分析其二进制结构,文件的二进制结构如图2所示。
图2 复合文档结构图
(1)复合文档头。每个文件都有一个头部,大小为512字节,包含文档的控制信息。
(2)主扇区配置表。
(3)扇区配置表。
(4)短扇区配置表。
(5)目录结构。目录是一种内部控制流,由一系列目录入口组成。每一个目录入口都指向复合文档的仓库或流。
(6)目录入口。目录入口按照在目录流中出现的顺序列举,一个以0开始的目录入口索引称为目录入口标识。
(7)流结构。流结构包括流的入口、大小以及计算得出的数据流的位置[5]。
我们所知道最早的对Fuzzing的描述是1989年Barton Miller教授使用一个模糊器来测试Unix应用程序的安全性。此后,各种Fuzzing测试工具层出不穷,包括Sully、Zzuf、Peach等一系列具有代表性的测试工具[6]。
Fuzzing测试的思路比较简单:首先准备测试样本,可以通过生成和变异的方式构造测试样本。变异样本的时候可以用“overwrite”和“replace”两种方式修改原始数据。“overwrite”使用畸形数据直接覆盖指定位置的正常数据,不改变样本的大小。“replace”通过搜索特征串进行替换,并可以改变文件的大小,支持正则表达式,可以有针对性地进行数据替换[7]。
然后部署目标程序,指示其加载测试用例,开始执行Fuzzing测试并通过调试器监视异常信息。图3展示了Fuzzing测试的各个步骤[8]:
在Fuzzing的过程中,一个至关紧要的步骤就是对产生的异常进行监视。当异常发生时,保存调试器记录的堆栈、寄存器等信息,保存触发异常的测试样本,分析找出有价值的异常作为重现及利用的依据[9]。
识别异常最好的方法是使用调试器,它既可以识别已处理的异常,也能够识别未处理的异常。调试器可以在每次迭代的过程中监视异常条件,当有异常发生的时候,异常发生的位置和异常线程的前后代码、内存地址、堆栈数据都会被保存下来。根据这些信息可以确定异常的准确位置。出现的异常类型包括拒绝服务、整数溢出、堆溢出和栈溢出、逻辑错误、格式化字符串和竞争条件等。
图3 Fuzzing测试过程
下面使用一段简单的代码描述整数溢出:
上面代码描述了一个导致内存破坏的整数溢出漏洞。如果size被人为赋值为0xFFFFFFFF,则allcation_size的值经过size的值加1操作后将变为0,在代码的第三行将使用malloc()函数分配一个大小为0的内存,buffer指针将指向一个未分配的内存块。在代码第四行和第五行进入循环,把size大小的数据复制到内存块中,从而造成内存破坏。如果人为构造数据可以使覆盖的内存数据能够被使用,则可以获取对应用程序的控制权。
根据上文对Fuzzing测试的描述,其过程可以描述为,其中,表示Fuzzing测试的过程,表示初始样本集,表示Fuzzing所使用的时间,“P”表示目标Fuzzing程序,表示对样本的变异策略[10]。
最后通过人工分析产生的异常,找到产生异常的原因,分析其可利用性。
该漏洞挖掘工具的包括初始化、读取文档结构、生成变异文档、部署目标程序、核心Fuzz测试、异常检测6个模块。其运行过程可以简单描述如图4所示:
图4 Docufuzzer运行过程
初始化模块主要用于初始化DocuFuzzer,包括解析命令行选项并检测DocuFuzzer所依赖的软件是否被正确地安装。
然后读取模块开始解析文档结构。根据上文对复合文档格式的介绍,可以有针对性的构造畸形样本:选取一个正常的复合文档,根据上文对复合文档结构的介绍,定位文件的头部、目录结构以及数据流的位置,根据需要修改某特定位置的数据并保存,生成新的测试样本。而且采用以下几种方法可以提高测试的成功率:
①插入或替换数据的时候,选取临界值、负数、超大值、超小值以及特殊字符。
②用多种方式改变数据,在不改变固定标识的前提下,增加或删除数据块,改变数据块的相对位置。
③在重要的数据区(头部、长度控制区域、CRC32/ 16校验码)处修改数据。
生成测试样本之后,要初始化Process类的实例,将它们部署到目标测试程序中。在目标程序每次测试的过程中,创建一个进程并设置其属性,并设置每个进程运行时间间隔,使进程在达到间隔之后自动销毁。
Fuzzing测试过程中,一个核心的操作是控制目标测试程序使用什么样的畸形数据以及在什么位置对样本进行修改。可以准备一个畸形值数据库,选定文档特定位置使用畸形值进行变异。通常是使用任意长度的任意值,包括二进制数值和字符串。字符串数值可以使用任意字符串,特定字符串。Fuzzing测试中常用的字符串值是"AAAAA",可以导致缓冲区溢出。
异常检测模块也是Fuzzing测试中的一个核心部分。获取异常信息的途径是观察目标程序的崩溃或者查看日志文件,通过时间戳识别输入和输出之间的关联。在Docufuzzer中,使用调试器识别异常。调试器可以识别已发生和未发生的异常,而且,不能直接将调试器关联到目标程序,因为每达到一个时间间隔,目标程序进程会被销毁[11]。笔者在Docufuzzer中使用调试器。所以当执行Fuzzing测试的时候,Docufuzzer可以关联到调试器并销毁目标程序。部分核心代码如下:
上段代码的功能是只要没达到时间间隔,调试器就一直监视异常。
可以看出上述组件分别对应测试前准备、Fuzzing测试中两个阶段,最后通过人工分析异常信息,找出漏洞成因、验证代码以及危害程度。
为证明Docufuzzer在复合文档漏洞挖掘方面的有效性,本节将用实验进行验证。把工具布置在虚拟机上,实验环境:物理机系统Win7,配置为Intel Corei5-5200,2.20GHz,8GB内存,虚拟机为VMware Workstation10.0,系统为WinXP sp3,内存为2GB。
本文使用doc文件类型进行实验,从网络上下载100个doc文件,以金山WPS作为目标程序,应用本工具进行漏洞挖掘工作。实验数据见表1:
表1 样本数据
设置DocuFuzzer的测试时间阈值为500分钟,在配置文件里设置对每个样本变异50次,经过测试,实验数据如表2所示:
表2 异常数量
经过测试,发现生成的异常数大于测试的样本数,为了使数据更加真实,对产生的异常进行人工分析,清除重复异常。
对产生的异常进行分析与分类,得到的数据如表3所示:
表3 异常分类
表4 人工分析结果
高危漏洞指对机密性、完整性和可用性的影响比较严重的漏洞,中危漏洞指对机密性、完整性和可用性的影响相对较轻的漏洞,虽不可被利用但是某些关键数据可被人为控制,低危漏洞指对机密性、完整性和可用性影响基本可以忽略的漏洞,不可利用且关键数据不可控[12]。从表中的数据可以看出,Docufuzzer可以有效挖掘出使用复合文档的程序的漏洞。
将Docufuzzer部署在漏洞挖掘平台中,已发现金山WPS办公软件[13]的3个0day漏洞并提交到国家漏洞库。出于安全性考虑,不在此披露漏洞的细节。
针对目前Fuzzing测试过程中数据完整性校验严重影响了测试效果的问题,以及复合文档的结构化存储的特征,设计了一套原型工具DocuFuzzer,该工具从样本处理、测试策略调整两个层面进行改进与优化,以提高Fuzzing测试的效率。在样本处理方面,本文提出了针对文档格式的数据模型构造畸形样本;在测试策略方面,本文提出一种动态选择元素方法。实验结果表明,本工具在复合文档的漏洞挖掘方面具有较强的实用性。
本文对传统Fuzzing测试技术的不足之处进行了补充,拓展了Fuzzing测试的思路,有助于Fuzzing测试技术的进一步应用和推广。
[1]李红辉,齐佳,刘峰,等.模糊测试技术研究[J].中国科学,2014:44(10):1305-I22
[2]唐彰国,钟明全,李焕洲,张健.基于Fuzzing的文件格式漏洞挖掘技术.计算机工程,2010,16(16):151-153.
[3]任春钰,舒辉,瞿进.一种改进的针对复合文档的Fuzz测试技术[J].计算机应用,2008,28(2):535-537.
[4]高峻,徐志大,李健.针对复合文档的Fuzzing测试技术[J].计算机与数字工程,2008,12(12):116-119.
[5]罗文华.Microsoft复合文档结构电子数据取证分析.信息网络安全,2013,3(03):9-11.
[6]王欣,董国伟,邵帅,朱龙华.基于验证绕过的漏洞Fuzzing测试技术[C].信息安全漏洞分析与风险评估大会,2014.
[7]欧阳永基,魏强,王清贤,尹中旭,等。基于异常分布导向的智能Fuzzing方法.电子与信息学报,2015,01期(1):143-149.
[8]Rebert A,Cha S,Avgerinos T,et al.Optimizing Seed Selection for Fuzzing[C].Proc.23rd USENIX conference on Security Symposium. California,San Diego:USENIX Association,2014:861-875.
[9]熊琦,王婷,彭勇,戴忠华,伊胜伟.工控网络协议Fuzzing测试技术研究进展[C].信息安全漏洞分析与风险评估大会,2013.
[10]马金鑫,张涛,李舟军,张江霄.Fuzzing过程中的若干优化方法研究[C].信息安全漏洞分析与风险评估大会,2015.
[11]MichaelSutton,AdamGreene,PedramAmini.Fuzzing:Brute Force Vulnerability Discovery.
[12]刘奇旭,张翀斌,张玉清,张宝峰.安全漏洞等级划分关键技术研究[J].通信学报,2012,S1(S1):79-87.
[13]WPS.http://www.wps.cn/
Compound Document;Fuzzing Test;Storage Feature;Docufuzzer
Research and Implementation of Vulnerabilities for Compound Document
DIAO Pei-jin,LIU Jia-yong
(College of Electronic Information,Sichuan University,Chengdu 610065)
1007-1423(2016)02-0011-05
10.3969/j.issn.1007-1423.2016.02.003
刁培金(1990-),男,硕士研究生,研究方向为网络通信与网络安全
2015-12-01
2012-12-30
复合文档是一种包含文本、图形、电子表格数据、声音、视频图像以及其他信息的结构化存储的文件类型。由于其被办公软件广泛应用,针对复合文档的攻击技术也越来越多。然而复合文档结构严谨,支持多种编码方式和压缩算法,其复杂的格式导致传统的Fuzzing测试效率低下。针对复合文档的结构化存储的特征,设计一套原型工具DocuFuzzer,并使用该工具对金山WPS进行测试实验,证明该工具确实可以提高测试效率。
复合文档 ;Fuzzing测试;结构化存储;Docufuzzer
刘嘉勇(1962-),男,博士,教授,研究方向为网络通信与网络安全
Compound document is a document type that contains text,graphics,spreadsheet data,voice,video and other information storage structure,since it is widely used office software,attacks against a compound document technology is also increasing.However,compound document structured to support multiple encoding and compression algorithm,which leads to poor form complex traditional Fuzzing test efficiency.According to the structure of the compound document storage feature,designs a prototype tool DocuFuzzer,and uses the tool to test Kingsoft WPS,experiments prove that the tool can indeed improve test efficiency.