基于Fuzzing的文件格式漏洞挖掘技术
计 算 机 工 程 第 36 卷 第16期
Vol.36 No.16 Computer Engineering · 安全技术 ·
文章编号:1000—3428(2010)16—00151—
文献标识码:A
2010年8月
August2010
中图分类号:TP391
基于Fuzzing的文件格式漏洞挖掘技术
唐彰国,钟明全,李焕洲,张 健
(四川师范大学网络与通信技术研究所,成都 610066)
摘 要:软件漏洞挖掘已成为信息安全研究的一个热点,基于此,分析现有漏洞挖掘工具的不足,阐述基于Fuzzing的漏洞挖掘与分析的功能需求,根据文件格式结构化存储的特征,给出一种启发式的畸形数据的构造方法,设计并实现文件型漏洞智能挖掘与分析系统,给出软件结构、运行机制和关键技术。实例测试结果表明,该系统有效提高了文件漏洞挖掘的效率和智能化水平。 关键词:Fuzzing技术;文件格式漏洞;漏洞挖掘
File Format Vulnerability discovering Exploiting Technique Based on
Fuzzing
TANG Zhang-guo, ZHONG Ming-quan, LI Huan-zhou, ZHANG Jian
(Institute of Computer Network and Communication Technology, Sichuan Normal University, Chengdu 610066)
【Abstract】The discoveringexploiting of the software vulnerabilities is a hotspot of information security research. The shortage of current vulnerability discoveringexploiting implements is analyzed. The function demands of vulnerability discoveringexploiting and analysis based on Fuzzing are emphasized. A heuristic construction of abnormality data based on structural storage characteristic is proposed. The file format vulnerability intelligent discoveringexploiting and analysis system are designed and developed. The system’s software structure and run mechanism and critical technology are given. Experimental result proves its effectiveness and intelligence. 【Keywords】fuzzingFuzzingtechnology;fileformatvulnerability;vulnerabilitydiscoveringexploiting
1 概述
近年来,利用软件漏洞尤其是文件型漏洞在未授权的情况下对计算机系统进行访问或破坏的现象越来越严重。文件型漏洞是指应用程序处理不同格式的文件时由于设计上的缺陷,可能演变成为对系统产生威胁的安全漏洞。作为隐患发现技术之一的漏洞挖掘与分析技术,越来越受到重视。
Fuzzing是一种有效的自动化漏洞挖掘技术。其原理是通过向软件外部接口发送一些随机的组合数据和代码,致使目标软件发生异常,进而发现漏洞。由于这些数据和代码不需要理解和满足目标软件的上下文逻辑关系,因此采用Fuzzing技术能够实现漏洞挖掘与分析的自动化[1-2]。传统文件格式的Fuzzing工具(如FileFuzz)存在的不足主要表现为挖掘效率低、异常信息少、无相关分析、依赖第三方样本等。尤其是随着文档规模的增大、文件安全检测以及过滤机制的完善,对文件格式不公开的复合文档通过构造随机数据进行暴力Fuzzing测试的效率和成功率都相当低[3]。因此,如何自行构造““个性化””的样本文件、如何改进畸形数据的构造方法、如,以及何构造能够穿透软件过滤机制的测试文件,使其到达程序执行的代码区并引发程序的出错和异常处理,是目前解决文件格式漏洞挖掘效率低下和提升挖掘智能化水平的关键。
如图1所示,样本文件可以是文本文件、二进制文件或其他非公开格式的复合文档。已知的高风险文件有注册表等系统缺省文件、媒体文件、办公文档和配置文件等。一种类型文件可能存在多个Fuzzing目标,如二进制文件可分别测试其头部区和数据区。通过对文件进行广度和深度2个层面的二进制变异形成测试数据并供目标程序执行,同时监视异常,根据异常时输出的信息进行分析并确定其可利用性。
图1 Fuzzing流程
2.2 功能需求
根据研究目的分类主要有挖掘未知漏洞、分析已知漏洞和精确触发特定漏洞。为有效满足上述目的,必须支持““个
基金项目:四川师范大学科学研究基金资助项目;四川省应用基础研究基金资助项目(07JY029-011);四川省教育厅基金资助项目(08ZA043);四川师范大学科学研究基金资助项目校科学研究基金资助项目
作者简介:唐彰国(1978-),男,讲师、硕士,主研方向:信息安全;钟明全,讲师、硕士;李焕洲,副教授、博士;张 健,讲师、 博士
收稿日期:2010-03-18 E-mail:[email protected] —151—
传统漏洞挖掘和分析技术过度依赖于个人的经验和直
觉。漏洞研究要走向自动化和智能化一个关键步骤在于正确分析系统的安全需求,用安全需求来指明漏洞挖掘和分析的方向。
2.1 基于Fuzzing的文件格式漏洞挖掘流程
2 文件格式漏洞挖掘的需求分析文件格式漏洞挖掘与分析的需求分析
性化””的定向挖掘方案。
(1)构造样本文件:提供多样化的样本文件构造方式,样本文件可以为任意格式。
1)选取第三方样本:可选取任意格式文件进行测试,以挖掘未知漏洞为目的。
2)自行构造正常格式样本:自行构造包含特定对象和内容的““个性化””样本文件,以挖掘、分析特定类型漏洞为目的。
3)自行构造半有效格式样本:根据新近发布的漏洞描述信息,精确构造出能触发特定漏洞的POC(Proof Of Concept)样本,以精确触发特定漏洞为目的。
(2)文件结构分析及样本对象定位:为改善Fuzzing构造畸形数据的盲目性,需要在Fuzzing之前输出样本文件的结构信息,如根对象、目录结构、流结构、页面集等,以及各种对象如文本、表格、图片等的相对位置,从而使用户可以有选择性、针对性地进行特定地址范围的Fuzzing,从而缩小Fuzzing所需的状态空间,提高挖掘效率。
(3)Fuzzing引擎:
1)生成测试文件:基于二进制修改的文件变异,覆盖该样本文件的特定部分以及保存修改变异后的文件。
2)异常检测与分析:逐个把测试文件部署到应用程序中,然后进行监视,反馈异常信息并生成异常类型的判定。
(4)辅助分析功能:提供复合文档的格式介绍和历年文件型漏洞信息的查询。该功能也可作为后期人工分析的一个 向导。
3 文件格式漏洞智能挖掘与分析系统
3.1 系统架构及流程
系统的整体架构如图2所示,主要包含5个模块:构造样本文件模块,文件结构信息提取模块,启发式畸形数据构造模块,异常检测与分析模块以及辅助分析模块。其中,样本库提供各类样本文件,方便用户直接测试。素材库提供构造“个性化”样本文件所需的图片、文本等素材以及Perl语言模版。文档库包括各类文件格式介绍、历年漏洞信息、帮助文档等。异常文件副本库保存了在Fuzzing过程中有异常的文件作为后期重现、分析和利用漏洞的依据。
—152
— 图2 系统方案的整体架构设计图
系统有3个入口,即选择第三方样本、创建正常格式样本和创建半有效样本。运行流程如图3所示。
图3 系统运行流程
3.2 关键技术
由于各种格式差异较大,限于篇幅这里仅给出针对PDF文件格式的技术方案。
3.2.1 构造样本文件构造模块
构造时须明确PDF文件的格式、对象和逻辑结构,详见文献[4]。
(1)正常样本文件构造
PDFlib库封装了创建PDF的相关API函数,在使用该库时,需要将PDFlib.lib、PDFlib.h、PDFlib.dll这三3个文件放在工程目录下。作者把这种构造方式称之为基于模板的构造。利用PDFLib库构造PDF样本文件的一个最简单的流程如下:
1)利用PDF_new( )新建一个PDFlib文档对象。
2)调用PDF_begin_document( )方法开始建立PDF文档,并调用PDF_begin_page_ext( )文档添加一个新页面。
3)调用PDF_setfont( )设置当前字体。
4)调用PDF_load_image( )等方法向PDF文档添加内容。 5)调用PDF_end_page_ext( )和PDF_end_document( )完成页面并输出PDF文档。
(2)半有效样本文件构造
与正常样本文件构造不同的是半有效样本文件构造主要目的是精确触发特定漏洞,因此不需要构造与特定漏洞无关的PDF内容。为了高效和精悍,使用Perl语言把PDF的文件结构信息及准备填充的数据写入脚本文件中,通过perl语言解析器生成半有效的PDF文件。称这种方式为基于格式的内容填充构造。部分核心代码示例如下:
my $size =
my $factor =
my $data =
sub pdf(); //子函数,设置PDF文件格式并装载内容 {
…//文件头、文件体、引用表和文件尾 }
3.2.2 文件结构信息提取模块
该模块主要对所选取或自行构造的PDF样本进行结构级剖析,提取重要的文档对象信息,以图表和树形结构表现出来,帮助用户精确的地定位样本文件的内部结构及位置信息,为畸形数据构造模块传递启发式所需的参数。具体的实现的关键步骤为如下:
(1)打开PDF样本文件并读取其中的内容。 (2)替换PDF文件内容中的空字符。 (3)查找交叉引用表位置。
(4)查找所有目标对象,显示对象位置信息。
(5)查找Root和Info,
遍历根对象,提取引用号和对象号,显示文档结构信息。
3.2.3 启发式的畸形数据的构造模块
本模块提供3种模式的畸形数据构造,根据变异畸形数据的范围分为文件级、结构级、功能函数级。其中后2种模式称之为启发式方法。
文件级模式支持对整个文件地址空间的任意位置、任意数据的修改,适合做无目的的暴力测试。结构级模式根据文件结构信息提取模块已经得到树状结构显示的文件目录结构和流结构、得到文件各种对象的起止位置后,基于这些结果启发式的地对每个节点数据和对象数据进行随机的二进制变异。如可以针对头部区、校验区以及数据区等进行定向的Fuzzing。功能函数级模式主要用于触发新近发布的漏洞,能提供较前2种模式更精确的定位。其原理是通过控制文档中的数据来改变程序流程使之到达软件的特定功能函数模块。为了灵活性,本模式提供Perl语言模版。触发不同漏洞时可基于本模版进行二次开发,这个过程需要具备对某种文件格式的深入认识,能根据发布漏洞的描述信息,结合具体的文件格式,在一个确定的功能函数处理对象处进行二进制变异以精确触发并再现特定的漏洞。如23.2.1节中的实例代码就可用来准确触发Adobe Acrobat和Reader JBIG2图形处理堆溢出漏洞。
3.2.4 异常检测与分析模块
由于畸形数据构造模块可能会生成大量的测试文件,为了提高测试效率,该模块采用多线程方式通过Windows提供的调试接口以调试方式启动应用程序,将待测的文档作为参数传递给应用程序进程,实时接收并响应应用程序进程的调试事件,当接收的调试事件为访问异常等错误时,记录异常信息并分析找出有价值的异常,作为重现、判定及利用该异常的依据。
(1)异常信息获取:有4种方式,一是即可视化的异常,如错误消息、蓝屏等。;二是事件记录,包括操作系统错误记
录和应用程序错误记录。;三是调试态API记录。
;四是返回代码。
(2)异常的类型:根据经验,比较有价值且经常出现的异常,主要有指针异常、指令非法(如除0错误)、数据访问异常、内存访问错误、系统API调用错误等。
(3)异常可利用性分析:出错时线程上下文,出错的内存地址,寄存器值和堆栈数据,当前指令和后续指令的反汇编代码,程序的返回值及其他环境变量的值。
(4)漏洞类型判定:包括栈溢出、堆溢出、整数溢出、逻辑错误(如MS06-001)、格式化字符串以及竞争条件等。
4 测试及结果分析
测试对象为一个2009年3月公布的PDF文件格式漏洞:
—153
—
Adobe Acrobat和Reader JBIG2图形处理堆溢出漏洞,CVE编号为CVE-2009-0193[5]。
测试过程为:首先构造样本文件模块,通过选取素材库中的二进制图片在空白模版上构造了一个最简单的含JBIG2编码流对象的正常文档,通过文件结构信息提取模块直观地得到了该文档各种对象的结构和起止位置信息,单击JBIG2流对象所在的块后其起止位置作为参数自动传递给畸形数据构造模块,从而启发式地底生成了相应数量的测试文档,导入异常检测与分析引擎后,得到了大量的出错文档。其中一份测试文档(177.pdf)是把原正常文档中0xb1处的0x30改写为0x47导致程序崩溃,获取到的异常信息如图4所示,包括了出错的内存地址、出错指令和寄存器值等信息,分析引擎将此定位为内存虚拟地址的违规访问,并且EIP寄存器中的值包含了来自于用户提供的输入和内存的数据,说明堆栈中的返回地址已经被修改,这是异常可以被利用的典型特征,由此判定为堆溢出漏洞。利用avast、卡巴斯基等杀毒软件对所有的测试文档进行扫描后,显示177.pdf文档存在漏洞,并提示为相应CVE漏洞的利用代码,如图5所示。
图4 本文系统的测试结果
—154
—
图45 杀毒软件报警信息测试结果
图5 杀毒软件报警信息
在以上测试中,本系统所捕获到异常的语句、内存位置及寄存器信息都与漏洞公告上的信息完全一致,漏洞的分析和类型的判定也与杀毒软件相同,这表明本系统具备有效的未知漏洞挖掘能力和已知漏洞的再现能力。
5 结束语
文件格式型漏洞发现的复杂性和漏洞利用的严重破坏性使得漏洞自动挖掘与分析成为了信息安全领域的一个研究热点。本文就如何有效提高文件格式漏洞挖掘的效率和智能化水平做了一些探讨。未来的工作如下:(1)针对畸形数据构造的要求,进一步研究通用文档的自动生成方法。(2);鉴于漏洞的可利用性目前很难形式化的描述,如何进一步提高异常信息的捕获以及异常信息的归纳、分析能力也是下一步研究的重点。
(下转第160页)参考文献
[1] Oehlert P. Violating Assumptions with Fuzzing[J]. IEEE Security &
Privacy, 2005, 3(2): 58-62.
[2] 刘 坤. 结合逆向工程和fuzzFuzz技术的Windows软件漏洞挖
掘模型研究[J]. 成都信息工程学院学报, 2008, 23(2): 178-181. [3] 任春钰, 舒 辉, 瞿 进. 一种改进的针对复合文档的Fuzz测试
技术[J]. 计算机应用, 2008, 28(2): 535-537.
[4] Adobe Systems Inc. PDF Reference [EB/OL]. Adobe Systems Inc.
[2008-04-15]. http:// www.adobe.com/devnet/pdf/pdfs/ PDF Reference13.pdf.
[5] CVE. CVE安全公告[EB/OL]. CVE Editorial Board. [2009-03-24].
http://cve.mitre.org/cve/index.htmlhttp://cve.mitre.org/ cve/index.html.
编辑 任吉慧