软件安全性检测技术综述

2014-10-20 22:49侯海燕符志鹏
电脑知识与技术 2014年25期
关键词:功能测试

侯海燕 符志鹏

摘要:该文阐述了网络软件安全检测的重要性,介绍了现有的主要检测方法,包括形式化安全测试、基于模型的安全功能测试、语法测试、基于故障注入的安全测试、基于属性的测试、模糊测试、基于风险的安全性测试、基于故障树的安全性测试以及基于渗透的安全性测试。

关键词:安全性检测;功能测试;漏洞测试;安全测试方法

中图分类号:TP393 文献标识码:A 文章编号:1009-3044(2014)25-5847-05

Survey of Software Security Test Technology

HOU Hai-yan, FU Zhi-peng

(College of Medical Technology and Engineering, Henan University of Science and Technology, Luoyang 471000, China)

Abstract: The importance of software security test is described in this paper and the main software security test method is introduced such as model based method, Grammar-based method, Syntax-based method, defects threat tree modeling method and so on.

Key words: security test; functional test; vulnerability test; security test method

在互联网普及之前,单机应用程序软件安全问题并不突出。但是自从互联网普及后,软件安全问题愈加显加突显,使得软件安全性测试的重要性上升到一个前所未有的高度。同时,随着软件的广泛应用和其规模、复杂度的不断提高,软件安全性问题日益突出。软件安全性测试是保证软件安全和质量、降低软件安全风险的重要手段。

软件安全性测试分为安全功能测试(Security Functional Testing)和安全漏洞测试(Security Vulnerability Testing)两个方面,如表1所示。

表1 安全功能测试和安全漏洞测试

1 软件安全测试的主要方法

1.1 形式化安全测试

建立软件的数学模型,利用形式化规格说明语言对其进行说明[1],形式规格说明语言主要包括以下几类[2]:

基于模型的Z、VDM和B语言;

基于有限状态语言,如有限状态自动机、SDI;

代数语言,如OBJ;

基于行为的CSP、CCS、Petri Nets等语言;

混合语言,如离散和连续数学的规格说明语言;

状态图

形式化安全测试方法分为定理证明和模型检测两类,如表2所示。

表2 形式化安全测试方法分类

[定理证明\&模型检测\&将程序转换为逻辑公式,然后使用公理和规则证明程序是否是一个合法的定理\&运用状态迁移系统描述软件行为,运用时序逻辑、计算树逻辑等表示软件执行所必须满足的性质,通过自动搜索迁移系统中不满足公式或逻辑的状态来发现软件漏洞\&]

形式化安全测试的特点是数学基础完备,对系统理解深入。但,开发成本高,维护困难。

1.2 基于模型的安全功能测试

基于模型的安全性测试是通过对软件的行为和结构进行建模,生成测试模型,继而由测试模型生成测试用例,当前主要的软件测试模型有马尔科夫模型、有限状态自动机模型、UML模型[3,4]等。

Nahid Shahmehri等[5]提出一种基于模型的方法,用以检测和跟踪运行中的软件所存在的漏洞,这是一种被动测试技术。开发者可以很容易的确切的知道工具所针对的漏洞类型,并且当新的漏洞被发现时可以通过添加新的方法将工具进行扩展。

检测模型是基于安全目标模型SGMs的,它可以显示产生漏洞的潜在原因,以及各种原因之间的相互关系。SGMs和威胁树模型非常类似,后者是将引发某种威胁的所有因素用树状结构描述,前者则是将引起漏洞的所有可能原因用树状结构描述。

Mark Blackburn等[6]提出一种基于模型的软件安全自动检测方法,该方法提供了一种端对端的模型构造、分析、自动测试用例生成、自动执行测试以及结果分析的综合技术手段,该方法适用于各种环境。该检测方法的基础是对安全函数说明进行建模,利用Oracle和Interbase数据库引擎自动生成模型并进行测试。

1.3 语法测试

所谓语法就是定义了软件接受的输入的数据类型和格式。语法测试是根据被测软件的功能接口的语法生成测试输入,检测被测软件对各类输入的响应,通过观察被测软件输入与相应之间的关系做出安全性分析[7]。其流程如下:

语法测试适合对组件进行黑盒测试[8],根据组件接口的语法特征,正则表达可以产生正常和非正常输入,进而触发各种安全问题。但是其缺点是测试样例的数量巨大,很难保证测试覆盖全面性。

Patrice Godefroid等[9]研究了输入结构复杂应用程序,利用基于语法的方法对非法输入进行描述,以提高白盒测试的效果,提出了一种新的动态测试用例生成算法。

1.4 基于故障注入的安全测试

用户输入、文件系统、环境变量、网络接口等应用程序与环境之间的交互引起的故障均可作为注入的故障。人为主动的将故障引入系统,可以加速系统失效,同时也加速了对安全问题进行排查。具体的方法包括仿真注入、硬件注入、软件注入等。

Binbin Qu等[10]提出了一种基于客户机-服务器模式的错误注入测试方法,用于软件组件的安全性测试。作者设计了了一种基于API Hooking的错误注入工具,该工具GCDEFI是基于客户机-服务器模式的,由一个服务端和多个客户组成。服务器控制客户机,收集反馈信息并与客户机交互;客户机管理API拦截、错误信息和目标组件信息。客户机注入到测试驱动,处于驱动的地址范围。GCDEFI运行后,控制器从用户得到错误类型信息,该信息被保存在客户机的错误管理模块。控制器触发Activator,将目标组件信息送入目标组件信息管理器。每当API被拦截,调用者的信息将被获取,我们查找堆栈和目标组件列表,看是否有匹配的组件,如果没有就返回,如果有就进入替代代码,进而执行注入的错误。客户机中的替代函数可以与服务器通信。该工具通用性不好,只在特定的环境对特定的组件具有较好的检测效果。

Jinfu Chen[11]设计了一种典型的COM组件安全性测试工具——CSTS,该工具具有获取并分析COM组件、静态分析组件漏洞、自动生成测试脚本、生成测试驱动、注入环境错误、引导组建运行,记录安全隐患并写入日志、安全评级等功能。测试流程如下:

A.创建测试工程

B.选择测试组件

C.分析接口信息

D.生成测试文件

E.编译测试装置

F.运行测试驱动

G.引导运行过程

H.注入环境错误

I.开始错误注入测试

J.结束并保存

但是该方法的风险评级标准并不明确,有待于进一步细化和明确。

1.5 基于属性的测试

基于属性的安全测试方法[12]是将确定的程序编写规则进行编码,将其作为安全属性,以此为依据验证程序代码是否符合规则。

1.6 模糊测试

模糊测试是一种基于黑盒的随机性测试,通过随机地变异正常的程序输入进而检测程序响应,以发现软件中存在的漏洞,可用语法规则生成正常输入,也可用试探法指导输入变量的产生。模糊测试的最大问题在于代码覆盖率很低。

Patrice Godefroid等[13]提出了一种白盒模糊测试方法,这种方法受动态测试用例生成方法和象征性执行方法的启发:

A.记录程序在正常状态下的运行情况;

B.标记程序运行轨迹、收集输入的限制条件;

C.将限制条件逐一取消产生新输入,执行不同控制路径;

D.在启发式高代码覆盖率方法的辅助下重复上述过程,完成测试过程。

该方法的不足之处在于有限的样本尺寸限制了代码覆盖率。

1.7基于风险的安全性测试

风险即错误发生的可能性以及造成的危害程度。基于风险的安全测试的出发点和依据是软件安全风险,把风险分析与管理、安全测试以及软件开发过程系统化。该方法具有在软件开发的各个阶段可以把有风险的安全漏洞考虑在内,将安全测试与软件开发同步进行的优点[14]。

Brad Arkin、Gary McGraw等人[15]研究了基于风险的安全测试方法,在软件开发的各个阶段进行异常场景、误用模式、风险分析以及渗透测试等,其实质是将安全测试相关过程集成到软件开发的整个生命周期中。

1.8 基于故障树的安全性测试

基于故障树的安全测试技术[16-20]是利用故障分析树和故障树来生成安全性测试用例的方法,故障树(威胁树)[21]实际上是一种将系统故障(威胁)形成原因由上到下柱层细化的过程。

Huang Song[22,23]等选择了CERT/CC的TOP 10瑕疵用来建立威胁树以生成测试序列。

1.8.1 威胁树

威胁树由威胁节点构成,根节点为待检测瑕疵,将其向下分解,生成子节点(即须要实现父节点的必要步骤),子节点继续向下分解直到无可分解)。节点分与节点和或节点两种,如图2所示。

图2 节点类型

以SQL注入为例,其威胁树和测试序列生成方法如下:

1.8.2 威胁树生成方法

A.选择一种典型瑕疵(待测瑕疵)作为根节点;

B.分析该节点,并将其作为父节点,将其所对应的所有情况作为子节点;标记父节点位与节点或者或节点;

C.分解子节点;

D.重复A-C,直到无可分解。

1.8.3 生成测试序列

图3为SQL的注入威胁树,其中SQL injection为与节点,其五个子节点为与关系,其中第四个节点为或节点,则其子节点为或关系。其测试序列为:a-b-c-e-d和a-b-c-f-d。

目前该方法还是手动进行的,工作量较大,需要设计自动化的方法才有更大的应用价值。

1.9基于渗透的安全性测试

这是一种评估网络安全性和主机系统的模拟攻击过程,安全工程师可以通过这种方式深入探测目标的安全性。渗透测试分两类:被动攻击和主动攻击,被动攻击不直接进入目标系统,而主动攻击则要直接侵入目标系统。渗透测试步骤[24]如下所示:

Shu Xiao[25]等设计了一种用于网络协议安全测试的解决方案,建立了一套完整的协议代码健壮性评估环境。该环境的核心测试系统包括多功能测试引擎和PDU(协议数据单元)生成工具两部分。

其中测试引擎工作流程为,首先由预定义资源或者命令行参数来决定内部功能模块的属性,这些内部功能模块包括发送接收模块、反馈模块、测试样本库模块;然后,发送模块从测试样本库获取一个测试样本,发送给指定的后处理单元(TCP/UDP或IP套接字),数据被封装;之后封装的数据传递给虚拟网络接口,由它发送给特定的目的单元。与此同时,发送模块还会通知接收单元接收同步响应消息,并将其放入响应池,然后接收模块调用反馈模块分析返回包,根据其做出相应的修正,来决定下一个测试样本。如此循环,如图3所示。

PDU(协议数据单元)生成工具由Perl编写,可以由PDU模版获取规则,由此而生成所有的测试样本。该系统在发现一般软件漏洞以及对于网络协议漏洞引起的问题的异常处理是十分有效的。适用于现代网络产业环境中的自动检测。该系统也支持同步接口错误注入。作为一种非传统测试方法,有助于生产更安全的软件产品。

该方法具有较大的局限性,仅对TCP/IP协议漏洞检测有效,对于其他的协议和网络通讯软件的测试还无能为力。

Csaba Nagy[26]等提出的基于输入相关错误的静态安全性分析方法是基于这样一个思想:输入数据是沿着一定的路径传递的,而错误可以出现在任何地方,但是当错误出现在该路径上,它就会成为一个安全漏洞。该方法的步骤如下:

A.找到数据输入点

B.得到程序中的输入点集

C.列出危险(输入相关函数)函数列表

D.自动检测

该方法技术上采用了程序依存图和系统依存图来进行分析,通过输入覆盖指标和输入距离指标来衡量数据距离原始输入的距离以及输入相关函数得到输入的位置,这两个指标可以告诉我们哪些函数是和用户输入相关的。得到这些函数后就可以进行自动错误检测了。

1.10其他分类方法

此外,根据测试对象的不同,软件安全测试还可分为应用程序安全测试、操作系统安全测试、数据库安全测试、IIS服务器安全测试、网络环境安全测试。具体如表3所示:

2 总结

软件安全测试的实现有诸多的困难,需要测试工程师拥有高效的工具,丰富的经验、全面的技能,这是一个相互联系的整体。丰富的经验包括对软件安全漏洞,以及各种黑客攻击手段的充分了解;全面的技能包括掌握编程、网络、数据库等知识;在此基础上方能开发出高效的软件安全测试工具。

参考文献:

[1] 魏怀鉴,鲍皖苏. 形式化方法和测试技术及其在安全中的应用[J].微计算机信息, 2006, 22(11): 55-57.

[2] Chen H, Wagner D. MOPS: an infrastructure for examining security properties of software[C]//Proceedings of the 9th ACM conference on Computer and communications security. ACM, 2002: 235-244.

[3] Lodderstedt T, Basin D, Doser J. SecureUML: A UML-based modeling language for model-driven security[M]//? UML? 2002—The Unified Modeling Language. Springer Berlin Heidelberg, 2002: 426-441.

[4] Sheng Q Z, Benatallah B. ContextUML: a UML-based modeling language for model-driven development of context-aware web services[C]//Mobile Business, 2005. ICMB 2005. International Conference on. IEEE, 2005: 206-212.

[5] Shahmehri N, Mammar A, Montes de Oca E, et al. An advanced approach for modeling and detecting software vulnerabilities[J]. Information and Software Technology, 2012, 54(9): 997-1013.

[6] Blackburn M, Busser R, Nauman A, et al. Model-based approach to security test automation[J]. Proccedings of Quality Week 2001, 2001.

[7] Godefroid P, Kiezun A, Levin M Y. Grammar-based whitebox fuzzing[C]//ACM SIGPLAN Notices. ACM, 2008, 43(6): 206-215.

[8] Tal O, Knight S, Dean T. Syntax-based Vulnerability Testing of Frame-based Network Protocols[C]//PST. 2004: 155-160.

[9] Godefroid P, Kiezun A, Levin M Y. Grammar-based whitebox fuzzing[C]//ACM SIGPLAN Notices. ACM, 2008, 43(6): 206-215.

[10] Qu B, Huang Y, Xie X, et al. A Developed Dynamic Environment Fault Injection Tool for Component Security Testing[C]//Secure Software Integration and Reliability Improvement, 2009. SSIRI 2009. Third IEEE International Conference on. IEEE, 2009: 417-422.

[11] Chen J, Lu Y, Xie X. CSTS: A Prototype Tool for Testing COM Component Security[C]//Hybrid Intelligent Systems, 2009. HIS'09. Ninth International Conference on. IEEE, 2009, 3: 83-88.

[12] Fink G, Bishop M. Property-based testing: a new approach to testing for assurance[J]. ACM SIGSOFT Software Engineering Notes, 1997, 22(4): 74-80.

[13] Godefroid P, Levin M Y, Molnar D A. Automated Whitebox Fuzz Testing[C]//NDSS. 2008, 8: 151-166.

[14] 张泽华,饶若楠,凌君逸.基于风险测试揭错能力分析[J]. 计算机工程, 2004, 30(B12): 72-73.

[15] Brad Arkin, Scott Stender, Gary McGraw: Software Penetration Testing. IEEE Security & Privacy, 2005, 3(1): 84-87.

[16] Myers G J, Sandler C, Badgett T. The art of software testing[M]. John Wiley & Sons, 2011.

[17] Tsipenyuk K, Chess B, McGraw G. Seven pernicious kingdoms: A taxonomy of software security errors[J]. Security & Privacy, IEEE, 2005, 3(6): 81-84.

[18] Firesmith D. Specifying reusable security requirements[J]. Journal of Object Technology, 2004, 3(1): 61-75.

[19]Nancy R, Mead G M G. A portal for software security[J]. IEEE Computer society IEEE Security & Privacy, 2005.

[20] Moberg F. Security analysis of an information system using an attack tree-based methodology[J]. Master's

[21] C.A. Ericson II, Fault tree analysis — a history, in: Proceedings of the 17th International System Safety Conference, 1999.

[22] Song H, Liang W, Changyou Z, et al. A software security testing method based on typical defects[C]//Computer Application and System Modeling (ICCASM), 2010 International Conference on. IEEE, 2010, 5: V5-150-V5-153.

[23] Huang S, Hui Z W, Wang L, et al. A Case Study of Software Security Test Based On Defects Threat Tree Modeling[C]//Multimedia Information Networking and Security (MINES), 2010 International Conference on. IEEE, 2010: 362-365.

[24] 唐秀存,杜德慧.渗透测试技术与模型研究[J].计算机与信息技术,2007(5):33-35.

[25] Xiao S, Deng L, Li S, et al. Integrated tcp/ip protocol software testing for vulnerability detection[C]//Computer Networks and Mobile Computing, 2003. ICCNMC 2003. 2003 International Conference on. IEEE, 2003: 311-319.

[26] Nagy C, Mancoridis S. Static security analysis based on input-related software faults[C]//Software Maintenance and Reengineering, 2009. CSMR'09. 13th European Conference on. IEEE, 2009: 37-46.

猜你喜欢
功能测试
某内花键等速传动轴八功能测试夹具设计
轿车门锁控制继电器的研究探讨
基于C#的小型蛋糕店交易系统设计与实现
电子线路自动测试技术
基于.NET的维汉居民信息管理系统测试研究
人事薪资管理系统软件测试方案研究
民用飞机机载电子硬件测试策略研究
功能测试系统开发平台设计
电网调度自动化系统的检测方法