APP下载

基于Fuzzing技术的可信软件栈穿透性测试*

2016-04-20李金亮高文静

计算机与数字工程 2016年3期

李金亮 高文静

(91404部队93分队 秦皇岛 066001)



基于Fuzzing技术的可信软件栈穿透性测试*

李金亮高文静

(91404部队93分队秦皇岛066001)

摘要利用Fuzzing技术对可信软件栈(TSS)进行软件代码脆弱性以及安全漏洞测试,通过故障注入、畸形数据构造以及异常行为捕获,发现了TSS软件代码中的安全缺陷,根据TSS的系统结构与具体机制,设计并实现了相关测试原型系统,对TSS软件产品进行了测试,实验结果表明:TSS软件产品并不完全符合可信规范的要求,TSS中的若干API功能函数中存在可被利用的安全漏洞。

关键词Fuzzing技术; 可信软件栈; 穿透性测试

Penetration Testing for TCG Software Stack Based on Fuzzing Technology

LI JinliangGAO Wenjing

(Unit 93, No. 91404 Troops of PLA, Qinhuangdao066001)

AbstractFuzzing testing technology is utilized to find security faults and codes vulnerability for TCG software stack(TSS). By using fault injection, abnormal data structure and capture abnormal behavior, security flaws in TSS are found in this paper. According to TSS’ structure and specification, the relevant test prototype system is designed and implemented to test some kinds of TSS products. Experiment results show that TSS products do not fully comply with the requirements of specification, there are some vulnerability in API functions of TSS.

Key WordsFuzzing technology, TCG software stack, penetration testing

Class NumberTP309

1引言

可信计算已经成为国际信息安全领域的新热潮。可信软件栈(TCG Software Stack,TSS)是可信计算平台的重要组成部分,可信计算产品应符合可信计算规范的要求。从安全测评的角度出发,应通过标准符合性测试、安全穿透性测试和漏洞扫描测试等测试手段对TSS进行安全测评,以检测TSS系统中是否存在已知、公开的安全漏洞[1]。

在安全穿透性测试方面,除文献[2]发现了部分安全缺陷外,文献[3]将白盒源代码审核和Fuzzing技术相结合,发现OpenTC项目中的TSS存在若干程序Bug以及可能造成远程溢出的安全漏洞。

本文以国内外TSS为穿透性测试对象,利用Fuzzing技术检查产品代码中是否存在安全漏洞,从而发现软件代码中的安全缺陷。通过对相关TSS产品的实验测评,给出TSS安全性评估的量化测试结果,并且发现API(Application Programming Interface)接口函数中存在的若干安全漏洞。

2技术背景

目前国内外较常见以及成熟的穿透性测试技术,主要包括静态分析、补丁分析、Fuzzing技术[4]与动态调试技术。这四种技术分别从静态和动态的角度,对被测软件进行针对性的测试与分析,从而有效地发现软件中存在的各种安全漏洞。

Fuzzing技术是一种自动化的软件黑盒测试技术,它使用大量半有效的随机数据作为软件程序的输入,通过程序的崩溃和异常等特征,从而寻找其中的安全漏洞[5]。对于结构封闭的、不开放源代码的安全硬件和软件系统而言,Fuzzing的黑盒测试技术具有更实际的应用价值。即使是普遍认为的高可信的设备(如ATM取款机),也可能由于边界条件的违背,健壮性受到破坏并被成功利用。Fuzzing技术最初是用于测试Unix操作系统及其上应用软件的稳定性[6];在后继的研究中,Fuzzing技术用于测试X Windows、Windows NT和Mac OS X等系统上应用软件中的安全漏洞[7~8]。目前,Fuzzing技术已经成为工业界最为常用的安全漏洞检测技术,主要利用该技术测试各种文档处理软件以及网络协议软件。安全测试人员也将其作为安全产品发布前的最后一道测试环节。

Fuzzing技术研究的两个关键问题,一是脆弱性测试点以及观察点的选取,如何在对测试对象深入分析的基础上,选取薄弱环节利用构造的测试数据,更有效地引发程序中的安全漏洞;二是半有效畸形数据的构造,如何在原有正常数据的基础上,结合漏洞类型相关的测试逻辑进行变异,变异后的畸形数据既能通过待测程序的输入检查,又能引发相应类型的安全漏洞。此外,已有研究人员对多种漏洞挖掘技术的结合进行了有益的探索,文献[9]提出将模型测试和Fuzzing测试相结合,文献[10]提出了演化灰盒Fuzzing的思路。

3基于Fuzzing技术的TSS穿透性测试

3.1故障注入点选取

TSS是一个多层封装的软件系统,其中TSP(Trusted Service Provider)是以动态链接库的形式,向用户应用进程提供API调用函数接口,同时TSP层将用户的API调用以SOAP(Simple Object Access Protocol)数据包的形式,通过TCP/IP协议发送给下面的TCS(Trusted Core Service)层和TDDL(Trusted Device Driver Layer)层。TCS层和TDDL层是以一个唯一的独立守护进程的形式执行,可以接收来自于本地或是远程主机的TSP层发送的数据,经过内部处理后,再由TPM(Trusted Platform Module)驱动下传给TPM处理,最终处理后的结果同样以SOAP数据包的形式返回给TSP层,最终由TSP层将结果返回给用户进程。

为拦截正常的数据处理流程,并且分别针对TSP层和TCS层的API函数进行测试,穿透性测试最终选择两个故障注入的最佳测试点,一个位于用户层,拦截用户进程对TSP中API函数的调用请求,使用程序代码插桩技术;另一个位于网络层,拦截TSP层到TCS层的SOAP数据包,使用Socket数据包过滤技术。TSS的整体数据处理流程与故障注入点的选取如图1所示。

图1 TSS数据处理流程与故障注入点

数据拦截以及故障注入的具体流程如下:

1) 在这两个故障注入点完成数据的实时拦截。 2) 将数据转发给特定的Fuzzing测试程序。 3) 由该测试程序完成数据的解析,并且根据漏洞特征测试算法对其中关键的数据段进行畸形数据的变异,最后仍按正常数据的语法格式重新封装。 4) 封装后的数据回传至拦截点,并沿原流程继续处理。

3.2畸形测试数据构造

在Fuzzing测试中,畸形测试数据的构造也是一个重要内容。变异后数据既要求通过待测函数的输入检查,从而进入函数代码内部检查脆弱点;又要求与利用特定漏洞特征测试算法,尽可能有效地触发潜在的安全漏洞。

为简化讨论,算法假定拦截的数据中只包含一个数据缓冲区变量,而实际上算法也可同时处理多个数据缓冲区变量,从而提高测试的效率。但还有一种较为复杂的情况是,多个缓冲区变量之间可能存在依赖关系。例如,当缓冲区A不包含特定值时,缓冲区B的溢出漏洞就不会被发现。例如,在对某类网络数据包进行Fuzzing测试实现时,发现了这样一个现象,当数据包的属性字段并非“message/external-body”时,数据包的内容字段就不会被解析处理,从而也无法发现相应接收函数的缓冲区溢出漏洞。

因此,数据构造模块在对测试数据进行畸形构造前,需要首先利用收集到的通信数据的结构描述信息,对拦截到的数据进行正常解析。一方面识别需要构造的字段或变量,并且明确字段或变量间的依赖关系;另一方面需要维持其它字段或变量的稳定,利用这些“不变量”保证变异后的数据可以通过待测函数的语法检查。在根据相应的漏洞测试算法对数据进行变异后,再根据结构描述信息进行重新的组合。数据构造模块的处理流程如图2所示。

图2 畸形数据构造流程

图3 API函数输入数据结构描述

在测试的具体实施中,各待测API函数的输入数据结构描述信息从规范的定义中提取,采用XML(eXtensible Markup Language)格式记录其中的变量声明、类型定义以及需要进行构造的变量或字段。采用这种方法可以方便地对测试数据进行解析和重组,图3为TSS中的其中某个API函数的输入数据结构的描述信息。

3.3异常捕获与分析

在明确了故障注入点和数据构造方法后,就可着手针对TSS进行穿透性测试实验与分析。测试的根本目的是发现软件中存在的安全漏洞,而安全漏洞外在最明显的特征就是测试对象的行为异常,在此简化理解为程序的崩溃或报错。错误要求是可重现的,从而便于对漏洞的分析以及调试。虽然针对TSP层和TCS层函数分别进行测试,但是由于两层函数在数据处理上具有关联性,因为在测试TSP层函数时,也需要观察TCS层的运行状况。TSP层和TCS层的运行状况,都是通过管道通信反馈给Fuzzing程序。

TSP层函数的Fuzzing测试流程如图4所示,故障注入通过HOOK的方式插入到正常处理流程中。在图中,失败的测试用例可能对应某种潜在安全漏洞,需要进一步分析与调试。

图4 TSP层Fuzzing测试流程

TCS层函数的Fuzzing测试流程与TSP层的类似,故障注入通过Socket包过滤的方式插入到正常处理流程中。实验中采用了Netfilter机制,因其作为系统自带的内核模块,具有较好的稳定性和可扩展性。

4实验结果与分析

基于以上原理与技术,本文实现了穿透性测试原型系统,并针对某TSS中的TSP层函数和TCS层函数进行测试实验。在测试过程中,共生成14397组测试用例,其中发现错误的测试用例共计63组,测试结果分类统计如表1所示。

表1 穿透性测试结果统计

表2 API函数测试结果统计

从统计数据中可以看出,失败的测试用例只占全部测试用例的0.43%左右。从另一个角度来看,虽然软件错误用例的比重很小,但是发现存在安全漏洞的API函数的意义却很重要。在测试中,发现5个TSP函数和1个TCS函数存在安全漏洞,如表2所示。这表明,即使是TSS这种对安全性要求非常敏感的软件,也不可避免地存在安全漏洞与缺陷。这些安全漏洞可能被攻击者用于进行拒绝服务或远程代码执行等各种类型的攻击。

5结语

TSS的安全测评是对其安全属性的综合评价,利用Fuzzing测试技术检查TSS产品代码中是否存在安全漏洞,发现软件代码中的安全缺陷,是TSS安全属性测评中不可或缺的重要内容。本文利用Fuzzing技术挖掘软件中潜在的安全漏洞与缺陷,对Fuzzing测试环节中的故障注入点、畸形数据构造以及异常行为捕获与分析等关键问题进行研究,分别针对TSP层和TCS层函数制定了不同的Fuzzing测试方案。对某TSS产品实验结果表明:若干API接口函数中存在潜在的安全漏洞,对整个TSS的安全性产生威胁。

下一步的工作将研究如何把符号执行、污点传播与Fuzzing技术相结合的白盒Fuzzing技术,将程序动态分析技术与漏洞挖掘技术相互结合、优势互补,针对种类更加丰富的代码安全缺陷进行检测。

参 考 文 献

[1] ZHANG Huanguo, YAN Fei, FU Jianming, et al. Research on Theory and Key Technology of Trusted Computing Platform Security Testing and Evaluation[J]. Science China: Information Sciences,2010,53(3):434-453.

[2] SADEGHI Ahmad Reza, SELHORST Marcel, STUEBLE Christian, et al. TCG inside?-a Note on TPM Specification Compliance. In First ACM Workshop on Scalable Trusted Computing[C]. New York: ACM Press,2006:47-56.

[3] GERGELY Toth, KOSZEGI Gabor, HORNAK Zoltan. Case Study: Automated Security Testing on the Trusted Computing Platform[C]//Proceedings of the 1st ACM SIGOPS European Workshop on System Security. New York: ACM Press,2008:35-39.

[4] SUTTON Michael, GREENE Adam, AMINI Pedram. Fuzzing: Brute Force Vulnerability Discovery[M]. New Jersey: Addison-Wesley Professional,2007.

[5] PETER Oehlert. Violating Assumptions with Fuzzing[J]. IEEE Security & Privacy,2005,3(2):58-62.

[6] BARTON P. Miller, LOUIS Fredriksen, BRYAN So. An Empirical Study of the Reliability of UNIX Utilities[J]. In Communications of the ACM,1990,33(12):32-44.

[7] JUSTIN E. Forrester, BARTON P. Miller. An Empirical Study of the Robustness of Windows NT Applications Using Random Testing[C]//WSS’00: Proceedings of the 4th conference on USENIX Windows Systems Symposium, Berkeley, CA, USA,2000:6-16.

[8] BARTON P. Miller, GREGORY Cooksey, FREDRICK Moore. An Empirical Study of the Robustness of Macos Applications Using Random Testing[C]//RT’06: Proceeding of the 1st International Workshop on Random Testing, New York, NY, USA,2006:46-54.

[9] WILLIAM H. Allen, CHIN Dou, GERALD A. Marin. A Model-based Approach to the Security Testing of Network Protocol Implementations[C]//Proceedings of 31st IEEE Conference on Local Computer Networks,2006:66-73.

[10] JARED Demott, DR Richard, J Enbody, et al. Revolutionizing the Field of Grey-box Attack Surface Testing with Evolutionary Fuzzing[C]//Blackhat Conference,2007.

中图分类号TP309

DOI:10.3969/j.issn.1672-9722.2016.03.027

作者简介:李金亮,男,工程师,研究方向:指挥控制测试。

收稿日期:2015年9月12日,修回日期:2015年10月25日