漏洞自动挖掘技术研究进展
总第231期2009年第1期
计算机与数字工程
Computer&DigitalEngineering
Vol-37No.1
100
漏洞自动挖掘技术研究进展
高峻徐志大李健
(中南计算机通信研究所武汉430074)
摘要漏洞利用的严重破坏性和漏洞发现的复杂性使漏洞自动挖掘研究成为计算机安全领域所面临的一项亟待解决的课题。在研究漏洞自动挖掘原理及所采用技术与方法的基础上,对已有的研究成果进行了分析和总结,提出了对进一步研究的看法。
关键词
安全漏洞漏洞挖掘软件测试
中图分类号TP309.2
SurveyofAutomaticDiscoveryofSoftwareVulnerability
GaoJun
XUZhida
LiJian
(South—CentralComputerCommunication
Institute,Wuhan
430074)
Abstract
Theseriousdamagebringbyexploitingofvulnerabilityandthecomplexityofvulnerabilitydiscoverymake
to
theautomaticdiscoveryofsoftwarevulnerabilityandmethodsof
be
a
problem
to
beurgentlysolvedincomputer
security.Thetheories
vulnerabilityautomaticdiscovery
are
analyzedand
summarizedinthispaper.Atlast,thefutureresearch
expectationisalsoproposed.
Key
words
securityvulnerability,vulnerabilitydiscovery,softwaretesting
TP309.2
ClassNumber
1
引言
近几年来,利用软件漏洞进行的恶意攻击越来
恰当的配置也可导致漏洞的出现。软件越来越复杂,使得在开发过程中不可避免会产生漏洞。以Microsoft的操作系统软件为例,1995年的Win—dows95有1500万行,2002年的WindowsXP有4000万行,Windows2003安装完成需要2G的空间,而WindowsVista完全安装则要12—13个G的空间。广泛使用的JAVA虚拟机和.NET的
越猖獗,以红色代码、冲击波、震荡波病毒为代表的各种恶意软件给计算机系统造成了严重的破坏。网络及计算机软件存在安全漏洞是导致这些攻击的根本原因,任何一次成功的计算机攻击都可以归根于对目标计算机系统上安全漏洞的一次成功利用,逻辑炸弹、窃听软件、木马软件等破坏性程序都是根据特定的漏洞编制的。开展漏洞挖掘技术研究,找出系统存在的安全隐患,不仅可以及时修补这些安全漏洞,最大程度地降低系统安全的风险,也可以为攻击测试、入侵检测、安全管理和评估等诸多领域的研究提供必要的基础。
软件安全漏洞的产生主要是由于程序员不正确和不安全编程引起的,用户不正确的使用以及不
framework等虚拟JOLJHL制允许执行不可靠的移动
代码,也是漏洞产生的一个重要因素。
漏洞挖掘的研究由来已久,1980年美国密执安大学B.Hebbard小组通过渗透分析方法,成功发现计算机系统程序中的部分漏洞。目前漏洞挖掘和检测工作更是倍受关注,如WINXP操作系统开发过程中使用了ZING模型检测工具进行漏洞检测,安全性有了明显提高。许多组织在漏洞挖掘和利用研究方面做出了大量有价值的工作,国外
-收稿日期:2008年9月11日,修回日期:2008年10月6日
作者简介:高峻,男,博士研究生,助理研究员,研究方向:网络安全。徐志大,男,博士,研究员,研究方向:网络安全。李健,男,硕士研究生,助理研究员,研究方向:网络安全。
万方数据
第37卷(2009)第1期计算机与数字工程
101
black(训佣r.blackhat.corn)和国内的安全焦点(www.XfOCUS.net)就是其中优秀的代表。
2漏洞自动挖掘原理
漏洞挖掘根据漏洞产生原因从安全分析和模拟攻击两个角度去发现软件中可能存在的漏洞,理论基础是软件测试方法,实践基础是漏洞研究人员的经验。自动化漏洞挖掘在总结漏洞挖掘经验的基础上,设计和实现程序自动定位和发现目标软件中的漏洞,理想目标是自动发现目标软件的所有安全漏洞,以及针对各漏洞的利用程序。目前研究多是用程序辅助发现目标软件中可能存在的安全漏洞的各个疑点,人工判定证实是否为可利用的漏
洞。
对安全漏洞进行分类是漏洞研究的基础,通常把漏洞产生的原因大致分为输入验证错误、缓冲区溢出、设计错误、意外情况处置错误、访问验证错误、配置错误、竞争条件和环境错误等几大类。各类漏洞的实例可在许多漏洞库上看到,围外权威的漏洞发布站点有CVE和ICAT等,国内对漏洞库的建设及研究做得比较好的组织是绿盟科技。
根据拥有测试对象的条件,漏洞挖掘分析可分为白盒分析、黑盒分析和灰盒分析乏类。白盒分析是指拥有测试程序的源代码和设计文档等材料,黑盒分析只能对测试对象执行部分操作和观察其输出结果,灰盒分析拥有的条件介于以上二者之间,拥有反向工程得到的汇编代码。根据挖掘分析对测试对象进行的操作和采用的技术,可以把漏洞挖掘分为静态分析和动态测试两种方法。静态方法不需要运行程序,而动态方法需要运行程序进行调试分析。对具体的测试对象可以分别采用不同的方法,也可以多种分析方法并用。
3漏洞自动挖掘的静态分析方法
3.1静态分析挖掘方法
静态分析不需要执行程序,而是通过对程序的静态分析技巧来获得程序的动态特性和调用信息。与动态分析方法相比,静态分析方法检测花费的时间通常更少。常见的分析方法有:模式匹配、词法语法分析、数据流分析、模型化的分析方法和补丁比较分析方法等。
模式匹配针对程序源代码或二进制反汇编后的代码,依据一定的规则或模式寻找软件漏洞。软件中需要检查的关键Ⅸ域有:没有进行边界检查或
万方数据
进行不正确边界检测的函数、以字符串格式传递参数或使用用户提供的数据作为参数的函数、强制以格式化字符串进行边界检查的函数、使用循环得到用户输入的程序、低级的字节复制操作、在用户缓冲区进行指针运算的程序等。词法语法分析方法依据程序语法进行分析,类似C编泽器构建程序的抽象语法表示,在此基础上进行分析。数据流分析根据程序执行时数据的流向分析判断程序是否存在漏洞。还有人对源代码用标记注释的方法进行研究,分析和寻找其中的漏洞。静态分析的研究日趋成熟,其中对缓冲区溢出的研究尤其较为系统。漏洞挖掘的许多经典方法来自于静态分析技术的研究。
3.2静态分析的形式化模型
3.2.1整数范围限制的挖掘方法
David
Wagner等人提出了整数范围限制的挖
掘方法[1],该方法首先对C语言源代码进行分析,将C字符串看作抽象数据类型,将缓冲区视为整数范围对,包括分配范围和使用范围,根据这两个值产生整数范围限制,将对软件缓冲Ⅸ溢出漏洞的挖掘转换成了对整数范围的追踪问题。3.2.2线性规划模型
David
Chandle等提出了一种利用线性规划检
测缓冲区溢出的方法[2],将每一个特征缓冲区,给出在缓冲区中使用字节的最大值和最小值、缓冲区分配字节的最大值和最小值四种约束变量的模型,每一个整型变量由其最大值和最小值两个约束变量给出模型,操作字符缓冲区或整形变量的程序声明被使用约束变最的线性约束模型化,使用线性规划的理论来挖掘软件漏洞。3.2.3基于执行路径分析的模型
很多系统调用都有可能导致漏洞出现,VinodGanapathy等对逆向工程中,寻找已知有问题的调用进行了研究L3j,执行路径项是一项与安全相关的内容,JanK.Rutkowski对执行路径进行了分析[引,V.BenjaminLivshits等做了路径与内容上下文相关的分析[5]。
3.2.4基于图论理论的模型
利用图形方法进行漏洞挖掘研究,既可以利用图论的成熟理论进行分析,也比较直观,是一种比较常用的重要方法,出现了不少针对程序控制流程图和数据流程图等利用图形进行漏洞分析方法[6~7|。
102
高峻等:漏洞自动挖掘技术研究进展第37卷
3.3基于补丁比较的静态分析方法
软件安全问题被发现后,厂商通常会发布安全公告及补丁文件。补丁文件用于修改原来出现漏洞的部分程序段,所以漏洞出现的地方必定是补丁文件需要修改的地方,这为定位程序中的漏洞提供了帮助,可以通过比较安装补丁前后文件的差异来定位软件中漏洞的位置。3.3.1源码补丁分析
对于开源软件出现的漏洞,厂商发布源码补丁文件,可以通过补丁前后的文本对比定位漏洞的位置。如UNIX操作系统下用DIFF命令对修改漏洞前后的源程序文件进行比较,就得到了源码补丁,用PATCH命令和补丁文件对现有源码进行修改,就可修补漏洞。软件开源似乎成为一种趋势,出现了开放源代码组织,就连Microsoft也开放了其部分源代码,该方法在漏洞挖掘中不可忽视。3.3.2可执行代码补丁分析
非开源软件只提供编译好的二进制补丁文件,可以使用IDAPro等反汇编工具对补丁文件进行反汇编,将二进制文件比较问题转化为文本比较问题。可执行代码补丁比较的困难在于一个补丁可能用于补多个问题,有n,-Dl"丁程序还存在编译器优化,会带来源码修改编译与逆向工程的信息不对称。需要理解程序本质,从函数与指令、结构化比较及语意敏感分析等方面进行深人研究。
Todd
Sabin提出基于指令相似性的图形化比
较方法[8],进行函数对比,将每条指令作为流程图的一个节点,构造流程图并进行化简及合成,然后进行人工分析对比定位漏洞的方法。HalvarFlake提出结构化比较方法Lg],将整个文件作为一个图,函数作为其子图,找到比较起始点,开始比较。不同函数的结构化配比,标识不同函数之间的对应关系。该方法通过函数调用树进行结构化分析对比定位漏洞。
结构化签名与具体平台无关,便于移植,结构化签名不会受到部分编泽器优化的影响,而指令相似性的图形化比较不会漏掉非结构化变动,并且图形化比较相当直观。它们的缺点是:结构化签名对比不能找出非结构化变动,结构化签名相同的函数较多,完全用结构化签名与结构化配比之后有可能导致部分函数无法匹配,上层函数结构化配比错误后的瀑布效应,指令相似性对比受编译器优化困扰,相似图形的化简存在不完全问题。
万方数据
3.4静态检测工具
静态检测工具也有了很大的发展,出现了lint(第一代)、Splint和Lclint(第二代)、ITS4、Flow—finder、RATS和(第三代)等使用广泛的检测工具。
Splint是一种轻量级的检测工具,方法是向程序和标准库的源代码中添加注解,用注解辅助静态分析以快速有效地检测安全漏洞。通过记录为字符串分配的内存空间大小和字符串本身实际占用的内存空间大小来检测可能的缓冲区溢出。
ITS4是Cigital公司的一种交互式的程序漏洞扫描工具,根据Cigital维护的有关安全的静态分析规则数据库(其中对于C和C++分别有550以上的条目),能对C/C++程序的每一个函数进行代码分析,依据危险级别给用户一个提示报告。
Flowfinder是基于Python语言开发的对c/c++程序进行安全检测的丁具,根据自身的漏洞数据库进行扫描。Flowfinder扫描速度快,并且其源程序公开。
RATS也是开放源码的程序安全审计工具,提供了对C、C++、Perl、PHP以及Python语言的漏洞扫描。
静态分析简单方便,不需要实际运行软件,速度往往很快。其缺点有:1)需要维护一个与漏洞有关的不断变化的规则或模式库,对漏洞的判断依赖于该规则的定义,传统的静态分析方法对于安全漏洞的描述能力不足。2)由于程序没有动态运行,分析可能发现实际并不执行的路径,虚假错误的漏洞报告占多数,耗费很多额外的人力、物力去进一步分析审查。3)复杂的分析往往是停机问题,需要进行简化处理,不能保证漏洞发现问题的完全性。
4漏洞挖掘的动态测试方法
漏洞挖掘的动态测试方法包括FUZZ测试、污点传播分析和错误注入等方法。
4.1
FUZZ测试方法
FUZZ测试的概念最早在1989年由Wiscon—
sin大学的BartonMiller教授提出,用于测试UNIX系统应用程序的健壮性,通过产生大量随机字符串和随机键盘鼠标消息,作为软件的输入,监测软件异常来判断是否存在漏洞。其后FUZZ测试的思想被用于针对文件格式、网络协议、浏览器和COM接口等方面,2007年甚至出现了针对杀毒软件的FUZZ测试方法。比较有影响的研究有:2000年Barton等将FUZZ的思想应用到Win—
第37卷(2009)第1期
计算机与数字工程
103
dows
NT系统鲁棒性测试上。2003年Frederic在
BlackHat会议上介绍了针对COM接口的FUZZ
测试方法。2002年美国黑客大会上,DaveAitel演示了名为SPIKE的FUZZING工具,这是一种流传很广的开源工具,可用于文件格式和网络协议等方面。2004年MichalZatewski发布了针对浏览器进行FUZZ测试的工具mangleme。2004年微软发布了MS04—028漏洞公告,出现了File-FUZZING、fFUZZINGer、ufuz3、FUZZINGer等一系列专用于文件格式的FUZZ测试工具。FUZZ测试的缺点是:1)针对具体协议和文件的测试设计需要了解协议和文件格式,开发时间较长,通用性差。2)N试具有较大的盲目性,效率不高。4.2缺陷注入方法
缺陷注入主要通过给软件注入一些缺陷数据,然后判断其能否正常处理,如果出现异常,则表明软件可能存在漏洞。在分析了大量的安全漏洞后,WengliangDu发现90%以上的漏洞是由于应用程序跟缺陷环境(用户输入、文件系统输入、网络输人、进程输人)交互所导致,提出了通过向应用程序动态注入各种异常的数据来发现其中存在漏洞的EAI缺陷注入模型。缺陷注入的缺点:1)需要了解软件的接口信息,修改函数的返回值时需要知道函数接口的详细定义,这些信息不公开时会产生较高的误报率。2)由于测试过程中所注入的缺陷数据没有经过软件的合法性验证,可能在实际环境中并不存在,从而产生误报。4.3污点传播分析方法
污点传播分析是一种在模拟或实际攻击环境中挖掘新漏洞的技术方法[10],也有人利用污点传播原理对程序进行静态分析,把该方法列入静态分析方法。对软件或系统的攻击需要三个基本步骤:通过漏洞植入攻击代码(shellcode),然后改变程序的执行流程,最后让攻击代码执行。动态污点测试中,把产生于非信任源的数据(如来自网络上的数据)标记为污点数据,在程序执行时追踪污点数据的扩散情形,检测到污点数据被以危险的方式使用时就认为有攻击发生,这种方法可以用来检测重写攻击,攻击导致一个敏感的值(如返回地址、函数指针、格式化字符串等)被攻击者的数据改写,污点传播分析的缺点:1)污点数据的使用是否安全的判断依赖于预先定义的安全策略模式,模式定义的不恰当可能引起误报。2)复杂的分析可能是停机问题,也可能发现不可执行的路径而产生误报。
万方数据
4.4动态检测工具
用于动态检测安全漏洞的工具有很多。StackGuard利用了在堆栈上函数的返回地址前放一个canary字的方法,用于动态检测和阻止目标为返回地址的基于栈的缓冲区溢出,通过扩展编译器以防止修改函数的返回地址来实现堆栈保护。
PointGuard能提供对指针完整性的保护,保护所有攻击形式的溢出指针,而不仅限于返回地址。尽管针对返回地址的攻击最为流行,并且不象函数指针和长跳转缓冲区,返回地址总是存在的,但它不是唯一的攻击目标,所以PointGuard适用范围更广。
ProPolice借鉴了StackGuard的主要思想,也使用Canary值检测栈中的攻击。新颖之处在于栈的保护,通过重新安排局域变量分配变量,这样字符缓冲区总是被分配在底部,紧挨着旧的基指针,在那里它们不能被重写用于危害其他的局域变量。
Stack
Shield提供对堆栈中的函数返回地址和
函数指针的保护,对返回地址的保护是通过全局返回地址栈或返回地址范同检查实现,对函数指针的保护通过在所有使用函数指针的函数调用之前增加检查代码实现。
5需要进一步研究的问题
漏洞挖掘方法从人工分析发展到自动发现是该领域研究的必然趋势。许多商业及研究机构,包括对安全漏洞利用和挖掘技术及应用感兴趣的团体或个人,在这方面做了不少工作,提供了一些有用的辅助性工具,但自动化的漏洞挖掘研究仍不成熟,还有大量的研究工作要做。在自动挖掘的进一步研究中,需要解决的问题主要有:漏洞产生规律的深入研究、漏洞自动挖掘时的虚报及漏报问题,以及漏洞挖掘与其他安全措施的智能化集成问题。
漏洞的产生规律是制约自动挖掘的关键因素,需要对漏洞信息做统计分析及数据挖掘做些探索工作,如从海量的漏洞信息中统计分析出关于漏洞在不同平台或者软件中分布的规律、关于漏洞在何种条件下产生的规律、关于漏洞的生命周期演变的规律等。
虚报和漏报问题是评价漏洞挖掘技术方法的重要指标。大量的虚报不仅造成系统管理员过多的无渭劳动,也会引起实际使坩者对漏洞自动挖掘产品的反感,甚至于会弃之不用。对产品化的漏洞挖掘工具来说,这一点至关重要。由于技术的局限,漏洞的漏报是不可避免的。但随着对漏洞成因
104
高峻等:漏洞A动挖掘技术研究进展第37卷
Randal
的认识逐渐深入,应尽量减少漏报量,较多的漏报也会大大降低漏洞挖掘对系统安全的保护作用。为减少虚报和漏报,势必加大在目标软件漏洞挖掘过程中的分析工作量,这就需要对逐步成熟的自动挖掘方法进行优化,提高效率和准确性。
漏洞挖掘的意义在于提供对现有系统的安全保护,目前使用对漏洞的签名方法标识现有的漏洞。适应快速反应的要求,需要将自动化的漏洞挖掘与现有的安全保护措施,如网络安全扫描、入侵检测和安全评估等集成在一起,提供全方位立体的防御体系。
参考文献
[-1]DavidWagne.A
tection
firststeptowards
Thomas
W.Reps,and
E
Bryant]e1.Automatic
DiscoveryofAPPLevelExploits.ACM2005
pathanalysis
[4]Janl(.Rutkowski.Execution[51v.Benjamin
ingPointerstectioninC
Livshitsand
MonicaSLa肌Track—
withPathandContextSensitivityforBugDe-
Programs[cJ.ACM
2003
[61CynthiaPhillips,LauraPaintonSwiler.Agraph-
basedsystemfornetworkvulnerabilityanalysis[C].ACM
1999
[73
KaushiK
Paul
Arnmann,DumindaWijesekera,andSaket
Analysisandverification—Scalable,graph-based
networkvulnerabilityanalysis]C].ACM
2002
withgraphiso-
[8]ToddSabin.Comparingbinaries
morphisms
automatedde—
r9]HalvarFlake.StructuralComparisonofExecutableObjects
ofbuffer
overrun
vulnerabilities
Melski,DavidVitckBuff—
[2]I)avid
er
Chandler,David
]10]JamesNewsome
andDawn
Song.DynamicTaint
OverrunDetectionusingLinearProgrammingandStatic
2003
AnalysisforAutomaticDetection,Analysis,andSignature—GenerationofExploits
on
Analysis[C1.ACM
CommoditySoftware]C].ND,KS
[31VinodGanapathy,SanjitA.Seshia,SomcshJha,
ConferenceProceedings,2004
{!;.吊:世%带出希出希出希也秘坏避缔鸱希出乖出秘2乖出希出尔出乖出乖出秘场池希出帘避绵出乖出术出希出希也不出希出希出≈池i池乖出不起绵彤币出乔延铞也.亭趟f.吊起;.币延5牙{15f:{窖簪{‰.{‰;趟冻
(上接第46页)
件检测(ACE_Reactor),数据解算模块(Data—Calcul—Handler),数据发送模块(Result_Send_Handler)。
ACE
6
结语
本文介绍了AFDX和ACE特点,建立了大气
据系统发送的数据到达中央数据处理系统时,ACE—Reactor会分发给其预先登记的事件处理器。Da—
ta
数据系统的结构,分析了大气数据的计算方法,并且应用ACE中间件框架对大气数据系统进行了设计。对于探索AFDX和ACE在航空电子系统中的实际应用具有一定的参考价值。
参考文献
[1]熊华钢,周贵荣,李峭.机载总线网络及其发展[J].航空学报,2006,6(11):1135~1144
[2]李亮.浅谈航空电子全双工交换式以太网[J].飞机工程,2006,(3):48~62
[31
Douglas
Calcul—Handler派生自ACE.Task,它向ACEReactor分派Data
Handler的Han—
—Reactor登记输入事件。当传感器数据到来时,
ACE
Calcul
die.input挂钩方法创建一个线程完成数据解算任务。Data—Calcul—Handler的svc()在完成数据解算以后,把解算结果放入Result—Send—Handler的队列中(从ACE—Task中继承来的)。接着由Re—sult—Send—Handler创建一个线程完成数据的发送任务。图5说明了上面的交互情况。
C.Schmidt,StephenD.Huston,於春景
l—ACER—eactoq—]Data?ole—ct_liandler]—Res—ult—Sen巫dH囹and回lerI
译.C++网络编程,卷1[M].北京:中国电力出版社
[4]陈凯,胡朝晖.某型航空备用仪表的大气数据系统设计[J].传感技术学报.2006,4(8):1045~1048
[5]胡安平.PCI04在工程中的应用[J].电子产品世界,2002,(8):60~61
[63史利剑,王永生.一种简易无人机载大气数据计算机的设计[j].计算机技术与应用,2005,25(6):70~72
[7]史利剑.无人驾驶飞机大气数据计算机系统的研究[D].西安:西北工业大学.2001
[81Douglas12.Schmidt,Stephen13.Huston,马维达
图5中央数据处理系统的UML序列图
译.C++网络编程,卷2[M].北京:中国电力出版社
万方数据