软件安全漏洞挖掘技术的研究
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
软件安全漏洞挖掘技术的研究
柳淑玉;孔维广
【摘要】本文首先通过对软件安全漏洞发掘相关技术的研究和分析,针对静态分析和动态分析的优缺点,提出一套比较实用的软件安全漏洞挖掘技术,然后使用该技术对自编的overflow-strepy.exe和no-loop-overflow-strepy.exe两个实际应用程序进行检测,准确的检测出了程序中的漏洞.
【期刊名称】《山东纺织经济》
【年(卷),期】2010(000)005
【总页数】3页(P107-109)
【关键词】软件安全;静态分析;动态检测;漏洞挖掘
【作者】柳淑玉;孔维广
【作者单位】武汉科技学院计算机科学学院,湖北武汉,430073;武汉科技学院计算机科学学院,湖北武汉,430073
【正文语种】中文
【中图分类】TP309
1 引言
近年来,黑客攻击事件层出不穷,蠕虫在Internet上的泛滥,信息安全问题越来越受到人们的重视。
研究发现,相当数量的安全问题都是由软件自身的安全漏洞引起的。
恶意的攻击者可以利用这些安全漏洞提升权限,访问未授权资源,甚至破坏
敏感数据,因此如何发现软件中的安全漏洞,并对其进行修复,极大程度地降低软件安全带来的风险,已经成为信息安全领域的一个重要研究内容。
2 现有的漏洞挖掘技术
漏洞也叫系统脆弱性,是计算机系统在软件和协议的设计与实现过程中或系统安全策略上存在的缺陷和不足。
漏洞的存在本身并不能对系统安全造成什么损害,而在于攻击者可以利用这些漏洞引发安全事件。
因此,漏洞的发掘也显得尤为重要。
当前,我们对软件安全漏洞的挖掘可以分为对已知漏洞的检测和对未知漏洞的补救两个部分。
已知漏洞的检测主要是通过安全扫描技术,发现系统是否存在已公布的安全漏洞,而未知漏洞补救的目的在于发现软件系统中可能存在但尚未发现的漏洞。
现有的漏洞检测技术主要有安全扫描、手工分析、静态分析和动态检测。
到目前为止,安全扫描技术已经比较成熟,而手工分析要求安全分析人员既对软件安全漏洞的原理有深入的了解,同时还要熟悉软件本身的结构和功能。
即使软件开发人员懂得软件安全漏洞检测技术,手工进行漏洞检测仍然是一件非常费时耗力的事情,所以本文只对静态分析和动态检测做详细的描述。
2.1 静态分析
静态的漏洞检测技术不需要程序运行,可以在没有输入的情况下就能分析出程序中可能存在的安全漏洞,所以静态检测在程序编写的阶段就可以进行,将溢出漏洞消灭在开发早期。
但是静态分析存在一定程度的误报。
静态分析的本质是建立程序的一个状态模型,然后分析程序是如何在这些状态之间转换的。
但一个程序的所有可能状态空间非常大,同时考虑所有的状态往往是不可能的。
因此,静态分析会对程序的状态空间进行抽象,这样的处理会丢掉程序的部分信息,为了使得静态分析结果仍然具有可靠性,要求无论抽象状态的值是什么,分析的结果还应该是正确的。
这样要求的直接结果就是分析精度的损失,并且近似假设的地方越多,精度损失得就越大,误报的情况也越多。
当分析工具采取了不稳妥的分析策略时,舍掉一些可
能存在的情况,那么分析结果就可能会漏掉一些安全漏洞。
漏报会使得这些隐藏在软件中的漏洞日后产生极大的危险。
2.2 动态检测
动态检测技术是在程序动态运行过程中测试软件存在的漏洞,它需要被测目标编译成可执行程序或对软件的发布版本直接检测,同时程序运行时的输入也须一并提供。
动态检测的基本的原理就是通过操作系统提供的资源监视接口和调试接口获取运行时目标程序的运行状态和运行数据。
目前常用的动态检查方法主要有环境错误注入法和数据流分析法。
环境错误注入法是在软件运行的环境中故意注入人为的错误,并验证程序对所注入的错误的反应。
程序员在编程时总是假设认为他们的程序会在正常环境中正常地运行。
当这些假设成立时,他们的程序当然是正确运行的。
但是,由于作为共享资源的环境,常常被其它主体所影响,尤其是恶意的用户,这样,程序员的假设就可能是不正确的。
程序是否能够容忍环境中的错误是影响程序健壮性的一个关键问题。
环境错误注入法是验证计算机和软件系统容错性和可靠性的一种有效方法。
错误被注入到环境中,这样就可以检测程序是否能够容忍环境中的错误,也就是在测试过程中干扰软件运行的环境,检测在干扰情况下程序是否能正常运行,是否会出现安全问题。
用环境错误注入法估计软件中潜藏的安全漏洞数目ET的基本原理是在测试之前,由专人在程序中人工注入M个错误。
经过一段时间的测试,发现了m个注入的错误,另外还发现了n个原有的错误。
如果可以认为测试方案发现注入错误和发现
原有错误的能力相同,则能够估计出程序中原有错误的总数为:ET=(n/m)×M。
数据流分析法在检测过程中需要获得执行流(调用序列)、数据流等信息,其工作原理主要是对调用序列和函数传递的参数以及返回值进行跟踪,通过对比分析,从而判断是否存在安全漏洞。
3 动态和静态检测方法对比
目前,我们采用的检测方法主要是静态分析和动态检测。
静态分析缺乏运行时数据,缺乏动态的测试过程以及细粒度的安全评估,并不能确定所有的安全漏洞,而且在检测漏洞的方面并不是很准确和完善。
但是静态分析的优势在于容易集成于开发过程中,例如编译器中,使软件在开发过程中就可以发现一些潜在的安全隐患。
动态检测的精确性和结果的可信性虽然很高,可是依然没有完全摆脱源代码需求,而且无法准确的对漏洞进行定位以及获知漏洞产生的原因,而且对代码的覆盖率也难以保证。
对静态和动态检测方法的比较如表1所示。
表1 动态与静态检测方法比较?
4 软件安全漏洞挖掘模型及流程
通过上述动态和静态检测方法对比的分析,可以知道,各种检测方法都有其优点和缺点,我们所要提出的这套漏洞挖掘模型会将各种不同的检测方法运用到漏洞挖掘的不同环节,针对不同情况使用不同的方法和策略,充分发挥各方法的优势,弥补各自的不足,以便更快更准地检测出软件中存在的安全漏洞。
整个漏洞挖掘模型及流程如图1所示。
漏洞挖掘实现的流程如下:
4.1 初始化。
对软件类型进行分类,确定针对开源软件或非开源软件使用不同的静态分析方法。
4.2 反汇编。
将待分析的程序载入IDA Pro进行反汇编操作,对非开源软件即二进制代码完成反汇编,以确定程序中的二进制代码中哪些字节是可执行指令、哪些是数据。
图1 漏洞挖掘流程
4.3 过程抽象。
可执行指令已经被识别后,将其分割为表示过程(或函数)的组,源代码可以直接识别相继过程的入口点,虽然二进制程序没有任何标识过程开始和
结束的构造,但通过IDA Pro反汇编工具可以有效的分析过程地入口点和出口点。
4.4 特征模式扫描。
针对开源软件的静态分析,使用编译技术在代码扫描或者编译期间确定相关的判断信息,然后根据这些信息对特定的漏洞模型进行检查;而针对非开源软件的静态分析,使用自下而上的分析方法,对二进制文件中的库函数调用、循环操作等做检查,给出漏洞验证代码。
4.5 漏洞特性验证。
通过给出的疑似漏洞验证代码与漏洞特征库的比较,初步确定程序中是否含有恶意行为,并给出检测报告。
4.6 注入错误环境。
构造待注入的错误环境数据,对程序的运行进行干扰。
4.7 动态检测。
系统将根据构造错误环境数据自动地分析程序所有函数序列和特定函数序列,估算出程序中可能存在的漏洞数目,并给出检测报告。
4.8 检测评估。
根据动态检测和特性验证后给出的检测报告信息,对动态检测报告和静态检测报告共同提出的疑似漏洞进行确认,对各自列出的疑似漏洞进行进一步的分析。
4.9 进入新一轮的静态检测和动态检测环节。
5 试验结果及分析
以上原型系统已在IDA Pro平台上实现。
为考查本文检测方法对实际应用程序的
检测能力,我们选择了自编的overflow-strepy.exe和no-loop-overflow-strepy.exe两个实际的程序进行了测试。
overflow-strepy.exe为一个存有缓冲区溢出漏洞和循环错误漏洞的程序,no-loop-overflow-strepy.exe为一个不存在缓冲区溢出漏洞,也不含有循环调用结构的程序。
测试结果如表2所示。
表2 实际程序的测试数据
通过以上对比分析,可确认以上系统分析得出的结论是准确有效的。
这证明该系统可以较好地完成软件的漏洞发掘工作,能够对危险函数的调用进行有效的检测,并可以对可能存在的安全漏洞给出比较准确的检测报告,在一定程度上实现了漏洞发
掘的自动化。
但是这套漏洞挖掘技术还存在一定的不足,比如没有完全实现错误引擎的自动化,而是借鉴的FIVT原型系统。
而且该系统仅针对一些存在典型软件漏洞的自编程序进行了测试,验证了系统的有效性,但针对复杂应用软件的测试涉及较少,这将需要我们以后做更多的工作来完善这套系统。
6 结束语
随着信息技术的不断发展,人们对计算机系统的安全性越来越重视,软件安全漏洞发掘作为一种预先发现软件安全漏洞,保证信息安全的技术也将越来越受到人们的重视。
当前,随着各种安全漏洞、编程语言和目标软件的多样化,以及漏洞发掘的复杂性,对软件安全漏洞发掘技术的要求会越来越高。
我们相信,通过不断的比较和改进,人们一定会提出一种或几种更有效的漏洞发掘技术,帮助安全分析人员更具针对性地寻找、分析、发现未知的漏洞,达到防患于未然的目的。
◆
【相关文献】
[1]徐良华,孙玉屈,高丰,朱鲁华.基于逆向工程的漏洞挖掘技术[J].微计算机信息,2006;(24):259-261.
[2]李建平.C++程序安全漏洞及检测方法的研究[D]:[硕士学位论文].西安科技大学,2004.
[3]白哥乐,宫云战,杨朝红.基于源码分析的软件安全测试工具综述[C].第五届中国测试学术会议,2008.
[4]蒋剑琴,罗宏,曾庆凯.程序缺陷分析与安全保护技术研究[J].计算机应用与软件,2007;24(l):19-23.
[5]王雨晨.系统漏洞原理与常见攻击方法[J].计算机工程与应用,2001,(3):62-63.
[6]蒋宗礼,姜守许.形式语言与自动机理论[M].北京:清华大学出版社,2003.。