基于变异的Fuzzing技术研究
2015-11-01吴金龙欧锋周林甘水滔
吴金龙, 欧锋, 周林, 甘水滔
(江南计算技术研究所,江苏无锡214083)
基于变异的Fuzzing技术研究
吴金龙, 欧锋, 周林, 甘水滔
(江南计算技术研究所,江苏无锡214083)
近年来,随着计算机和网络技术的广泛应用和发展,对应其安全问题也日益明显。软件作为计算机的基本应用,其安全性尤为重要。本文重点介绍基于数据变异的Fuzzing检测技术,用于检测已知格式的文件解析类应用软件的脆弱性自动分析,并对Peach开源测试框架中该检测技术部分进行改进,进而高效地检测此类应用软件的安全性。
软件安全;Fuzzing;文件格式;数据变异
0 引言
软件作为计算机的基本应用和网络通信的基础载体,软件的安全性直接关乎计算机和网络的安全,软件的漏洞和脆弱性常作为黑客入侵计算机和网络的直接手段,也是极为高效的一种手段,国家互联网安全威胁2015年01月的报告指出[1],1月份,发现736个漏洞,高危漏洞213个,可利用实施远程攻击漏洞657个。分析提取软件漏洞,发现软件的脆弱性不仅可以为攻击者提供0-day攻击[2],成为攻击者的有力手段,更为己方更好的安全防护提供重要保障。在分析软件脆弱性时,Fuzzing技术是一种快速并且有效的方式,Fuzzing技术能够自动识别出二进制文件中的安全问题[3]。这为软件安全检测问题提供了一种高效智能的解决方案。
早期的测试以手工方式为主,测试技术主要分为黑盒测试、白盒测试以及灰盒测试。随着技术的发展,自动化测试技术逐渐成熟。许多Fuzzing自动化测试工具和框架也替代了手工测试。以Peach[4]等为代表的智能Fuzzing测试工具,根据对测试程序的分析、理解,利用启发式算法、结构化的数据构造描述,能够构造丰富多样的测试数据[8]。测试的原理通常以大小相关的部分、字符串、标志字符串开始或结束的二进制块等为重点,使用边界值附近的值对目标进行测试[16]。相对于现有测试技术而言,Fuzzing测试具有适用范围广、误报率低、原理简单的优点。
本文将主要介绍基于变异的Fuzzing检测技术的基本原理和实现,并通过开源的Fuzzing测试框架——Peach,实现并改进具体数据变异。最后设计实现Peach框架下,基于变异的方法对文件解析类软件的测试,重现部分漏洞。
1 基于变异的Fuzzing检测技术原理
Fuzzing测试数据有不同的生成方式:基于生长的方法和基于变异的方法[5]。基于生长的Fuzzing方法是通过产生随机或启发性数据来填充给定的数据模型,从而生成畸形文件。而基于变异的Fuzzing方法则是在一个给定的样本文件基础上进行修改从而产生畸形文件。其不同方式之间各有优缺点。采用哪种生成方式,应取决于测试的软件对象。
1.1 数据生成方式的选取
由于测试用例的产生机理不同,Fuzzing为了产生有效的畸形数据,需要考虑到测试用例的数据格式、目标程序的结构流程和程序运行的中间状态;而黑盒测试只关心目标程序的外部接口和外部输入,从这个意义上讲,现在的Fuzzing技术更接近于灰盒测试[6]。
对于未知软件的测试,其测试方法主要是黑盒测试,数据的生成一般选取基于生长的方法,随机生成数据进行填充。
对于已知软件和网络协议,测试方法可以采用灰盒测试的方法,其数据生成则选取基于变异的方法,该方法在效率和准确度方面均高于黑盒测试的方法。本文重点介绍此方法。对于已知软件和网络协议,其解析的内容一般为已知格式的文件,如Office系列、pngcheck、搜狗音乐、暴风影音、Bash等软件可以对应解析*. doc、*.png、*.mp3*、*.avi、*.sh等类型文件,对于Bash而言,其解析脚本或者命令行也可以看做是解析以回车或分号作为分隔符的字符串的解析。因而,大部分这类已知软件,其解析的原理在于这类文件有固定的格式,其头尾等固定区域会划分成不同的块,各个块有其各自的意义,或者以特定的符号作为划分,解析被划分的各个区块。因而,这类软件如根据文件格式和其固定的区域的值来解析文件。以格式较为简单的png图片格式[7]为例:
一个PNG文件最前面是8字节的PNG签名,十六进制值为:89 50 4E 47 0D 0A 1A 0A。随后是若干个数据块。每个数据块的格式如表1所示:
表1 png图片单个数据块的格式
1.2 基干变异的数据生成方法的原理
根据上文的介绍,可以将已知文件的格式或命令行参数划分不同的数据块,记Y为正常文件,X1,…,Xn为各数据块,则
由公式不难看出,文件Y由各个数据块Xi组成,因而文件Y是否能被解析取决于其每个数据块Xi的正确性。对于一个解析Y的软件,测试其安全性就可以分为以下步骤:
1)生成每个数据块Xi的变异数据块Xi';
2)将一个或多个Xi'填充对应的第i个区块,得到新的畸形文件Y';
3)将畸形文件Y'送入软件进行解析,并监视软件是否抛出异常;
4)N次重复步骤1-3,记录并分析软件产生的错误信息,得出软件脆弱性结论。一般N是生成的测试例的个数,也作为部分自动化测试工具中运行的轮数。
1.3 变异数据自动化生成
对于上述过程,通常采用自动化生成方式。本文是基于Peach测试框架下,自动生成变异数据。首先简单介绍下Peach测试框架。Peach是一款优秀的开源Smart Fuzz工具,它支持两种文件Fuzzing方法:基于生长(Generation Based)和基于变异(Mutation Based)。其特色之一便是模块化处理,通过DataModel[12]、StateModel[13]、Agent[14]等模块控制整个测试[15]。
Peach将可以获得的目标文件的格式和运行方式等信息以XML的格式表示,这种方式只需要知道文件中部分格式即可,同时可以优选的对其中部分数据块数据设置变异选项,从而充分发挥了测试用例生成方法的优点,提高测试效率的同时扩大目标软件的应用范围[16]。
2004年,Michael Eddington团队用Python语言编写的Peach V1.0框架问世,2013年,该团队用C#重写了Peach V3.0[9],其功能和性能有了极大的改进,使得该工具在软件测试领域具有较高的知名度。本文的数据变异生成实验环境为:64位英文版Ubuntu14.04的操作系统,Peach版本为V3.1.122。
在使用Peach这个框架进行模糊测试的时候,必须对目标文件的数据结构进行定义,这种给目标文件定义数据结构的文件叫做Peach Pit文件[10]而Peach Pit使用的是XML(Extensible Markup Language)来定义数据结构的[11]。
1.4 常见的生成方法
本节,我们以Peach测试框架为例,探讨基于变异的生成方法如何生成数据。
对于测试目标而言,Peach框架提供了多种基于变异的生成方式,曲型的生成方式包括了对数组、数据块、字符串、标识位等常见的可能触发解析程序异常的格式区域进行数据变异。下面列出几个曲型的变异生成方法,如表2所示。
表2 常见的几种变异方法
2 生成方法的改进
由上一节的介绍不难发现,Peach的配置生成变异数据的过程,对所有的数据变异方式并没有太大区别。针对此情况,提出以下改进:
1)针对不同类型的软件,建立和维护不同的数据变异的特征库,将目前常见的漏洞加入对应的特征库。比如,对于Bash软件和解析png的display软件,其数据输入结构不同,若采用相同的数据变异方法,其检测率和效率均较低。因而可以建立对应的特征库,比如构造已有的Bash“破壳漏洞”[18],添加至Shell类软件的测试特征库;构建display、pngcheck等png文件解析软件已有漏洞,添加至图片解析类软件的测试特征库。
2)借助开源优势,添加字曲接口。比如对于字符串的变异,人为构造字曲,产生一些特殊字符串,如2048长的字符串、中文字符等,而非软件自动生成随机数据或者简单的变换;对于运算和标志位的变异,人为构造除零操作等可能触发异常的运算加入字曲。
3)在变异过程中添加反馈和自学习。对于一款需要深度挖掘脆弱性的软件,尤其需要将机器学习和人工智能结合,在变异的过程中,根据统计结果和日志,添加反馈和自学习机制,这样的优点在于可以减少生成造成相同高频错误的测试例,提高软件运行效率。
3 实验与分析
本章主要通过实验演示在实际测试过程中,自动化测试工具是如何根据文件的结构生成配置文件,进行数据变异生成畸形文件,进而测试被测软件脆弱性这一过程。由于Peach官网及相关爱好者提供了部分对已知格式文件的测试例,如:png、wav等格式的pit文件,可供读者参考,因而,本次实验主要展示基于命令行输入方式的数据变异。实验对Linux系统下软件“gif2png”的脆弱性分析,该软件的功能是实现gif转png,存在漏洞CVE 2009 -5018[17]。该工具可以通过命令行读取参数,实验重点在于重现该软件的漏洞。
3.1 CVE 2009-5018漏洞介绍
该漏洞发布于2009年,版本低于2.5.2的gif2png均存在此漏洞,漏洞类型是越界溢出漏洞,攻击者可以利用此漏洞进行远程溢出攻击,执行任意二进制应用。其描述如图1:
图1 CVE 2009-5018漏洞描述
图1给出的其溢出测试代码为:
$./gif2png$(perl-e'print"A"x 1053')
实验发现,在1.3节介绍的真实测试环境下,该漏洞的实际触发条件是:参数的字符串长度超过1020,与官方公布的触发条件:字符串长度为1053,略有不同。
3.2 命令行参数Fuzzing的配置
用Peach框架重现该漏洞,通过简单介绍Peach测试框架生成变异数据流程中的关链步骤,以抛砖引玉,为读者快速了解和使用Peach提供参考。
首先,根据漏洞描述,需要构造命令行输入参数的畸形数据,由于作者所查询的资料中没有Peach对命令行参数的Fuzzing介绍。因而,这里简单介绍下对命令行输入参数产生畸形数据的部分配置过程,这里需要变异的内容仅相当于是已知格式中的某一个区块,因而DataModel模块只需配置命令行中命令后面需要输入的畸形参数即可。
此外,需要配置Agent模块参数,添加监视器,将DataModel产生的畸形数据写入脚本中。该模块通过执行脚本实现命令和畸形参数的结合。
对于PeachPit其他模块的配置和如何运行,这里不再赘述。
3.3 结果与分析
由漏洞描述,可以先手工重现漏洞,并与工具重现的进行对比,以确保工具重现漏洞的正确性。实验发现,通过Peach框架测试能快速多次重现该漏洞。为了更好的呈现实验结果,并方便读者验证,在实验多次的基础上,取定随机种子,限定运行轮数为1。
./peach-seed=30880-range 3,3 pit.xml
产生畸形数据后,触发漏洞,造成了缓冲区溢出错误,如图2。
图2 重现溢出错误
系统防止缓冲区溢出,为了保护堆栈信息,向程序发出SIGTERM信号,程序被迫中止进程,如图3。
图3 程序中止
3.4 优化后的对比
选取2个软件共5个漏洞进行对比实验,分别是BashShock系列漏洞和上述实验中的gif2png漏洞进行测试。对于这5个漏洞的检测情况进行横向对比,测试时间为5小时。
表3 两种框架对5个漏洞的检测
由实验结果可知,原始框架对BashShock系列漏洞无法检测,改进的框架,由于有特征库及字曲,对部分的BashShock漏洞有较好的检测。
接下来对同一个漏洞,从相同时间内重现漏洞的次数进行统计分析,以测试两种框架之间的性能,选取表3中均能检测的漏洞CVE 2009-5018,用相同的随机种子,运行相同的时间,记录结果,统计如图4。
图4 同一漏洞重现次数的对比
4 结语
本文以软件的脆弱性在网络安全和软件安全中的重要性作为牵引,引出了自动化测试的Fuzzing框架,进而介绍了针对已知格式解析类软件脆弱性分析的方法——基于变异的Fuzzing检测技术。在介绍基于变异的Fuzzing检测技术原理的基础上,归纳了变异数据自动化的生成方法,提出了改进方法,并给出了实例。希望以本文抛砖引玉,在为读者介绍基于变异的Fuzzing检测技术的同时,以具体的测试框架为载体,用命令行输入数据产生变异为例子,具体演示测试的主体流程,以此为读者在实践中提供参考。下一步,作者希望以CVE-2014-7186等未能检测的漏洞未载体,进一步研究改进开源框架,以提高检测率。
[1] 国家计算机网络应急技术处理协调中心.CNCERT互联网安全威胁报告-2015年 1月[EB/OL].(2015-03-06)[2015-04-26].http://www.cert.org.cn/publish/main/upload/File/2015monthly01.pdf.
[2] Peach Fuzzer LLC.Peach Overview Datasheet[EB/OL].[2015-06-03].http://static1.squarespace.com/static/ 54e67620e4b06d2d7213f95f/t/552c4627e4b08f10b637a23a/ 1428964903836/Peach+Overview-Peach+Fuzzer-Datasheet-2015.pdf.
[3] 史记,曾昭龙,杨从保等.Fuzzing测试技术综述[J].信息网络安全,2014(03):87-91.
[4] Peach Fuzzer LLC.Peach Fuzzer[EB/OL][2015-06-03]. http://peachfuzzer.com/.
[5] Michael Sutton,Adam Greene,Pedram Amini.Fuzzing:Brute Force Vulnerability Discovery[M].1 Edition.Addison-Wesley,2007:22.
[6] 吴志勇,王红川,孙乐昌等.Fuzzing技术综述[J].计算机应用研究,2010,27(03):829-832.
[7] W3C.Portable Network Graphics(PNG)Specification(Second Edition)[EB/OL].(2003-11-10)[2015-06-03].http://www.w3.org/TR/PNG/.
[8] 欧阳永基,魏强,王清贤等.基于异常分布导向的智能Fuzzing方法[J].电子与信息学报,2015,37(01):143-149.
[9] ZHANG Hua,ZHANG Zhao,TANG Wen.Improve Peach:Making Network Protocol Fuzz Testing More Precisely Mechan-ics and Materials[J].Applied Mechanics and Materials.2014,551(05):642-647.
[10] Sutton M,Greene A,Amini P等.模糊测试强制性安全漏洞发掘[M].黄陇,于丽丽,李虎译.机械工业出版社,2009.
[11] 丁迪,薛质.基于Peach的模糊测试样本变异策略研究[J]信息安全与通信保密,2014(11):144-147.
[12] Dejavu Security.Data Modeling[EB/OL].(2014-02-23)[2015-06-03].http://community.peachfuzzer.com/v3/ DataModeling.html.
[13] Dejavu Security.State Modeling[EB/OL].(2014-02-23)[2015-06-03].http://community.peachfuzzer.com/v3/ StateModel.html.
[14] Dejavu Security.Agents[EB/OL].(2014-02-23)[2015-06 -03].Agenthttp://community.peachfuzzer.com/v3/ Agent.html.
[15] CAI Jun,MEN Jin-quan,YANG Shang-fei,HE Jun.Automatic Software Vulnerability Detection based on Guided Deep Fuzzing[C]//Software Engineering and Service Science (ICSESS),2014 5th IEEE International Conference on.Beijing:IEEE,2014:231-234.
[16] 于璐,沈毅.Fuzzing测试中样本优化算法的分析与改进[J].计算机安全,2011(04):17-20.
[17] Securityfocus.gif2png Remote Buffer Overflow Vulnerability [EB/OL].(2011-01-14)[2015-06-03].http://www.securityfocus.com/bid/41801/info.
[18] The MITRE Corporation.CVE-2014-6271[EB/OL].U.S:Department of Homeland Security,2014[2015-06-03]. www.cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2014-6271.
Fuzzing Technology based on Variation
WU Jin-Long,OU Feng,ZHOU Lin,GAN Shui-tao
(Jiangnan Institute of Computing Technology,Wuxi Jiangsu 214083,China)
Recent years,with the widespread use and development of computer and network technology,the corresponding security issue becomes increasingly acute.Software,is the basic application of computer,and its security is of pariticular importance.This paper mainly describes Fuzzing detection technology based on data variation,which is used to detect the vulnerability autoanalysis of file parsing softwares with known format,and in addition,to modify this detection technology in Peach open source testing frame,thus efficiently detecting the security of this application software.
software security;Fuzzing;file format;data variation
TP311.53
A
1009-8054(2015)10-0118-05
吴金龙(1988—),男,硕士,研究实习员,主要研究方向为软件安全及网络安全;
欧 锋(1976—),男,硕士,高级工程师,主要研究方向为网络安全;
周 林(1986—),男,博士,研究实习员,主要研究方向为软件安全及网络安全;
东水滔(1984—),男,博士,助理工程师,主要研究方向为软件安全。■
2015-05-22