中南大学学报(自然科学版)

一种基于虚拟执行与判定覆盖结合的Flash漏洞检测方法

彭程1,段桂华1,王湘新2,董苹苹1,郭克华1

(1. 中南大学 信息科学与工程学院,湖南 长沙,410083;

2. 湖南省公安消防总队,湖南 长沙,410205)

摘 要:

在网络上应用十分广泛,但一直以来不断出现许多严重的安全问题,提出并实现一种基于虚拟执行与判定覆盖相结合的Flash漏洞检测方法。对于待检测的Flash文件,通过对其进行反编译得到ActionScript代码;然后,分析其类结构,根据分析的结果生成多个虚拟执行流程,每个虚拟流程是对某一段代码的虚拟执行;最后,将虚拟流程的执行结果与漏洞规则进行匹配以判断是否包含漏洞。测试结果表明:所提出的漏洞检测方法具有误判率低、执行效率高的特点。

关键词:

Flash漏洞检测虚拟执行网络安全

中图分类号:TP393          文献标志码:A         文章编号:1672-7207(2013)12-4910-06

Flash vulnerability detection based on virtual execution and branch coverage

PENG Cheng1, DUAN Guihua1, WANG Xiangxin2, DONG Pingping1, GUO Kehua1

(1. School of Information Science and Engineering, Central South University, Changsha 410083, China;

2. Public Security Fire Groups of Hunan Province, Changsha 410205, China)

Abstract: Based on the fact that Flash has many serious security problems through widely used in the Internet, a detection method for Flash vulnerability based on virtual execution and branch coverage was proposed. Firstly, Flash file was decompiled and scanned to get the ActionScript code. Secondly, the class structure was analyzed and multiple virtual execution processes were generated according to the analysis. Finally it was determined whether the Flash file contained vulnerabilities after each virtual execution process. The results indicate that the method has advantages of low false positives and high execution efficiency.

Key words: Flash; vulnerability detection; virtual execution; network security

Flash是一种使用较广泛的媒体格式,能够在各种主流操作系统、浏览器、移动电话和移动设备上提供功能强大与内容丰富的视频体验[1]。目前,大部分PC机或其他终端都支持Flash,但随着Flash应用的普及,Flash 漏洞也日益增多,并对互联网的安全造成了严重的威胁。根据CVE(Common Vulnerabilities & Exposures)公布的漏洞报告,Flash漏洞数量目前仍呈增长趋势,已成为黑客攻击重灾区。在2012年10月十大安全漏洞报告中,Flash就占了2个[2]。鉴于Flash Player安全性低,iOS和Android 4.0+等操作系统甚至拒绝支持Flash,为了保证客户端安全,如果能在运行Flash文件之前对其是否包含漏洞进行检测,阻止漏洞Flash文件,便能大大加强计算机的安全。Flash漏洞检测是对目标Flash文件是否为利用Flash漏洞编写的恶意文件进行检测的一种方法。通过检测,可以事先发现恶意Flash文件,阻止用户访问,从而保证用户的网络安全。目前,已有的Flash漏洞检测方法主要有3种:

(1) 基于特征码匹配的Flash漏洞文件扫描。此方法类似于传统杀毒软件的文件扫描,即将待检测的Flash文件以二进制流的形式打开,通过匹配事先设定的特征码来确定该文件是否具有漏洞[3]。这种对包含漏洞的Flash文件进行扫描的方法,适用面较窄,且效果不佳[4]

(2) 基于静态分析代码的Flash漏洞检测。此方法通过对其ActionScript代码进行静态分析,检测是否具有触发某一漏洞的特定条件[5]。但是,由于大部分Flash漏洞需要根据变量值等当前状态信息进行匹配,而静态分析代码无法得到此类执行Flash代码后的状态信息,故该方法效果不佳[6]

(3) 基于虚拟执行的Flash漏洞检测。该方案的原理主要是将Flash文件放在沙盒中执行,在执行过程中使用函数钩子或其他方法监控其读/写内存操作。当发生读/写内存操作时,检查其行为是否合法,如读内存地址是否越界,写内存是否溢出等[7]。若发现非法操作,则认为该Flash文件是恶意文件。但该方案仍存在问题,如怎样执行Flash文件中的所有ActionScript代码尚需解决[8]。并且这种虚拟执行的方法是对内存读写操作进行监控,故只适合检测缓冲区溢出漏洞,对于其他漏洞则无法检测[9]

针对上述3种Flash漏洞检测方法存在的不足,本文作者提出一种基于虚拟执行的改进的检测方法。对于虚拟执行不能执行所有ActionScript代码的问题,该方法首先进行反编译,然后使用判定覆盖的原理遍历执行所有代码;针对仅限于检测缓冲区溢出漏洞问题,采用漏洞库进行规则匹配。

1  ActionScript代码前期处理

本方法将待检测的Flash文件作为输入,将其进行反编译得到ActionScript代码,依次分析其词法及生成单词,分析类结构信息;然后,根据结构信息生成多个虚拟执行流程,并依次虚拟执行这些流程。当虚拟执行完毕后,将当前的变量信息与漏洞规则库中的所有规则进行匹配,若发现符合某一条规则的条件,则表明该Flash包含漏洞,将结果反馈给用户。其具体检测流程如下所述。

1.1  运用反编译Flash文件进行词法分析

Flash漏洞文件的制作一般是在Flash中编写恶意ActionScript代码来实现。ActionScript是Flash使用的脚本语言,用于增强Flash的互动性和实用性。当生成Flash文件时,ActionScript代码会被编译成一种称之为“字节码”的中间码格式存入Flash文件中[10]。Flash文件的字节码与汇编语言类似,其直接操作虚拟机中的寄存器,故无法判断是否符合用ActionScript描述的漏洞规则中的变量条件。因此,若需对Flash漏洞文件进行检测,则必须首先对其进行反编译[11],得到该文件内部的ActionScript代码。

反编译ActionScript代码后,为了方便进行后续分析及虚拟执行,需要对代码进行词法分析和单词生成[12]。词法分析是计算机科学中将字符序列转换为单词序列的过程,在该阶段中,从左至右一个字符一个字符地读入ActionScript代码,然后,根据构词规则识别单词,最后将单词存入特定的数据结构中予以保存。本方法设计的单词类结构如图1所示。

图1  单词类结构

Fig. 1  Class diagram of word

例如,对于语句“var num:int = 10; ”,单词扫描及词法分析后,应生成如下单词流:("var",保留字),("num",标识符),(":",符号),("int",保留字),("=",符号),("10" ,数字),(";",符号)。

1.2  生成树的构建

为方便后续的虚拟执行,需要对单词流进行整形,以生成树的结构存储[13]ActionScript代码。树中每个结点存储ActionScript的1行语句,若某结点具有子结点,则每个子结点存储的ActionScript语句是其父节点ActionScript语句的子语句。生成树构建后,在虚拟执行过程中,只需要从开始结点处,对其进行先序深度遍历即可,且在查找上层语句时较方便。本方法设计的树结点的类结构设计如图2所示。

图2  树结点类结构

Fig. 2  Class diagram of tree node

图3所示是一段ActionScript代码转换成生成树结构的示意图。

图3  生成树构建范例示意图

Fig. 3  Diagram of constructing the spanning tree

2  代码分析与虚拟执行

2.1  ActionScript代码结构的分析

构建完ActionScript代码的生成树后,此时并不虚拟执行任何代码,而是对其类结构进行分析,即包含哪些类、类的成员函数与成员变量有哪些、其类型是什么(与C++语言的头文件类似),并设计一个类或数据结构保存这些信息。

结构分析的具体方法为:先序深度遍历生成树,对于每个结点中的语句,若找到关键字“class”,则为类定义语句;若找到关键字“function”,则为函数定义语句;若为“var”或“const”,则为变量定义语句。找到这3类语句后,分别用相应的数据结构存储其信息,其中函数信息及类成员变量信息存储至类信息对象中,函数成员变量信息存储至函数信息对象中。这种存储格式可以方便后续查询类中包含的各个函数和变量以及函数所需的成员变量。

本方法提出的存储变量、函数及类信息的类结构设计如图4和图5所示。

图4  变量信息和函数信息类结构

Fig. 4  Class diagram of variables and functions information

图5  类信息类结构

Fig. 5  Class diagram of classes information

2.2  ActionScript代码的虚拟执行

与Flash Player播放Flash文件不同,这里并不真正执行ActionScript代码。由于Flash缓冲区溢出漏洞大多只与变量与内存空间相关,故虚拟执行时只关心代码中的各变量改变,而不关心各功能的实现。

在虚拟执行之前,需要进行虚拟执行流程的初始化,其原理是根据可能最先执行的函数生成虚拟执行流程。由于ActionScript不同于C/C++,没有类似main( )这样确定的入口函数,故只能猜测哪些可能是最先执行的函数,这样做的目的也是为了尽量模拟真实执行环境与顺序。实际上,此类函数的选择对漏洞检测结果影响不大,一般将各个类的构造函数及事件响应函数作为可能最先执行的函数。此时,每个虚拟执行流程实际上就是1个函数的1次虚拟执行。初始化完毕后,依次选取各个虚拟执行流程进行虚拟执行。存储虚拟执行流程的类结构设计如图6所示。

图6  虚拟执行流程类结构

Fig. 6  Class diagram of virtual execution

虚拟执行时,遇到功能实现代码或其他与变量变化无关的代码不需要实现其执行,若添加事件监听器或载入对象,则只记录其行为,以提高执行效率。但执行诸如内存空间的分配与回收,或变量的新建、赋值与修改等,则将数据存储至该虚拟执行流程中。

若在虚拟执行过程中遇到分支语句,如if,switch,while和for语句,则根据判定覆盖的原理,针对每个分支的条件表达式修改相应变量的值,以覆盖所有分支语句,并为其新增虚拟执行流程,以待后续执行,例如遇到如下语句:

if(a1>=0) { ... } else if (a1<0) { ... }

若执行到该if语句时,原来变量a1大于等于0,则复制当前虚拟执行流程,并将新的虚拟执行流程中的变量a1修改为小于0(如值为-1),其开始行号设置为条件表达式(a1<0)后的语句块内的首条语句,最后将该新虚拟执行流程存入栈中以待后续执行。

3  匹配漏洞的触发条件

当1个虚拟执行流程执行完毕时,提取当前虚拟执行流程的变量信息,并遍历查询漏洞规则库,判断目前条件或存储的变量值是否符合漏洞触发条件。漏洞规则库可根据CVE发布的Flash的漏洞报告的漏洞原理,编写成数个漏洞匹配函数,每个函数对应1个Flash漏洞匹配规则,若符合,则提示有漏洞;当所有漏洞规则都与当前变量信息不匹配,则可以认为该Flash文件是安全的。例如CVE-2011-2137漏洞的规则是:若发现一类型为FileReference的变量进行save操作,且操作的参数变量中存在1个长度大于0x4000的string类型变量,则匹配成功,提示有漏洞。

当虚拟执行流程栈为空以后,还需对ActionScript代码中所有函数再次进行扫描,查看是否仍有函数从未被执行过。若存在此类函数,则为该函数新增虚拟执行流程,并进行虚拟执行。当此类流程执行完毕后,则可以确定所有函数的所有语句都至少被执行1次。

该方法因为保证了所有ActionScript代码都被执行过,解决了恶意代码写在特定条件语句中造成可能无法检测出的问题。此外,使用漏洞库进行规则匹配,也可以检测出非缓冲区溢出型漏洞。

4  实验结果

4.1  实验环境与实验用例

根据本方法的原理,编写1个Flash漏洞检测程序,其所用语言为C++,操作系统平台为Linux。测试所用机器配置为CPU E5300,2G RAM。

采用的实验用例为CVE-2011-2134.swf,CVE- 2011-2135.swf,CVE-2011-2136.swf,CVE-2011- 2137.swf,CVE-2011-2138.swf,CVE-2011-2139.swf,CVE-2011-2140.swf,CVE-2011-2414.swf,CVE-2011- 2415.swf,CVE-2011-2416.swf,CVE-2011-2417.swf和CVE-2011-2425.swf共12个带有漏洞的Flash文件;此外,从国内各大门户网站上随意选取Flash广告23个,Flash游戏9个;从各行业网站下载了如Flash音乐播放器、计算器等Flash制作的应用程序18个,共计50个。

4.2  实验结果及结论

4.2.1  漏洞Flash文件测试

对12个漏洞Flash文件进行测试,其中10个漏洞可以被成功检测,并反馈漏洞编号,另外2个漏洞检测失败,反馈文件安全,即检测成功率为83.3%。与传统的Flash漏洞检测方法进行对比,结果如表1所示。

表1  静态分析、虚拟执行与本方法检测结果比较

Table 1  Comparison of static detection, virtual execution and this method

4.2.2  正常Flash文件测试

分别用静态分析、虚拟执行和本方法对50个正常Flash文件进行漏洞检测,均全部反馈50个Flash文件为正常文件。

4.2.3  Flash版本多样性测试

62个Flash文件的版本如表2所示。使用本方法的测试结果显示其中60个文件都能被正确检测,但另外2个漏洞Flash文件显示安全。静态分析方法对其中10个漏洞Flash文件反馈结果为安全,虚拟执行则对其中6个漏洞Flash文件反馈安全,其他Flash文件均能正确给出检测结果。

表2  Flash测试样例版本分布

Table 2  Distribution of Flash samples

4.2.4  性能参数测试

使用实验环境中的台式机,对73.8 MB的62个Flash文件进行漏洞检测,所花时间为34.8 s,即检测速度可达到2.12 MB/s,在此过程中机器内存占用为60 MB左右。

由实验结果可见:该方法可以克服基于虚拟执行方法中不能遍历所有ActionScript代码的缺陷;此外,使用漏洞规则库[14]使得与静态分析[15]和虚拟执行相比能检测出更多的Flash漏洞数量,漏判率较低。而这3种方法的误判率相同,均为0。但该方法也存在不足之处。从性能参数测试结果可知,该方法的检测速度不高。其原因主要在于当Flash文件的ActionScript代码较复杂如类和函数过多、函数内分支语句过多时,将会生成许多虚拟执行流程,而每个虚拟执行流程均需要进行虚拟执行并使用漏洞规则库进行匹配,故造成检测速度下降。如何提高检测速度将有待于进一步研究。

5  结论

(1) 提出并实现了一种基于虚拟执行与判定覆盖相结合的Flash漏洞检测方法。该方法对待检测的Flash文件进行反编译和类结构分析,采用虚拟流程执行的方式进行漏洞规则匹配和检测。

(2) 能对目标Flash文件是否含恶意漏洞代码进行检测。与静态分析和虚拟执行方法相比,其漏判率更低且误判率相同。

(3) 采用漏洞规则库匹配的方法不仅能对Flash文件进行漏洞检测,而且能将具体包含的漏洞信息反馈给用户或调用程序,供后续的分析使用。

参考文献:

[1] Emigh J. New flash player rises in the web-video market[J]. Computer, 2006, 39(2): 14-16.

[2] 中国科学院研究生院国家计算机网络入侵防范中心. 2012年10月十大重要安全漏洞分析[J]. 信息网络安全, 2012(12): 89, 91.

National Computer Network Intrusion Protection Center. Graduate University of Chinese Academy of Sciences. A analysis of the top ten vulnerabilities on October, 2012[J]. Netinfo Security, 2012(12): 89, 91.

[3] 贺拓. Flash应用程序漏洞挖掘与利用[D]. 西安: 西安电子科技大学计算机学院, 2010: 5-6.

HE Tuo. Mining and utilization of flash application vulnerabilities[D]. Xi’an: Xidian University. School of Computer Science and Technology, 2010: 5-6.

[4] Holm H. Performance of automated network vulnerability scanning at remediating security issues[J]. Computers & Security, 2012, 31(2): 164-175.

[5] Wallach D. Technical perspective tools for information to flow securely and swiftly[J]. Communications of the ACM, 2009, 52(2): 78-80.

[6] 杨丁宁, 肖晖, 张玉清. 基于Fuzzing的ActiveX控件漏洞挖掘技术研究[J]. 计算机研究与发展, 2012, 49(7): 1525-1532.

YANG Dingning, XIAO Hui, ZHANG Yuqing. Vulnerability detection in ActiveX controls based on fuzzing technology[J]. Journal of Computer Research and Development, 2012, 49(7): 1525-1532.

[7] 黄正. 一种检测恶意flash文件的方法和装置: 中国, 201210027110.8[P].[2012-02-10].

HUANG Zheng. A method and device of flash vulnerability detection: China, 201210027110.8[P]. [2012-02-10].

[8] Wang T, Wei T, Gu G, et al. Checksum-aware fuzzing combined with dynamic taint analysis and symbolic execution[J]. ACM Transactions on Information and System Security, 2011, 14(2): 1-25.

[9] Lund K, Moulton M, Nicholson S. Adobe flash player vulnerability research[EB/OL]. [2011-11-15]. http://mason.gmu. edu/~msherif/isa564/fall11/projects/adobe.pdf.

[10] 刘建, 倪宏. 一种ActionScript解释器的设计与实现[J]. 微计算机应用, 2010, 31(7): 63-66.

LIU Jian, NI Hong. A design and implementation of ActionScript interpreter[J]. Microcomputer Applications, 2010, 31(7): 63-66.

[11] De Vries B W, Gupta G, Hamlen K W, et al. ActionScript bytecode verification with co-logic programming[C]//Dublin: ACM SIGPLAN Workshop On Programming Languages and Analysis For Security, 2009: 9-15.

[12] 阮辉, 严俊, 张建. 基于路径分析的死循环检测[J]. 计算机学报, 2009, 32(9): 1750-1758.

RUAN Hui, YAN Jun, ZHANG Jian. Infinite loop detection based on path analysis[J]. Chinese Journal of Computers, 2009, 32(9): 1750-1758.

[13] Watanabe T, Cheng Z, Kansen M, et al. A new security testing method for detecting flash vulnerabilities by generating test patterns[R]. International Conference on Network-Based Information Systems(NBiS’2010). Takayama, Japan, 2010: 469-474.

[14] Sridhar M, Hamlen K W. ActionScript in-lined reference monitoring in prolog[C]//International Symposium on Practical Aspects of Declarative Languages(PADL’2010). Madrid, Spain, 2010: 149-151.

[15] Burgstaller B, Scholz B, Blieberger J. A symbolic analysis framework for static analysis of imperative programming languages[J]. The Journal of Systems and Software, 2012, 85(6): 78-99.

(编辑  陈灿华)

收稿日期:2013-03-09;修回日期:2013-05-14

基金项目:国家自然科学基金资助项目(61202494, 61202341);湖南省科技计划重点项目(2011GK2008);新世纪优秀人才支持计划项目(NCET-10-0798);金属矿山安全技术国家重点实验室开放基金资助项目(2012KFJJ02)

通信作者:段桂华(1972-),女,湖南新化人,副教授,从事计算机网络和网络安全研究;电话:0731-88877709;E-mail:duangh@csu.edu.cn

摘要:基于Flash在网络上应用十分广泛,但一直以来不断出现许多严重的安全问题,提出并实现一种基于虚拟执行与判定覆盖相结合的Flash漏洞检测方法。对于待检测的Flash文件,通过对其进行反编译得到ActionScript代码;然后,分析其类结构,根据分析的结果生成多个虚拟执行流程,每个虚拟流程是对某一段代码的虚拟执行;最后,将虚拟流程的执行结果与漏洞规则进行匹配以判断是否包含漏洞。测试结果表明:所提出的漏洞检测方法具有误判率低、执行效率高的特点。

[1] Emigh J. New flash player rises in the web-video market[J]. Computer, 2006, 39(2): 14-16.

[2] 中国科学院研究生院国家计算机网络入侵防范中心. 2012年10月十大重要安全漏洞分析[J]. 信息网络安全, 2012(12): 89, 91.

[3] 贺拓. Flash应用程序漏洞挖掘与利用[D]. 西安: 西安电子科技大学计算机学院, 2010: 5-6.

[4] Holm H. Performance of automated network vulnerability scanning at remediating security issues[J]. Computers & Security, 2012, 31(2): 164-175.

[5] Wallach D. Technical perspective tools for information to flow securely and swiftly[J]. Communications of the ACM, 2009, 52(2): 78-80.

[6] 杨丁宁, 肖晖, 张玉清. 基于Fuzzing的ActiveX控件漏洞挖掘技术研究[J]. 计算机研究与发展, 2012, 49(7): 1525-1532.

[7] 黄正. 一种检测恶意flash文件的方法和装置: 中国, 201210027110.8[P].[2012-02-10].

[8] Wang T, Wei T, Gu G, et al. Checksum-aware fuzzing combined with dynamic taint analysis and symbolic execution[J]. ACM Transactions on Information and System Security, 2011, 14(2): 1-25.

[9] Lund K, Moulton M, Nicholson S. Adobe flash player vulnerability research[EB/OL]. [2011-11-15]. http://mason.gmu. edu/~msherif/isa564/fall11/projects/adobe.pdf.

[10] 刘建, 倪宏. 一种ActionScript解释器的设计与实现[J]. 微计算机应用, 2010, 31(7): 63-66.

[11] De Vries B W, Gupta G, Hamlen K W, et al. ActionScript bytecode verification with co-logic programming[C]//Dublin: ACM SIGPLAN Workshop On Programming Languages and Analysis For Security, 2009: 9-15.

[12] 阮辉, 严俊, 张建. 基于路径分析的死循环检测[J]. 计算机学报, 2009, 32(9): 1750-1758.

[13] Watanabe T, Cheng Z, Kansen M, et al. A new security testing method for detecting flash vulnerabilities by generating test patterns[R]. International Conference on Network-Based Information Systems(NBiS’2010). Takayama, Japan, 2010: 469-474.

[14] Sridhar M, Hamlen K W. ActionScript in-lined reference monitoring in prolog[C]//International Symposium on Practical Aspects of Declarative Languages(PADL’2010). Madrid, Spain, 2010: 149-151.

[15] Burgstaller B, Scholz B, Blieberger J. A symbolic analysis framework for static analysis of imperative programming languages[J]. The Journal of Systems and Software, 2012, 85(6): 78-99.