CN111694746A - 面向编译型语言AS3的Flash缺陷模糊测评工具 - Google Patents
面向编译型语言AS3的Flash缺陷模糊测评工具 Download PDFInfo
- Publication number
- CN111694746A CN111694746A CN202010544494.5A CN202010544494A CN111694746A CN 111694746 A CN111694746 A CN 111694746A CN 202010544494 A CN202010544494 A CN 202010544494A CN 111694746 A CN111694746 A CN 111694746A
- Authority
- CN
- China
- Prior art keywords
- grammar
- rule
- grammar rule
- stretching
- code
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Pending
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F11/00—Error detection; Error correction; Monitoring
- G06F11/36—Preventing errors by testing or debugging software
- G06F11/3668—Software testing
- G06F11/3672—Test management
- G06F11/3684—Test management for test design, e.g. generating new test cases
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F11/00—Error detection; Error correction; Monitoring
- G06F11/36—Preventing errors by testing or debugging software
- G06F11/3668—Software testing
- G06F11/3672—Test management
- G06F11/3688—Test management for test execution, e.g. scheduling of test suites
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Computer Hardware Design (AREA)
- Quality & Reliability (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Devices For Executing Special Programs (AREA)
Abstract
本发明提供的面向编译型语言AS3的Flash缺陷模糊测评工具,首先阐述了模糊测试策略的采用,然后是总体架构,主要分为几个步骤:获取语法规则实例、修改语法规则实例、生成初始测试代码和规范化代码,最后将测试代码编译生成可被AVM虚拟机识别的可执行文件,通过不同的参数配置修改选定算法策略。规范化代码是为了使不能通过编译器验证的初始测试代码经过约束完善后能顺利通过编译器验证并生成可执行文件。本发明的Flash缺陷模糊测评工具寻找Flash软件潜在缺陷的能力强,测评数据的有效率高,测评代码覆盖率高,挖掘的Flash软件错误能被及时捕捉。
Description
技术领域
本发明涉及一种Flash缺陷模糊测评工具,特别涉及一种面向编译型语言AS3的Flash缺陷模糊测评工具,属于软件模糊测评工具技术领域。
背景技术
当前计算机和信息网络技术的高速发展,信息的保存、处理、传输安全极为重要,及时发掘软件缺陷,处理网络威胁,预防网络犯罪成为全社会共同的责任,对软件或者信息系统进行缺陷发掘,挖掘可被运用的漏洞缺陷并及时修复至关重要。
目前Adobe公司的Flash工具应用非常广泛,但被爆出存在大量的安全漏洞,备受争议。AS(ActionScript)是支持Flash产品的脚本语言,是完全面向对象的编程语言,它类库丰富,功能强大,语法类似JavaScript,多用于Flash互动性、娱乐性、实用性开发,RIA开发与网页制作。但Flash产品频繁被爆出存在安全漏洞。根据统计数据,Flash产品的漏洞数量一直居高不下,一直被恶意软件制造商和安全技术人员广泛关注。虽然谷歌公司宣布放弃Flash改用HTML5,火狐浏览器也已经不支持Flash,但考虑到Flash长期市场占有率较高,并被广泛应用于网站广告、游戏、网络视频、交互研发等,且当前的浏览器大部分内置了Flash播放器,视频网站也大量采用了Flash技术,其市场占地位短期内不会动摇,未来几年之内不可能被用户抛弃,采用AS语言为探究对象对Flash的安全研究依然有很大价值。
模糊测试是通过向目标软件提供畸形输入并监视异常结果来发掘软件缺陷的方法,测试用例通常是带有攻击性的畸形数据,用于触发各类的缺陷。模糊测试按测试对象不同分为二种:基于格式的模糊测试和基于语法规则的模糊测试。依据测试方法的不同又分为基于白盒测试的模糊测试、基于黑盒测试的模糊测试、基于灰盒测试的模糊测试,灰盒测试通过逆向解析获取程序先验知识,再通过反汇编工具确定可能出现的缺陷。
现有技术中达维特首次提出把文件的组织结构和协议格式融汇到模糊测试中,基于这种思路的SPIKE模糊测评工具挖掘了许多未知的缺陷,埃丁顿等人开发的Peach是一个遵守MIT开源许可证的模糊测试框架,最初采用Python语言编写,支持对文件格式、ActiveX、网络协议、API等进行模糊测试,是一个使用广泛的针对格式的模糊测评工具。高峻等人提出了针对微软办公软件的复合型文档的模糊测试,是基于文件格式的模糊测试的一个突破。戈尔布诺夫提出一种自动化网络协议auto模糊测试框架,通过学习协议的实现原理构建一个有限状态的自动机,观察捕捉客户端和服务器之间的通信,是一种智能的、半确定性的网络协议模糊测试框架。唐文等人提出一种整合随机信号处理和正则表达式的有效模糊测试输入生成方法,有效减少了重复测试数据的生成概率。卡维登等人提出了一个可感知状态的黑盒网络缺陷扫描器,扫描器运用web应用导航,观察输出差异并逐步生成代表web应用程序状态的模型,遍历web应用程序的状态机寻找和模糊测试用户输入向量并发掘安全缺陷。吴鹏等人提出了一种新的协议模糊测试方法,运用分类树生成协议测试代码,通过启发式算法移除分类树中的某些结点来减少测试代码的数量。
现有技术基于语法规则的模糊测试的发展历程随着js模糊测试工具的出现开始进入人们的视线,该工具针对JavaScript语言的模糊测试;后又提出针对CSS语法规则的基于语法规则的模糊测评工具CSSgrammar模糊测试;针对C语言编译器的基于语法文件的模糊测评工具CSmith,根据C语言的语法产生出能通过编译器验证的测试集,其原理是通过约束不同语言环境下语法结构的产生情形对生成的测试代码进行约束,使得产生的代码能顺利通过编译器的验证;基于语法规则的白盒模糊测试在符号执行时通过定制约束求解器求解出合规的输入,以便可进行更深层次的测试,避免输入在词法解析和语法解析时被拒绝。基于约束逻辑编程的语言模糊测试方法使用逻辑约束编程谓词,可以指定随机文法,也可以指定句法特征和语义行为的聚合,这样可以产生效果明显的的测试用例。基于生成的模糊测试是根据一个规格文档生成测试用例;基于转化的模糊测试采用数据结构丰富的目标文件,然后随机或启发式修改目标文件的文件结构,通过大量的测试寻找缺陷,这种方法无需学习太多的标准规格文档。
现有技术还有许多各种模糊测试方法的优势互补的方法,将各种模糊测试方法的优点结合起来,实现更加强大的模糊测评工具,或将模糊测试同现有的技术结合,加强现有模糊测试技术的性能。现有技术不仅关注模糊测试的方法,还探究如何在使用转化型模糊测试时,采用更加有效的随机种子文件,探究在不削弱模糊测评工具的代码覆盖率的前提下如何减少模糊测试的测试集等模糊测评工具优化方法。但总整体而言,现有技术没有专门针对Flash软件的测评工具,Flash缺陷测评工具整体水平较低,导致寻找Flash软件潜在缺陷的能力弱,测评数据的有效率低,测评代码覆盖率低,不能挖掘和及时捕捉Flash软件的错误。
针对现有技术存在的部分缺点,本发明拟解决以下问题:
一是当前Flash工具被广泛应用,但安全问题一直是用户的重要关注点,频频爆出的漏洞缺陷使Flash备受争议。市面上有的大量网站采用Flash技术,Flash技术的新特征许多,但许多设备、不同浏览器对所有新特征不都能很好的支持,Flash技术甚至对一些常见的浏览器的兼容性不好,漏洞和问题太多,导致用户在不同浏览器下对Flash技术的体验不一致,部分浏览器下Flash技术的体验很不好,严重制约了Flash技术的发展,解决该问题需要针对Flash的测评工具,现有技术没有性能较好的该类产品,导致Flash需要反复测试,仍然无法解决问题,极大的增加了开发人员的工作量。
二是现有技术的测评工具性能和安全性不好,针对性不强,现有技术没有专门针对Flash缺陷的模糊测评工具,更没有Flash缺陷测评工具的系统实现的采用策略,测评工具的总体架构,研发思想和具体的实现过程的相关技术。Flash缺陷测评工具研发领域存在较大空白。由于现有技术的Flash缺陷测评工具整体水平较低,导致寻找Flash软件潜在缺陷的能力弱,测评数据的有效率低,测评代码覆盖率低,不能挖掘和及时捕捉Flash软件的错误。
三是现有技术的测评工具缺少统一实现标准,特别是现有技术针对Flash技术测评的实现标准过于分裂、缺少一致性,Flash技术过于开放,不能确保实现的正确性和高效性,同时Flash技术漏洞和缺陷较多,从标准到技术再到应用有一定距离,Flash技术需要改良和完善。但现有技术不能找出能导致AVM崩溃的AS代码片段,不能做进一步解析和运用,不能生产出能通过编译器的AS代码,无法通过编译生成SWF文件批量测试Flashplayer,现有技术测评工具代码不够健壮,不便于维护和扩展,对具体解决Flash缺陷问题没有实用性和推广价值。
发明内容
针对现有技术的不足,本发明提供的面向编译型语言AS3的Flash缺陷模糊测评工具,详细记载了Flash缺陷模糊测评工具的系统实现的采用策略,测评工具的总体架构,研发思想和具体的实现过程。首先阐述了模糊测试策略的采用,然后是总体架构,主要分为几个步骤:获取语法规则实例、修改语法规则实例、生成初始测试代码和规范化代码,最后将测试代码编译生成可被AVM虚拟机识别的可执行文件,测试代码的生成算法可从深度优先伸展算法、宽度优先伸展算法和随机伸展算法中任选,通过不同的参数配置修改选定的算法策略。规范化代码是为了使不能通过编译器验证的初始测试代码经过约束完善后能顺利通过编译器验证并生成可执行文件,详细记载了批量编译AS文件和批量执行SWF文件的方法。本发明的Flash缺陷模糊测评工具寻找Flash软件潜在缺陷的能力强,测评数据的有效率高,测评代码覆盖率高,挖掘的Flash软件错误能被及时捕捉。
为达到以上技术效果,本发明所采用的技术方案如下:
面向编译型语言AS3的Flash缺陷模糊测评工具,利用语法规则文件分析代码的语法组成,根据语法组成产生或者变异得出测试文件集,采用Antlr测试支持AS3语言执行的AVM虚拟机,AS3语言用于Flash组件的开发,通过编译器验证生成可执行代码后才能执行;
本发明通过解析AS3语法规则文件生成AS语法解析器和词法解析器,然后采用语法解析器对AVM的标准测试集Tamarin进行语法解析获取语法规则实例并以Python语言可识别的格式存储,再根据自定义策略选择深度优先伸展算法或者广度优先伸展算法或者随机伸展算法对语法规则进行聚合形成中间文件,并使用之前获得的语法规则实例代替对应的语法规则生成初始测试代码,逐步选取不同的简洁语法规则,并从中筛选出能通过语法解析器约束的代码片段,将这些代码片段随机组合成可通过语法解析器约束的AS源文件,源文件进一步规范化为可通过编译器验证的源代码,规范化过程利用运行时库信息代替源代码中的函数、变量,并修复可导致编译失败的上下文,最终生成可被编译器验证的源文件,将源文件批量编译成可被AVM识别的SWF文件格式后,对不同版本的AVM进行测评,寻找存在的潜在漏洞和缺陷。
面向编译型语言AS3的Flash缺陷模糊测评工具,进一步的,本发明实施方案路径采用基于语法规则的黑盒模糊测试,测试用例的产生策略采用基于生成的缺陷发掘方法。
面向编译型语言AS3的Flash缺陷模糊测评工具,进一步的,总体架构为测评工具从外部获取第三方提供的标准测试集和AS3语法文件,根据AS语法规则将标准测试集的代码解析分割为大量的语法实例片段并保存为中间文件,将第三方提供的AS语法文件中繁杂的语法规则修改成多个简洁语法规则,方便后续代码生成步骤的运用,此处对语法文件的语法规则约束无任何影响,其后根据修改的AS语法文件随机聚合语法实例生成初始测试代码片段;对代码片段做规范化处理,将生成的代码片段预先经过语法解析器筛选过滤,并规范化处理后再送入编译器进行编译,增加通过编译器的代码量;最后将编译后生成的SWF文件送入不同版本的AVM虚拟机中进行测试,并将测试结果输出记录;
本发明使用的标准测试集是Tamarin,Tamarin是开源的AVM,其中包含验证测试集,语法文件从eclipse的AS编辑插件中提取,该插件帮助eclipse识别AS文件的关键字、变量并高亮这些标识符,修改语法规则的目标是一个语法规则中不包含多个连接元素,规范化代码时首先生成含有if语法结构、for语法结构、while语法结构的简洁语法结构代码片段,过滤淘汰语法解析器无法解析的非法代码,然后随机聚合成能通过语法解析器的代码,最后依靠运行时类信息修复剩余的语法缺陷使其能通过编译器的验证,生成可执行的SWF文件。
面向编译型语言AS3的Flash缺陷模糊测评工具,进一步的,获取语法规则实例需第三方标准测试集和第三方提供的语法规则文件的支持,第三方标准测试集为Tamarin,第三方AS语法规则文件取自eclipse的插件;本发明依靠Antlr工具将语法规则文件解析获得语法解析器代码和词法解析器代码,通过eclipse插件Antlr4得到语法解析器源代码AS3_exParser.java和词法解析器源代码AS3_exLexer.java,本发明额外编写一个test.java文件调用语法解析器,将输入的源代码分割成单元语法填入语法解析树,通过遍历语法树获取每个语法规则的实例,并将规则实例组装成Python可识别的代码输出。
面向编译型语言AS3的Flash缺陷模糊测评工具,进一步的,深度优先伸展算法基于深度优先搜索算法优化改良,首先将一个语法规则扩展SD次后,然后再对其它语法规则进行扩展;
深度优先伸展算法的流程为:首先输入一个初始语法规则[StratRule],语法表达式为“StartRule:ab;”,经过第一轮伸展后,语法规则集合变为[a,b];a的语法规则表达式为“a:c d;”,b的语法规则表达式为“b:W K;”,优先伸展语法规则a的结点,经过第二轮伸展后语法规则被伸展为[c,d,b];C的语法规则为“c:E;”,d的语法规则为“d:Q;”,经过第三轮伸展后,语法规则集合变成[E,d,b],当依次完成所有语法规则的伸展时,若语法规则集合中还包含非完结结点,则将其替换为之前获取得到的语法规则实例;
实现深度优先伸展算法的具体实施过程为:需输入初始语法规则StartRule和需伸展的深度S,经过处理后将输出初始测试代码,以Python语言为背景实现,首先定义空列表ruleArray,将StartRule插入列表,用二层循环来控制伸展,外层的while循环保证每次都从列表中第一个符合要求的语法规则开始伸展,里层的for循环保证数组中所有语法规则均有机会被伸展;
首先从列表ruleArray中取出一个语法规则,判断该语法规则是否为完结结点,若是,则继续从列表中取出第二个语法规则继续循环,若不是则判断该语法规则被伸展的次数是否大于规定的临界值SD,若是,则从列表中继续取出下一个语法规则循环,若不是,则伸展结点并将伸展次数加1,然后跳出for循环,进入while循环中,继而又开始下一轮,取出列表ruleArray中符合条件的第一个语法规则,依此类推;若ruleArray列表中的所有语法规则均是完结结点或被伸展次数均达到初定临界值SD,则跳出while循环,结束语法规则的伸展;随后,遍历ruleArray中的语法规则,并将所有非完结结点替换为之前保存的语法规则实例,并输出初始测试代码。
面向编译型语言AS3的Flash缺陷模糊测评工具,进一步的,宽度优先伸展算法基于宽度优先搜索算法优化改良,首先将所有语法规则伸展1次后,再继续从第一个语法规则开始进行第二轮伸展动作,直到所有语法规则均是完结结点或者遍历深度达到KD次;
宽度优先伸展算法的流程为:首先指定一个初始语法规则StartRule,语法规则集合为[StrartRule],语法规则表达式为“StartRule:a b;”,经过第一轮编译后,语法规则集合变为[a,b];a的语法规则表达式为“a:c d;”,b的语法规则表达式为“b:E;”,第二轮伸展需将语法规则a和b都伸展,语法规则集合变为[c,d,E];c的语法规则表达式为”c:F;”,d的语法规则表达式为”d:G;”,E已是完结结点,无法继续伸展,第三轮伸展后,语法规则集合变为[F,G,E];若语法规则伸展结束后,语法规则集合中还包含有非完结结点,则用之前获取的语法规则实例一对一代替;
宽度优先伸展算法需要提供初始语法规则StartRule和伸展深度KD,伪代码中有二层循环结构,外循环保证伸展深度,内循环保证宽度优先伸展;首先从ruleArray中取出第一个语法规则,若该语法规则是完结结点,则将其伸展深度加一并将伸展后得到的语法规则追加到ruleArray后面,ruleArray中的所有语法规则都被伸展后,删除伸展之前的语法规则,确保ruleArray中的语法规则简洁,依次进行宽度优先伸展,直到ruleArray中的所有语法规则伸展次数超过预定的伸展临界值KD;结束语法规则伸展过程后,将ruleArray中的所有非完结结点用预先收集的语法规则实例代替,最后输出初始测试代码。
面向编译型语言AS3的Flash缺陷模糊测评工具,进一步的,随机伸展算法是每次进行语法规则伸展之前都随机选择下一轮的伸展方法,本发明将时间作为随机算子,指定初始的语法规则StartRule,语法规则集合为[StartRule],由于“StartRule:a b;”,无论是深度优先伸展算法还是宽度优先伸展算法,语法规则集合都扩展为[a,b];根据随机算法,第二轮伸展策略选定为宽度优先伸展,语法规则a的语法规则表达式为“a:c d”,语法规则b的语法规则表达式为“b:e;”,语法规则集合扩展为[c,d,e];第三轮伸展策略选定为深度优先伸展,语法规则c的语法规则表达式是“c:f”,语法规则集合伸展为[f,d,e];第四轮伸展策略若又被选定为深度优先伸展,语法规则f的语法规则表达式为“f:G”,则经过四轮伸展后语法规则集合变为[G,d,e];若此时终止伸展语法规则,则用之前获取到的语法规则实例代替掉非完结结点d和e;
随机伸展算法是深度优先伸展算法和宽度优先伸展算法的融合,在每一轮伸展之前,本发明以时间为随机算子随机选择伸展策略,然后根据深度优先伸展算法或者宽度优先伸展算法进行伸展,通过设置最大伸展次数控制伸展深度。
面向编译型语言AS3的Flash缺陷模糊测评工具,进一步的,本发明从二个文件中提取运行时类信息:ActionsPanel_3.xml和catlog.xml文件;
ActionsPanel_3.xml文件从Adobe Flash Professional CS6目录中获取,内部含有一些调用函数、声明变量、创建类对象使用的规范;catlog.xml是从Adobe官方提供的playerglobal.swc中解压缩出来的xml文件,其中包括运行时类名和API函数;本发明通过Flash自带的反射机制,输入类名获取每个类结构的xml表述;catlog.xml中的类并不全能成功运用反射机制获取相关类信息,但绝大部分都能获取,本发明舍弃获取类信息失败的一部分类;将获取到的类信息存入一个Python类中,其类属性包括类所在的包名packageName,便于后续导入对应的包名,即“import packageName;”;父类名parentsName;类名className;常量名constAttri;变量名varAttri;实现名implementName;get和set函数定义的属性accessorAttri;函数信息methode。
面向编译型语言AS3的Flash缺陷模糊测评工具,进一步的,将初始测试代码用产生的词法解析器标记标识符的类型,即函数类型、函数名、函数声明、变量名、变量类型经过词法解析器处理后会被标记;词法解析器维护上下文,根据词法token序列每个identifier的前后几个token判别每个identifier的具体指代意义;
有初始测试代码经过词法解析器标记后,会产生相同的中间文件,根据中间文件的MD5值删除重复的文件。
面向编译型语言AS3的Flash缺陷模糊测评工具,进一步的,代替标记步骤产生能通过编译器验证的测试代码,本发明准备一个模板类,逐步代替内部的标签产生语义完整的代码片段;
模板文件将_functionDeclaration_,_constantVarStatement_,_forEachInStatement_,_whileStatement_,_forInStatement_,_variableStatement_,_returnStatement_,_withStatement_,_doWhileStatement_,_ifStatement_,_tryStatement_,_forStatement_,_switchStatement_标签分别用生成的with测试代码,while测试代码,for测试代码,常量定义测试代码,switch测试代码,变量定义测试代码,do_while测试代码,函数定义测试代码,if测试代码,try测试代码,返回语句测试代码,for测试代码代替,形成构造完整的目标AS文件;
将目标AS文件中所含的所有变量和函数都替换为采集到的运行时类信息,随机从运行时类库中选取二个或者多个类,然后用“importpackageName;”代替标签“_import_”;为每个类初始化一个变量,初始化变量的代码代替标签“_globalvardeclaration_”,同时初始化几个基本类型的变量供后续使用;目标AS代码中模板文件相关标签代替完后,逐行代替之前词法解析标记的标签;
通过对已有Flash缺陷的解析,总结出容易导致目标系统错误的危险类,然后对这些类赋予较大的权值,在代替标记时更倾向于采用危险类代替。
与现有技术相比,本发明的优点和创新点在于:
一是本发明提供的面向编译型语言AS3的Flash缺陷模糊测评工具,详细记载了Flash缺陷模糊测评工具的系统实现的采用策略,测评工具的总体架构,研发思想和具体的实现过程。首先阐述了模糊测试策略的采用,然后是总体架构,主要分为几个步骤:获取语法规则实例、修改语法规则实例、生成初始测试代码和规范化代码,最后将测试代码编译生成可被AVM虚拟机识别的可执行文件,测试代码的生成算法可从深度优先伸展算法、宽度优先伸展算法和随机伸展算法中任选,通过不同的参数配置修改选定的算法策略。规范化代码是为了使不能通过编译器验证的初始测试代码经过约束完善后能顺利通过编译器验证并生成可执行文件,详细记载了批量编译AS文件和批量执行SWF文件的方法。本发明的Flash缺陷模糊测评工具寻找Flash软件潜在缺陷的能力强,测评数据的有效率高,测评代码覆盖率高,挖掘的Flash软件错误能被及时捕捉。
二是本发明提供的面向编译型语言AS3的Flash缺陷模糊测评工具,引入Antlr工具,采用Antlr识别解析按一定规则撰写的语法文件,使得Flash缺陷模糊测评工具的测评更加全面客观;同时对语法文件的格式和规则进行清楚完整的说明,将支持AS语言的虚拟机AVM,以及Flash的漏洞缺陷的做具体分类。本发明的目标和优势是找出能导致AVM崩溃的AS代码片段,并进一步解析能否运用。根据AS3的语法文件,生产出能通过编译器的AS代码,并用这些编译生成的SWF文件批量测试Flashplayer,采集导致崩溃的文件并进一步解析,得出可能的运用点。测评工具代码健壮,易于维护和扩展,对解决大量存在的Flash缺陷问题有较强实用性和推广价值。
三是本发明提供的面向编译型语言AS3的Flash缺陷模糊测评工具,本发明的创新点之一在于不对生成初始测试代码的过程做任何语法规则上的约束,而是对生成的测试代码进行筛选,挑选出符合语法解析器规则的代码,这样可以提高语法结构的繁杂度;同时本发明通过解析评测Flash已有的缺陷,筛选出危险类,在规范化初始测试代码时,侧重关注危险类之间的交互关系,使得Flash缺陷模糊测评工具的测评更有针对性。
四是本发明提供的面向编译型语言AS3的Flash缺陷模糊测评工具,优点和创新之处还在于对运行时类的采用,通过对已有Flash缺陷的解析,总结出容易导致目标系统错误的危险类,然后对这些类赋予较大的权值,在代替标记时更倾向于采用危险类代替,提高目标对象的缺陷检测率。
附图说明
图1是本发明基于语法的模糊测评工具基本流程图。
图2是本发明面向编译型语言AS3的Flash缺陷模糊测评工具的总框架图。
图3是本发明的总体架构图。
图4是本发明的深度优先伸展算法示例图。
图5是本发明的宽度优先伸展算法示例图。
图6是本发明的随机伸展算法示例图。
具体实施方式
下面结合附图,对本发明提供的面向编译型语言AS3的Flash缺陷模糊测评工具的技术方案进行进一步的描述,使本领域的技术人员可以更好的理解本发明并能予以实施。
本发明提供的面向编译型语言AS3的Flash缺陷模糊测评工具,利用语法规则文件分析代码的语法组成,根据语法组成产生或者变异得出测试文件集,采用Antlr测试支持AS3语言执行的AVM虚拟机,AS3语言用于Flash组件的开发,通过编译器验证生成可执行代码后才能执行;
本发明通过解析AS3语法规则文件生成AS语法解析器和词法解析器,然后采用语法解析器对AVM的标准测试集Tamarin进行语法解析获取语法规则实例并以Python语言可识别的格式存储,再根据自定义策略选择深度优先伸展算法或者广度优先伸展算法或者随机伸展算法对语法规则进行聚合形成中间文件,并使用之前获得的语法规则实例代替对应的语法规则生成初始测试代码,逐步选取不同的简洁语法规则,并从中筛选出能通过语法解析器约束的代码片段,将这些代码片段随机组合成可通过语法解析器约束的AS源文件,源文件进一步规范化为可通过编译器验证的源代码,规范化过程利用运行时库信息代替源代码中的函数、变量,并修复可导致编译失败的上下文,最终生成可被编译器验证的源文件,将源文件批量编译成可被AVM识别的SWF文件格式后,对不同版本的AVM进行测评,寻找存在的潜在漏洞和缺陷。
一、实施方案路径
模糊测试运用暴力实现对目标程序的自动化测试,然后解析测试结果,若符合特定情形则判定程序存在缺陷或者问题;黑盒模糊测试是在没有源代码的情形下,测试人员不掌握目标程序的任何信息,只能通过大量的测试用例进行检测,尽量多的找出薄弱点;黑盒模糊测试是基于黑盒测试的模糊测试技术,但与黑盒测试的主要区别在于测试需求的目标不同,黑盒模糊测试侧重挖掘软件安全性相关的错误,而黑盒测试主要检测软件功能的正确性;二者构建测试用例的着重点也不同,模糊测试的测试用例大部分均是反常规的测试用例,目的是提高测试用例的有效性,使畸形测试数据能够抵达程序的薄弱点,而黑盒测试构建的测试用例都正确;黑盒模糊测试产生测试用例时会考量测试用例的数据结构、数据格式,而黑盒测试只关注目标软件的输入输出和外部接口。
黑盒模糊测试的执行过程为:一是模糊测评工具通过随机或半随机生成大量的测试用例;二是模糊测评工具将生成的测试用例传送至目标软件;三是模糊测评工具检测目标软件的状态是否正常;四是根据目标软件的状态判断是否存在安全缺陷。黑盒模糊测试的所有步骤均是自动化工具自动完成的,无需人工干预。
黑盒模糊测试适用性广,即使没有源代码也可以使用黑盒模糊测试,黑盒模糊测试无需对目标作出预设,有可重现性,实现也非常简洁,可在不清楚目标软件内部细节的情形下执行。但黑盒模糊测试的覆盖能力不足,且黑盒模糊测试适合由单一的输入向量引发的安全缺陷。白盒模糊测试可结合黑盒模糊测试和符号执行的优点,不依赖源代码,比黑盒模糊测试有更好的路径覆盖率,但它也有致命缺陷在于执行时间长,内存消耗大,还有符号执行路径爆炸的不足。灰盒模糊测试可用性强,除web服务外的软件二进制版本都可使用,代码覆盖率高于黑盒模糊测试,但逆向工程繁杂,需要的资源优势不可得时将导致灰盒模糊测试的应用局限性大。
本发明经过对黑盒模糊测试、白盒模糊测试、灰盒模糊测试的探究及优劣势比对,实施方案路径采用基于语法规则的黑盒模糊测试。基于语法结构的缺陷发掘根据目标语法规则随机聚合生成测试文件。基于语法规则的模糊测评工具的流程如图1所示:
基于生成的缺陷发掘方法是产生新输入而不对已有输入进行转化,基于生成的缺陷发掘依赖文件格式或网络协议的规则文档,根据这些文档构建测试用例,构建出有效的测试用例的关键是构建出非常规数据导致软件出错,但产生的数据应遵循一定的标准,避免目标程序在执行前期就将非法数据丢弃,基于生成的缺陷发掘方法将协议或者文件格式分割成许多小块,将这些小块按合规顺序随机聚合,生成可用的测试用例。生成的测试用例能保留其结构,但包含的数据改变。
基于生成的缺陷发掘方法需大量的前期工作,学习规格文档和手动生成测试用例。基于转化的缺陷发掘先收集合规的数据,然后修改数据产生新数据。数据修改规则随机或是启发式修改。基于转化的缺陷发掘方法和基于生成的缺陷发掘方法并不完全独立,它们有重合之处,缺陷发掘工具兼具转化算法和生成算法,本发明采用基于生成的缺陷发掘方法。
综上所述,本发明实施方案路径最终采用基于语法规则的黑盒模糊测试,测试用例的产生策略采用基于生成的缺陷发掘方法。
二、总体架构
面向编译型语言AS3的Flash缺陷模糊测评工具发掘AVM虚拟机潜在的缺陷,需要的外部输入包括AVM虚拟机的标准开源测试集Tamarin,即AVM虚拟机的开发人员对AVM虚拟机进行性能测试时所使用的官方测试集,系统所需的外部输入还包括AS(ActionScript)语法文件,即定义AS语言使用规则规范的文件。测评工具在外部输入的辅助下生成大量能被AVM虚拟机识别并执行的SWF文件,然后将测试文件批量送入AVM虚拟机测试执行,寻找AVM虚拟机的潜在缺陷。面向编译型语言AS3的Flash缺陷模糊测评工具的总框架图如图2所示,总体架构图如图3所示。
测评工具从外部获取第三方提供的标准测试集和AS3(ActionScript3.0)语法文件,根据AS语法规则将标准测试集的代码解析分割为大量的语法实例片段并保存为中间文件,将第三方提供的AS语法文件中繁杂的语法规则修改成多个简洁语法规则,方便后续代码生成步骤的运用,此处对语法文件的语法规则约束无任何影响,其后根据修改的AS语法文件随机聚合语法实例生成初始测试代码片段;由于生成的初始测试代码片段无法通过编译器,因此需要对代码片段做规范化处理,即将生成的代码片段预先经过语法解析器筛选过滤,并规范化处理后再送入编译器进行编译,增加通过编译器的代码量;最后将编译后生成的SWF文件送入不同版本的AVM虚拟机中进行测试,并将测试结果输出记录。
本发明在具体实现中使用的标准测试集是Tamarin,Tamarin是一个开源的AVM,其中包含验证测试集,语法文件从eclipse的AS编辑插件中提取,该插件帮助eclipse识别AS文件的关键字、变量并高亮这些标识符,修改语法规则的目标是一个语法规则中不包含多个连接元素,初始代码生成算法是深度优先伸展算法或者广度优先伸展算法或者随机伸展算法,规范化代码时首先生成含有if语法结构、for语法结构、while语法结构的简洁语法结构代码片段,过滤淘汰语法解析器无法解析的非法代码,然后随机聚合成能通过语法解析器的代码,最后依靠运行时类信息修复剩余的语法缺陷使其能通过编译器的验证,生成可执行的SWF文件。
三、获取语法实例规则
获取语法规则实例需第三方标准测试集和第三方提供的语法规则文件的支持,本发明采用的第三方标准测试集为Tamarin,Tamarin是一个开源的AVM,实现高性能开放源代码的ES4(ECMAScript4)语言规范,Adobe在Adobe Flash Player中的AVM中使用到这些代码,本发明使用的第三方AS语法规则文件取自eclipse的插件,插件具体为flex格式化代码工具FlexPrettyPrintCommand,插件目录下存在一个AS语法规则文件AS3_ex.g3。
本发明依靠Antlr工具将语法规则文件解析获得语法解析器代码和词法解析器代码,eclipse的Antlr插件新版已升级为Antlr4,且语法文件的后缀也改成.g4,Antlr3插件繁杂,本发明将AS3_ex.g3文件改良为AS3_ex.g4。
经过上述步骤得到AS3_ex.g4文件,本发明通过eclipse插件Antlr4得到语法解析器源代码AS3_exParser.java和词法解析器源代码AS3_exLexer.java,本发明额外编写一个test.java文件调用语法解析器,将输入的源代码分割成单元语法填入语法解析树。本发明通过遍历语法树获取每个语法规则的实例,并将规则实例组装成Python可识别的代码输出。
四、修改语法规则
为方便初始测试代码生成,需要将繁杂的AS语法规则简化成简洁的语法规则,但不改变整个语法文件的语法繁杂度,即该语法文件实质上无任何改变。本发明需要简化的语法规则、修改方法和保存为Python可识别代码的形式如下:
(1)语法规则fileContents:
fileContents:
packageDeclaration?packageElement*
|EOF;
将其修改为二个语法规则:
fileContents_tmp:
packageDeclaration?packageElement*;
fileContents:
fileContents_tmp
|EOF;
本发明简化目标是语法子规则之间的与或和关系不能出现在同一语法规则中,即形如“a:b|c;”,“a:b c;”均为合规表示,但“a:b c|d;”为非法表示,需修改为“tmp:b c;”和“a:tmp|d;”。
(2)语法规则ifStatement:
ifStatement:
IF parExpression statement(ELSE statement)?;
修改为:
ifStatement:
IF parExpression statement(ifStatement_tmp)?;
ifStatement_tmp:ELSE statement;
(test)?表示test元素可出现的次数为0或者1,对这类语法规则,修改目标是()?内的元素必须是单语法规则,如“a:(b)?”表达方式合规,但“a:(b c)?”是非法的,需要修改为“tmp:b c;”和“a:(tmp)?”。
(3)语法规则propertyNameAndValueList:(one)*
propertyNameAndValueList:
propertyNameAndValue(COMMA propertyNameAndValue)*;
修改为:
propertyNameAndValueList_tmp:
COMMA propertyNameAndValue;
propertyNameAndValueList:
propertyNameAndValue(propertyNameAndValueList_tmp)*;
(test)*表示test元素可出现的次数为0次或者多次,对这类语法规则,修改目标是()*内的元素必须是单语法规则,如“a:(b)*”表达方式合规,但“a:(b c)*”是非法的,需修改为“tmp:b c;”和“a:(tmp)*”。
(4)语法规则interfaceElement:
interfaceElement:
conditionalCompilerOption LCURLY(interfaceElement*RCURLY)+
|propertyDeclaration
|interfaceFunctionDeclaration
|statement
|directive;
修改为:
interfaceElement_tmp:
conditionalCompilerOption LCURLY;
interfaceElement_tmp1:
interfaceElement*RCURLY;
interfaceElement_tmp2:
interfaceElement_tmp(interfaceElement_tmp1)+;
interfaceElement:
interfaceElement_tmp2
|propertyDeclaration
|interfaceFunctionDeclaration
|statement
|directive;
(test)+表示test元素可出现的次数为1次或者多次,对这类语法规则,修改目标是()+内的元素必须是单语法规则,如“a:(b)+”表达方式合规,但“a:(b c)+”是非法的,需修改为“tmp:b c;”和“a:(tmp)+”。
修改后的语法规则文件转换为Python可识别代码。例如,对语法规则booleanLiteral,它的Antlr4语法表达方式为:
booleanLiteral:
TRUE
|FALSE;
转换为Python代码,形式如下:
rule["booleanLiteral"]=Node("rule","booleanLiteral",[Node("atom","done","TRU E",1,"),Node("atom","done","FALSE",1,")],1,'|')
rule[“booleanLiteral”]代表语法规则实例“booleanLiteral”,Node为一个结点类,有几个主要属性:结点名字nodeName;结点类型typ,typ的取值范围是[“atom”,“block”],其中“atom”代表结点为完结结点,不能再用其它子结点按特定规则聚合表示,“block”代表非完结结点,结点可用其它子结点聚合表示;结点内容content是结点的内容;结点修饰符modifier,modifier的取值范围是[“?”,“*”,“+”,1],“?”代表结点出现1次或者0次,“*”代表结点出现0次或者多次,“+”代表结点出现1次或者多次,1代表无结点修饰符;子结点之间的聚合方式alternative,取值范围是[“&”,“|”,“”],“&”代表子结点之间是与关系,“|”代表子结点之间是或关系,“”代表忽略子结点之间关系。代码中[Node("atom","done","TRUE",1,″),Node("atom","done","FALSE",1,″)]表示语法规则booleanLiteral有二个子结点,子结点均是完结结点,内容分别为"TRUE"和"FALSE"。
本发明将AS语法文件中的所有修改后的语法规则都用上述Python代码形式表示,为接下来生成初始测试代码做准备。
五、生成初始测试代码
AS语言和一般的解释型脚本语言(如JavaScript)不同,AS语言需经过编译后才能执行。若测试对象是JavaScript解释引擎,执行某一句不符合语法规则的代码不会导致整个执行失败,仍能继续测试不影响后续的代码执行,但AS语言需要先经过编译器验证转变为字节码后才能进入执行模块,任何一行不合规的源代码都能导致编译失败,需更加严格的上下文约束。但本发明的工具不在生成初始测试代码阶段做任何约束,以保存代码的繁杂度,而是在生成代码后做规范化处理使其顺利通过编译器的验证。
按一定算法伸展初始语法规则,但不同语法规则之间可能有嵌套,这将导致无法完全伸展非完结结点,因此本发明需要引入人工干预来完结非完结结点,采用规则实例代替非完结结点的方法,加快产生初始测试代码的速度,且可以保证在某一时刻,所有结点均是完结结点。
本发明根据自定义策略采用的测试代码生成算法包括:深度优先伸展算法、宽度优先伸展算法和随机伸展算法。
(一)深度优先伸展算法
深度优先伸展算法基于深度优先搜索算法优化改良,首先将一个语法规则扩展SD次后,然后再对其它语法规则进行扩展。
深度优先伸展算法的流程为:首先输入一个初始语法规则[StratRule],语法表达式为“StartRule:ab;”,经过第一轮伸展后,语法规则集合变为[a,b];a的语法规则表达式为“a:c d;”,b的语法规则表达式为“b:W K;”,优先伸展语法规则a的结点,经过第二轮伸展后语法规则被伸展为[c,d,b];C的语法规则为“c:E;”,d的语法规则为“d:Q;”,经过第三轮伸展后,语法规则集合变成[E,d,b],当依次完成所有语法规则的伸展时,若语法规则集合中还包含非完结结点,则将其替换为之前获取得到的语法规则实例。深度优先伸展算法示例如图4所示,小写字母代表非完结结点,大写字母代表完结结点。
实现深度优先伸展算法的具体实施例为:需输入初始语法规则StartRule和需伸展的深度S,经过处理后将输出初始测试代码,以Python语言为背景实现,首先定义空列表ruleArray,将StartRule插入列表,用二层循环来控制伸展,外层的while循环保证每次都从列表中第一个符合要求的语法规则开始伸展,里层的for循环保证数组中所有语法规则均有机会被伸展。
首先从列表ruleArray中取出一个语法规则,判断该语法规则是否为完结结点,若是,则继续从列表中取出第二个语法规则继续循环,若不是则判断该语法规则被伸展的次数是否大于规定的临界值SD,若是,则从列表中继续取出下一个语法规则循环,若不是,则伸展结点并将伸展次数加1,然后跳出for循环,进入while循环中,继而又开始下一轮,取出列表ruleArray中符合条件的第一个语法规则,依此类推;若ruleArray列表中的所有语法规则均是完结结点或被伸展次数均达到初定临界值SD,则跳出while循环,结束语法规则的伸展;随后,遍历ruleArray中的语法规则,并将所有非完结结点替换为之前保存的语法规则实例,并输出初始测试代码。
(二)宽度优先伸展算法
宽度优先伸展算法基于宽度优先搜索算法优化改良,首先将所有语法规则伸展1次后,再继续从第一个语法规则开始进行第二轮伸展动作,直到所有语法规则均是完结结点或者遍历深度达到KD次。
宽度优先伸展算法的流程为:首先指定一个初始语法规则StartRule,语法规则集合为[StrartRule],语法规则表达式为“StartRule:a b;”,经过第一轮编译后,语法规则集合变为[a,b];a的语法规则表达式为“a:c d;”,b的语法规则表达式为“b:E;”,第二轮伸展需将语法规则a和b都伸展,语法规则集合变为[c,d,E];c的语法规则表达式为”c:F;”,d的语法规则表达式为”d:G;”,E已是完结结点,无法继续伸展,第三轮伸展后,语法规则集合变为[F,G,E];若语法规则伸展结束后,语法规则集合中还包含有非完结结点,则用之前获取的语法规则实例一对一代替,如图5所示。
宽度优先伸展算法也需要提供初始语法规则StartRule和伸展深度KD,伪代码中有二层循环结构,外循环保证伸展深度,内循环保证宽度优先伸展;首先从ruleArray中取出第一个语法规则,若该语法规则是完结结点,则将其伸展深度加一并将伸展后得到的语法规则追加到ruleArray后面,ruleArray中的所有语法规则都被伸展后,删除伸展之前的语法规则,确保ruleArray中的语法规则简洁,依次进行宽度优先伸展,直到ruleArray中的所有语法规则伸展次数超过预定的伸展临界值KD;结束语法规则伸展过程后,将ruleArray中的所有非完结结点用预先收集的语法规则实例代替,最后输出初始测试代码。
(三)随机伸展算法
随机伸展算法是每次进行语法规则伸展之前都随机选择下一轮的伸展方法,本发明将时间作为随机算子,指定初始的语法规则StartRule,语法规则集合为[StartRule],由于“StartRule:a b;”,无论是深度优先伸展算法还是宽度优先伸展算法,语法规则集合都扩展为[a,b];根据随机算法,第二轮伸展策略选定为宽度优先伸展,语法规则a的语法规则表达式为“a:c d”,语法规则b的语法规则表达式为“b:e;”,语法规则集合扩展为[c,d,e];第三轮伸展策略选定为深度优先伸展,语法规则c的语法规则表达式是“c:f”,语法规则集合伸展为[f,d,e];第四轮伸展策略若又被选定为深度优先伸展,语法规则f的语法规则表达式为“f:G”,则经过四轮伸展后语法规则集合变为[G,d,e];若此时终止伸展语法规则,则用之前获取到的语法规则实例代替掉非完结结点d和e,如图6所示。
随机伸展算法是深度优先伸展算法和宽度优先伸展算法的融合,在每一轮伸展之前,本发明以时间为随机算子随机选择伸展策略,然后根据深度优先伸展算法或者宽度优先伸展算法进行伸展,通过设置最大伸展次数控制伸展深度。
六、代码规范化
本发明在生成初始测试代码阶段没有对代码生成过程进行任何约束,产生的初始测试代码有一定概率有非法语法结构,所以需要对初始测试代码进行代码规范化处理。
测试代码段中存在一处非法语法结构,将导致整个代码段编译失败。语法结构越繁杂的初始测试代码越可能存在非法语法结构,本发明将测试代码语法结构简洁化,将“functionDeclaration”,“forEachInStatement”,“forInStatement”,“whileStatement”,“doWhileStatement”,“forStatement”,“switchStatement”,“withStatement”,“ifStatement”常用的简洁语法结构作为初始输入,分别生成初始测试代码,然后将其聚合成繁杂的测试代码。
产生的测试代码片段有的完全合规,有的含有非法语法结构,需要使用之前获取的语法解析器筛选出合规的语法结构,这种后约束式的代码产生方法是本发明的一个创新点。但合规的语法结构并不能保证代码能通过编译器验证,未定义的变量、函数和类依然会导致编译失败,本发明借鉴ScriptGene提出的运行时变异来修复该问题。
(一)运行时类信息的提取
本发明主要从二个文件中提取运行时类信息:ActionsPanel_3.xml和catlog.xml文件。
ActionsPanel_3.xml文件从Adobe Flash Professional CS6目录中获取,内部含有一些调用函数、声明变量、创建类对象使用的规范;catlog.xml是从Adobe官方提供的playerglobal.swc中解压缩出来的xml文件,其中包括运行时类名和API函数;本发明通过Flash自带的反射机制,输入类名获取每个类结构的xml表述;catlog.xml中的类并不全能成功运用反射机制获取相关类信息,但绝大部分都能获取,本发明舍弃获取类信息失败的一部分类。将获取到的类信息存入一个Python类中,其类属性包括类所在的包名packageName,便于后续导入对应的包名,即“import packageName;”;父类名parentsName;类名className;常量名constAttri;变量名varAttri;实现名implementName;get和set函数定义的属性accessorAttri;函数信息methode。
(二)标识符的标记
为使初始测试代码片段有合规的上下文,需要将初始测试代码用产生的词法解析器标记标识符的类型,即函数类型、函数名、函数声明、变量名、变量类型经过词法解析器处理后会被标记;词法解析器维护上下文,根据词法token序列每个identifier的前后几个token判别每个identifier的具体指代意义。比如若当前token表示“function”,则将当前语境切换为函数声明语境;若当前token是“:”,且无任何语境,则切换为类型语境;在函数声明语境中,第一个identifier表示函数名,通过规则限制将代码片段中的标识符标记。
有初始测试代码经过词法解析器标记后,会产生相同的中间文件,为避免重复工作,根据中间文件的MD5值删除重复的文件。
(三)标记的代替
代替标记步骤产生能通过编译器验证的测试代码,但本发明之前获取的测试代码分语法结构,不能保证语义完整性,因此本发明准备一个模板类,逐步代替内部的标签产生语义完整的代码片段。
模板文件将_functionDeclaration_,_constantVarStatement_,_forEachInStatement_,_whileStatement_,_forInStatement_,_variableStatement_,_returnStatement_,_withStatement_,_doWhileStatement_,_ifStatement_,_tryStatement_,_forStatement_,_switchStatement_标签分别用生成的with测试代码,while测试代码,for测试代码,常量定义测试代码,switch测试代码,变量定义测试代码,do_while测试代码,函数定义测试代码,if测试代码,try测试代码,返回语句测试代码,for测试代码代替,形成构造完整的目标AS文件。
但仅做该处理还远不能产生能顺利通过编译器的AS代码,还需要解决未定义变量和函数问题。将目标AS文件中所含的所有变量和函数都替换为采集到的运行时类信息,随机从运行时类库中选取二个或者多个类,然后用“importpackageName;”代替标签“_import_”;为每个类初始化一个变量,初始化变量的代码代替标签“_globalvardeclaration_”,同时初始化几个基本类型的变量供后续使用。
目标AS代码中模板文件相关标签代替完后,逐行代替之前词法解析标记的标签。优先代替_varname_标记为类的实例对象,但若出现“_varname_-=10;”这类语句时,将_varname_代替为int类型的myNum变量。此外根据测试结果定向修复一些难以通过编译的语义错误,如语法结构“var var var…”,将多余的var标记删除;根据采用运行时类的函数代替“_funcall_”标记。
本发明此处的一个创新之处在于对运行时类的采用,通过对已有Flash缺陷的解析,总结出容易导致目标系统错误的危险类,然后对这些类赋予较大的权值,在代替标记时更倾向于采用危险类代替,提高目标对象的缺陷检测率。
七、批量编译AS文件
完成以上所有过程后,得到能通过编译器的AS目标文件,但AVM只能接受SWF格式的文件,所以需要将所有目标AS文件批量编译成SWF文件。
编译AS文件采用编译命令mxmlc,并额外编写一个批处理bat文件来批量编译目标AS文件,然后批量执行SWF文件测试AVM,并将导致Crash的文件记录下来并进行解析。
八、测试解析AVM
将所有SWF文件放在同一个进程中执行,用AS3语言实现,并将windbg调试器设为默认调试器,一旦目标系统崩溃,windbg就可以附加到崩溃进程,模糊测评工具可以进一步解析。
九、性能分析和测试
本发明研发并实现了一个基于语法规则的面向编译型语言的模糊测评工具,产生能通过编译器验证的AS代码,将文件批量编译成SWF文件,用于测试AVM虚拟机,发掘虚拟机存在的潜在缺陷,挖掘Flash的漏洞。
本发明通过运行时转化来产生能顺利通过编译器的代码片段,但在运用语法规则文件和语法规则实例生成初始测试代码段时,并未删减语法结构来弱化语法结构的繁杂度,为获取符合语法解析器约束的代码片段,本发明通过生成单一的语法结构片段,筛选出符合语法解析器约束的代码片段,随机聚合形成最终符合编译器语法约束的代码文件,并在规范化代码的运行时变异阶段为从已有缺陷中采集到的危险类赋予较高的权值,来启发式的变异。
实验结果显示,本发明面向编译型语言AS3的Flash缺陷模糊测评工具代码覆盖率完全覆盖标准测试集,还扩展了部分语法结构,且在扩展深度采用为5时效果最好。本发明工具的优势未得到充分展示,只在flashplayer_11_sa目标软件中挖掘了一个Crash,接下来继续通过本发明的工具生成畸形测试文件,必然会找到Flash软件更多的Bug。
Claims (10)
1.面向编译型语言AS3的Flash缺陷模糊测评工具,其特征在于,利用语法规则文件分析代码的语法组成,根据语法组成产生或者变异得出测试文件集,采用Antlr测试支持AS3语言执行的AVM虚拟机,AS3语言用于Flash组件的开发,通过编译器验证生成可执行代码后才能执行;
本发明通过解析AS3语法规则文件生成AS语法解析器和词法解析器,然后采用语法解析器对AVM的标准测试集Tamarin进行语法解析获取语法规则实例并以Python语言可识别的格式存储,再根据自定义策略选择深度优先伸展算法或者广度优先伸展算法或者随机伸展算法对语法规则进行聚合形成中间文件,并使用之前获得的语法规则实例代替对应的语法规则生成初始测试代码,逐步选取不同的简洁语法规则,并从中筛选出能通过语法解析器约束的代码片段,将这些代码片段随机组合成可通过语法解析器约束的AS源文件,源文件进一步规范化为可通过编译器验证的源代码,规范化过程利用运行时库信息代替源代码中的函数、变量,并修复可导致编译失败的上下文,最终生成可被编译器验证的源文件,将源文件批量编译成可被AVM识别的SWF文件格式后,对不同版本的AVM进行测评,寻找存在的潜在漏洞和缺陷。
2.根据权利要求1所述的面向编译型语言AS3的Flash缺陷模糊测评工具,其特征在于,本发明实施方案路径采用基于语法规则的黑盒模糊测试,测试用例的产生策略采用基于生成的缺陷发掘方法。
3.根据权利要求1所述的面向编译型语言AS3的Flash缺陷模糊测评工具,其特征在于,总体架构为测评工具从外部获取第三方提供的标准测试集和AS3语法文件,根据AS语法规则将标准测试集的代码解析分割为大量的语法实例片段并保存为中间文件,将第三方提供的AS语法文件中繁杂的语法规则修改成多个简洁语法规则,方便后续代码生成步骤的运用,此处对语法文件的语法规则约束无任何影响,其后根据修改的AS语法文件随机聚合语法实例生成初始测试代码片段;对代码片段做规范化处理,将生成的代码片段预先经过语法解析器筛选过滤,并规范化处理后再送入编译器进行编译,增加通过编译器的代码量;最后将编译后生成的SWF文件送入不同版本的AVM虚拟机中进行测试,并将测试结果输出记录;
本发明使用的标准测试集是Tamarin,Tamarin是开源的AVM,其中包含验证测试集,语法文件从eclipse的AS编辑插件中提取,该插件帮助eclipse识别AS文件的关键字、变量并高亮这些标识符,修改语法规则的目标是一个语法规则中不包含多个连接元素,规范化代码时首先生成含有if语法结构、for语法结构、while语法结构的简洁语法结构代码片段,过滤淘汰语法解析器无法解析的非法代码,然后随机聚合成能通过语法解析器的代码,最后依靠运行时类信息修复剩余的语法缺陷使其能通过编译器的验证,生成可执行的SWF文件。
4.根据权利要求1所述的面向编译型语言AS3的Flash缺陷模糊测评工具,其特征在于,获取语法规则实例需第三方标准测试集和第三方提供的语法规则文件的支持,第三方标准测试集为Tamarin,第三方AS语法规则文件取自eclipse的插件;本发明依靠Antlr工具将语法规则文件解析获得语法解析器代码和词法解析器代码,通过eclipse插件Antlr4得到语法解析器源代码AS3_exParser.java和词法解析器源代码AS3_exLexer.java,本发明额外编写一个test.java文件调用语法解析器,将输入的源代码分割成单元语法填入语法解析树,通过遍历语法树获取每个语法规则的实例,并将规则实例组装成Python可识别的代码输出。
5.根据权利要求1所述的面向编译型语言AS3的Flash缺陷模糊测评工具,其特征在于,深度优先伸展算法基于深度优先搜索算法优化改良,首先将一个语法规则扩展SD次后,然后再对其它语法规则进行扩展;
深度优先伸展算法的流程为:首先输入一个初始语法规则[StratRule],语法表达式为“StartRule:ab;”,经过第一轮伸展后,语法规则集合变为[a,b];a的语法规则表达式为“a:c d;”,b的语法规则表达式为“b:W K;”,优先伸展语法规则a的结点,经过第二轮伸展后语法规则被伸展为[c,d,b];C的语法规则为“c:E;”,d的语法规则为“d:Q;”,经过第三轮伸展后,语法规则集合变成[E,d,b],当依次完成所有语法规则的伸展时,若语法规则集合中还包含非完结结点,则将其替换为之前获取得到的语法规则实例;
实现深度优先伸展算法的具体实施过程为:需输入初始语法规则StartRule和需伸展的深度S,经过处理后将输出初始测试代码,以Python语言为背景实现,首先定义空列表ruleArray,将StartRule插入列表,用二层循环来控制伸展,外层的while循环保证每次都从列表中第一个符合要求的语法规则开始伸展,里层的for循环保证数组中所有语法规则均有机会被伸展;
首先从列表ruleArray中取出一个语法规则,判断该语法规则是否为完结结点,若是,则继续从列表中取出第二个语法规则继续循环,若不是则判断该语法规则被伸展的次数是否大于规定的临界值SD,若是,则从列表中继续取出下一个语法规则循环,若不是,则伸展结点并将伸展次数加1,然后跳出for循环,进入while循环中,继而又开始下一轮,取出列表ruleArray中符合条件的第一个语法规则,依此类推;若ruleArray列表中的所有语法规则均是完结结点或被伸展次数均达到初定临界值SD,则跳出while循环,结束语法规则的伸展;随后,遍历ruleArray中的语法规则,并将所有非完结结点替换为之前保存的语法规则实例,并输出初始测试代码。
6.根据权利要求1所述的面向编译型语言AS3的Flash缺陷模糊测评工具,其特征在于,宽度优先伸展算法基于宽度优先搜索算法优化改良,首先将所有语法规则伸展1次后,再继续从第一个语法规则开始进行第二轮伸展动作,直到所有语法规则均是完结结点或者遍历深度达到KD次;
宽度优先伸展算法的流程为:首先指定一个初始语法规则StartRule,语法规则集合为[StrartRule],语法规则表达式为“StartRule:a b;”,经过第一轮编译后,语法规则集合变为[a,b];a的语法规则表达式为“a:c d;”,b的语法规则表达式为“b:E;”,第二轮伸展需将语法规则a和b都伸展,语法规则集合变为[c,d,E];c的语法规则表达式为”c:F;”,d的语法规则表达式为”d:G;”,E已是完结结点,无法继续伸展,第三轮伸展后,语法规则集合变为[F,G,E];若语法规则伸展结束后,语法规则集合中还包含有非完结结点,则用之前获取的语法规则实例一对一代替;
宽度优先伸展算法需要提供初始语法规则StartRule和伸展深度KD,伪代码中有二层循环结构,外循环保证伸展深度,内循环保证宽度优先伸展;首先从ruleArray中取出第一个语法规则,若该语法规则是完结结点,则将其伸展深度加一并将伸展后得到的语法规则追加到ruleArray后面,ruleArray中的所有语法规则都被伸展后,删除伸展之前的语法规则,确保ruleArray中的语法规则简洁,依次进行宽度优先伸展,直到ruleArray中的所有语法规则伸展次数超过预定的伸展临界值KD;结束语法规则伸展过程后,将ruleArray中的所有非完结结点用预先收集的语法规则实例代替,最后输出初始测试代码。
7.根据权利要求1所述的面向编译型语言AS3的Flash缺陷模糊测评工具,其特征在于,随机伸展算法是每次进行语法规则伸展之前都随机选择下一轮的伸展方法,本发明将时间作为随机算子,指定初始的语法规则StartRule,语法规则集合为[StartRule],由于“StartRule:a b;”,无论是深度优先伸展算法还是宽度优先伸展算法,语法规则集合都扩展为[a,b];根据随机算法,第二轮伸展策略选定为宽度优先伸展,语法规则a的语法规则表达式为“a:c d”,语法规则b的语法规则表达式为“b:e;”,语法规则集合扩展为[c,d,e];第三轮伸展策略选定为深度优先伸展,语法规则c的语法规则表达式是“c:f”,语法规则集合伸展为[f,d,e];第四轮伸展策略若又被选定为深度优先伸展,语法规则f的语法规则表达式为“f:G”,则经过四轮伸展后语法规则集合变为[G,d,e];若此时终止伸展语法规则,则用之前获取到的语法规则实例代替掉非完结结点d和e;
随机伸展算法是深度优先伸展算法和宽度优先伸展算法的融合,在每一轮伸展之前,本发明以时间为随机算子随机选择伸展策略,然后根据深度优先伸展算法或者宽度优先伸展算法进行伸展,通过设置最大伸展次数控制伸展深度。
8.根据权利要求1所述的面向编译型语言AS3的Flash缺陷模糊测评工具,其特征在于,本发明从二个文件中提取运行时类信息:ActionsPanel_3.xml和catlog.xml文件;
ActionsPanel_3.xml文件从Adobe Flash Professional CS6目录中获取,内部含有一些调用函数、声明变量、创建类对象使用的规范;catlog.xml是从Adobe官方提供的playerglobal.swc中解压缩出来的xml文件,其中包括运行时类名和API函数;本发明通过Flash自带的反射机制,输入类名获取每个类结构的xml表述;catlog.xml中的类并不全能成功运用反射机制获取相关类信息,但绝大部分都能获取,本发明舍弃获取类信息失败的一部分类;将获取到的类信息存入一个Python类中,其类属性包括类所在的包名packageName,便于后续导入对应的包名,即“import packageName;”;父类名parentsName;类名className;常量名constAttri;变量名varAttri;实现名implementName;get和set函数定义的属性accessorAttri;函数信息methode。
9.根据权利要求1所述的面向编译型语言AS3的Flash缺陷模糊测评工具,其特征在于,将初始测试代码用产生的词法解析器标记标识符的类型,即函数类型、函数名、函数声明、变量名、变量类型经过词法解析器处理后会被标记;词法解析器维护上下文,根据词法token序列每个identifier的前后几个token判别每个identifier的具体指代意义;
有初始测试代码经过词法解析器标记后,会产生相同的中间文件,根据中间文件的MD5值删除重复的文件。
10.根据权利要求1所述的面向编译型语言AS3的Flash缺陷模糊测评工具,其特征在于,代替标记步骤产生能通过编译器验证的测试代码,本发明准备一个模板类,逐步代替内部的标签产生语义完整的代码片段;
模板文件将_functionDeclaration_,_constantVarStatement_,_forEachInStatement_,_whileStatement_,_forInStatement_,_variableStatement_,_returnStatement_,_withStatement_,_doWhileStatement_,_ifStatement_,_tryStatement_,_forStatement_,_switchStatement_标签分别用生成的with测试代码,while测试代码,for测试代码,常量定义测试代码,switch测试代码,变量定义测试代码,do_while测试代码,函数定义测试代码,if测试代码,try测试代码,返回语句测试代码,for测试代码代替,形成构造完整的目标AS文件;
将目标AS文件中所含的所有变量和函数都替换为采集到的运行时类信息,随机从运行时类库中选取二个或者多个类,然后用“importpackageName;”代替标签“_import_”;为每个类初始化一个变量,初始化变量的代码代替标签“_globalvardeclaration_”,同时初始化几个基本类型的变量供后续使用;目标AS代码中模板文件相关标签代替完后,逐行代替之前词法解析标记的标签;
通过对已有Flash缺陷的解析,总结出容易导致目标系统错误的危险类,然后对这些类赋予较大的权值,在代替标记时更倾向于采用危险类代替。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202010544494.5A CN111694746A (zh) | 2020-06-15 | 2020-06-15 | 面向编译型语言AS3的Flash缺陷模糊测评工具 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202010544494.5A CN111694746A (zh) | 2020-06-15 | 2020-06-15 | 面向编译型语言AS3的Flash缺陷模糊测评工具 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN111694746A true CN111694746A (zh) | 2020-09-22 |
Family
ID=72481241
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202010544494.5A Pending CN111694746A (zh) | 2020-06-15 | 2020-06-15 | 面向编译型语言AS3的Flash缺陷模糊测评工具 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN111694746A (zh) |
Cited By (6)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN112631901A (zh) * | 2020-12-16 | 2021-04-09 | 中国科学院信息工程研究所 | 基于妨碍特征的模糊测试工具测试方法及电子装置 |
CN112749097A (zh) * | 2021-01-26 | 2021-05-04 | 杭州木链物联网科技有限公司 | 一种模糊测试工具性能测评方法、装置 |
CN113282932A (zh) * | 2021-07-22 | 2021-08-20 | 杭州安恒信息技术股份有限公司 | 一种poc生成方法、装置、电子设备和存储介质 |
CN113419960A (zh) * | 2021-07-01 | 2021-09-21 | 中国人民解放军国防科技大学 | 用于可信操作系统内核模糊测试的种子生成方法及系统 |
CN113535591A (zh) * | 2021-09-13 | 2021-10-22 | 季华实验室 | 机器人程序的验证方法、装置、电子设备及存储介质 |
CN116909572A (zh) * | 2023-08-04 | 2023-10-20 | 上海安般信息科技有限公司 | 一种基于自定义文法的解析器及推导树代码生成系统 |
-
2020
- 2020-06-15 CN CN202010544494.5A patent/CN111694746A/zh active Pending
Cited By (10)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN112631901A (zh) * | 2020-12-16 | 2021-04-09 | 中国科学院信息工程研究所 | 基于妨碍特征的模糊测试工具测试方法及电子装置 |
CN112631901B (zh) * | 2020-12-16 | 2023-08-08 | 中国科学院信息工程研究所 | 基于妨碍特征的模糊测试工具测试方法及电子装置 |
CN112749097A (zh) * | 2021-01-26 | 2021-05-04 | 杭州木链物联网科技有限公司 | 一种模糊测试工具性能测评方法、装置 |
CN112749097B (zh) * | 2021-01-26 | 2024-02-13 | 浙江木链物联网科技有限公司 | 一种模糊测试工具性能测评方法、装置 |
CN113419960A (zh) * | 2021-07-01 | 2021-09-21 | 中国人民解放军国防科技大学 | 用于可信操作系统内核模糊测试的种子生成方法及系统 |
CN113419960B (zh) * | 2021-07-01 | 2022-06-14 | 中国人民解放军国防科技大学 | 用于可信操作系统内核模糊测试的种子生成方法及系统 |
CN113282932A (zh) * | 2021-07-22 | 2021-08-20 | 杭州安恒信息技术股份有限公司 | 一种poc生成方法、装置、电子设备和存储介质 |
CN113535591A (zh) * | 2021-09-13 | 2021-10-22 | 季华实验室 | 机器人程序的验证方法、装置、电子设备及存储介质 |
CN116909572A (zh) * | 2023-08-04 | 2023-10-20 | 上海安般信息科技有限公司 | 一种基于自定义文法的解析器及推导树代码生成系统 |
CN116909572B (zh) * | 2023-08-04 | 2024-03-12 | 上海安般信息科技有限公司 | 一种基于自定义文法的解析器及推导树代码生成系统 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN111694746A (zh) | 面向编译型语言AS3的Flash缺陷模糊测评工具 | |
US20200264870A1 (en) | Automating Generation of Library Suggestion Engine Models | |
Offutt et al. | Generating test data from state‐based specifications | |
Martin et al. | Finding application errors and security flaws using PQL: a program query language | |
US6986125B2 (en) | Method and apparatus for testing and evaluating a software component using an abstraction matrix | |
Holler et al. | Fuzzing with code fragments | |
Jensen et al. | Remedying the eval that men do | |
Chen et al. | Star: Stack trace based automatic crash reproduction via symbolic execution | |
US6944848B2 (en) | Technique using persistent foci for finite state machine based software test generation | |
US6941546B2 (en) | Method and apparatus for testing a software component using an abstraction matrix | |
Tonella et al. | Dynamic model extraction and statistical analysis of web applications | |
US8732676B1 (en) | System and method for generating unit test based on recorded execution paths | |
Sacramento et al. | Web application model generation through reverse engineering and UI pattern inferring | |
CN113157597A (zh) | 结构解析方法、装置、电子设备和存储介质 | |
Reger | Automata based monitoring and mining of execution traces | |
CN111428233A (zh) | 一种嵌入式设备固件的安全性分析方法 | |
CN111222141A (zh) | 一种汽车电控单元代码漏洞分析方法和系统 | |
Brito et al. | Study of JavaScript Static Analysis Tools for Vulnerability Detection in Node. js Packages | |
CN114491560A (zh) | 一种漏洞检测方法、装置、存储介质及电子设备 | |
CN108334441A (zh) | 一种软件开发工具包的自动化测试方法和系统 | |
CN111625448B (zh) | 协议包生成方法、装置、设备及存储介质 | |
Rosario Espada et al. | A formal approach to automatically analyse extra‐functional properties in mobile applications | |
Mortensen et al. | Adequate testing of aspect-oriented programs | |
CN116541022A (zh) | 一种基于语义状态图的php二阶漏洞的自动化挖掘方法 | |
CN115310095A (zh) | 一种区块链智能合约混合形式化验证方法及系统 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination |