CN102141959B - 一种受上下文无关文法约束的测试用例生成方法 - Google Patents
一种受上下文无关文法约束的测试用例生成方法 Download PDFInfo
- Publication number
- CN102141959B CN102141959B CN 201110062021 CN201110062021A CN102141959B CN 102141959 B CN102141959 B CN 102141959B CN 201110062021 CN201110062021 CN 201110062021 CN 201110062021 A CN201110062021 A CN 201110062021A CN 102141959 B CN102141959 B CN 102141959B
- Authority
- CN
- China
- Prior art keywords
- test case
- context
- free grammar
- test
- legal
- 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.)
- Expired - Fee Related
Links
Images
Landscapes
- Stored Programmes (AREA)
- Debugging And Monitoring (AREA)
Abstract
本发明公开了一种受上下文无关文法约束的测试用例生成方法,属于软件工程技术领域。本方法为:首先编写一定数量的合法测试用例,根据上下文无关文法分析其语法结构得到解析树,对于每种可能出现的语法成分,构造该成分在已编写测试用例中所生成的子串集合;然后遍历解析树,对于解析树中的每个语法成分,使用相应子串集合中的其它子串来替换该语法成分在当前测试用例中生成的子串,从而得到新的结构更复杂的测试用例。本发明有效避免了生成型数据生成方式固有的状态空间爆炸以及难以满足语义约束等缺陷,测试用例的生成速度快,得到的测试用例结构更复杂且满足语义约束;本发明可对输入数据具备上下文无关文法约束的计算机软件进行安全性测试。
Description
技术领域
本发明涉及一种为软件安全性测试生成测试用例的方法,尤其涉及一种使用变异型策略为Fuzzing测试生成受上下文无关文法约束的测试用例的方法,属于软件工程技术领域。
背景技术
安全漏洞的存在对于信息系统是一个极大的威胁。攻击者可以借助漏洞使目标主机发生崩溃,造成计算机系统无法正常工作,甚至能够突破安全防御,获取系统的访问权限,完成诸如盗窃敏感文件、安装后门程序等恶意行为。因此,在软件开发完成后,有必要展开安全性测试,尽可能发现其中存在的漏洞并采取措施修复,确保信息系统安全可靠。
在实践中,Fuzzing测试是最流行的一种用于挖掘漏洞的安全性测试技术。Fuzzing技术属于软件测试领域的黑盒测试类型,它不关心程序内部的工作机制,而是根据程序对外展现的接口,构造大量半有效的测试用例作为输入,以程序是否出现异常为标志,来判断是否存在安全漏洞。Fuzzing测试能够快速地找到大范围的缓冲区溢出、整数溢出、格式化字符串等类型的漏洞,是一种代价低且行之有效的漏洞挖掘技术,在业界已经得到广泛的应用。
Fuzzing测试的一项关键是测试用例的生成技术。好的测试用例应该是半有效的。所谓“半有效”,是指测试用例从整体上看符合程序期待的格式规范,以便通过最初的输入验证,执行到达核心的数据处理代码;同时,测试用例的部分关键字段必须是无效的,这样才能触发隐藏在核心代码中的深层次错误。通常,Fuzzing测试的测试用例生成技术可以分为两类:生成型(Generational)和变异型(Mutational)。生成型方式需要首先编写用以描述测试对象输入格式的模板,之后Fuzzing工具将根据一定的规则填充模板,产生测试用例;对于变异型方式,操作者需要提供正常有效的输入数据样本,Fuzzing工具以此为起点,对样本中的某些域进行变化,从而得到新的变异后的测试用例。
目前安全研究人员已经开发出大量Fuzzing工具,可用于各种不同类型的软件进行安全性测试。这些工具可用于测试的输入类型包括网络报文、文件格式、API接口(包括动态链接库和COM组件/ActiveX)等。这些输入类型的共同特点是:数据由二进制格式描述,以数据域(Field)为单位进行组织;各个域之间的关系较为简单,其中多数域是独立的数据单元,无论对其中的数据进行怎样的修改,修改后的整体输入仍是合法的。一个典型的例子就是TCP报文:TCP报文由二进制数据构成,其中含有大量不可打印字符;整个报文被划分成一个个的域,分别用于表示源端口、目的端口、序列号等;不同的域之间的关系较为简单,只有“校验和”域上存在约束(必须是TCP头部所有域的校验和),对于其它的域如源端口,任意改变其中的值,整个报文仍旧是合法的TCP报文。针对这类数据的Fuzzing测试技术研究上已经非常成熟,现有工具都能较好地进行处理。
与此同时,也有些常用而重要的软件,它们的输入数据显现出与以上描述完全不同的特征。这方面的典型例子如网络浏览器及其要处理的JavaScript脚本。首先,JavaScript脚本是纯文本格式的,基本组成结构是语法记号而非二进制域;其次,JavaScript语言具有严格的语法结构,各语法记号的存在与否及其顺序都要符合上下文无关文法的约束,即使脚本中一个字符出现错误,都有可能导致浏览器无法解析脚本,从而达不到测试的效果。目前现有的Fuzzing工具大都无法对这类输入进行有效的测试。
发明内容
本发明的目的是设计一种为Fuzzing测试生成受上下文无关文法约束的测试用例的方法,以允许Fuzzing工具对处理此类输入的软件(如浏览器,数据库服务器系统等)进行安全性测试。本发明的技术方案为:
一种基于上下文无关文法的变异型Fuzzing测试用例生成方法,其步骤为:
1)编写一定数量的合法测试用例,这些测试用例构成的集合称为初始集合,记作I。合法的测试用例为符合目标程序上下文无关文法约束的、能被目标程序正确地接受和处理的测试用例。对于I中测试用例的数量并没有一个固定的要求,但这些测试用例最好能够覆盖上下文无关文法中可能出现的每种语法结构;
2)对于I中的每个测试用例,使用上下文无关文法分析其语法结构,得到一个解析树T,T中的每个内结点n都代表文法中的一个非终结符N,同时也对应测试用例中由该非终结符所生成的子串s;
3)遍历解析树T,对于其中的每个内结点n,找到相应的非终结符N所生成的测试用例的子串s,将s加入非终结符N可以生成的字符串集合中,该集合记为FragN;
4)对I中的每个测试用例均执行步骤2、3中的操作。在本步骤结束时,对于上下文无关文法中每个非终结符N,都存在一个N可以生成的字符串的集合FragN;
5)创建一个空队列Q,为Q设定一个测试用例的入队条件P(例如长度小于一个预设值),并将初始集合I中的合法测试用例作为初始种子测试用例全部加入到队列Q中。同时创建一个空集合GEN,用于存放后续步骤中生成的新测试用例;
6)从队列Q的队头取出一个初始种子测试用例c,使用上下文无关文法分析其语法结构,得到一个解析树Tc;
7)遍历解析树Tc,对于其中的每个内结点nc,执行如下操作:首先找到nc相应的非终结符N在测试用例c中生成的子串sc,然后使用集合FragN中的每个与sc不同的字符串来替代测试用例c的子串sc,从而得到一系列新的测试用例。对于其中每个新的测试用例c’,如果c’已经在集合GEN中出现,则将其丢弃;否则,将c’加入集合GEN中,并且如果c’还满足Q中预定的入队条件P,则将c’作为新的种子添加到队列Q的队尾;
8)重复执行步骤6、7直到队列Q中的种子测试用例被全部从队头取出。此时将集合GEN中的全部元素作为本方法所生成的Fuzzing测试用例而输出。
本发明的积极效果为:
本发明首次提出了一种基于上下文无关文法的变异型Fuzzing测试用例生成方法。首先,该方法基于上下文无关文法,能够生成符合文法约束的测试用例,可以用于对网络浏览器软件、数据库服务器系统等以此类数据为输入的软件进行安全性测试,填补了当前通用Fuzzing框架在该领域的空白;其次,该方法使用了Fuzzing测试中的变异型(Mutational)数据生成方式,有效避免了生成型(Generational)数据生成方式固有的状态空间爆炸以及难以满足语义约束等缺陷,测试用例的生成速度快,得到的测试用例结构更复杂,并且绝大多数情况下都满足语义约束。该方法具有:有效性,在使用该方法对浏览器的XPath语言处理代码进行Fuzzing测试后,共发现1个双重释放漏洞(CVE编号:CVE-2010-4494)和1个野指针调用漏洞,分别影响Google Chrome/Apple Safari和Opera浏览器,两个漏洞均属高危漏洞;通用性,无论何种具备上下文无关文法的输入类型,都可以使用该方法来生成这种类型的Fuzzing测试用例,从而解决一大类输入类型的安全性测试问题。
附图说明
图1是正整数四则运算上下文无关文法的语法图表示,其中:
(a)、表达式(expression)在该文法中的产生式规则,
(b)、加减法表达式(additiveExpression)在该文法中的产生式规则,
(c)、乘除法表达式(multiplicativeExpression)在该文法中的产生式规则,
(d)、主表达式(primaryExpression)在该文法中的产生式规则;
图2为本发明方法的流程示意图;
图3是对四则运算表达式“39-24/(30+8)”进行语法分析后得到的解析树。
具体实施方式
下面结合附图详细描述本发明的具体实施方式。
假设需要对一个正整数四则运算计算器程序进行安全性测试。该程序的输入是四则运算表达式,其中运算数为正整数,运算符为加、减、乘和除,并且允许使用括号来定义运算的优先级次序。这类输入可以由上下文无关文法描述,相应文法的文字表示为(使用ANTLR V3格式):
其中expression、additiveExpression、multiplicativeExpression和primaryExpression都是非终结符,分别表示表达式、加减法表达式、乘除法表达式和主表达式;PLUS、MINUS、MULT、DIV和INTEGER都是终结符,分别表示运算符加(“+”)、运算符减(“-”)、运算符乘(“×”)、运算符除(“/”)以及正整数运算数。与该上下文无关文法相对应的语法图如图1所示。
参见图2,为本发明方法的流程示意图。对上述程序进行安全性测试可遵循以下步骤:
1.编写合法测试用例的集合即初始种子集合。根据被测程序的特点,初始种子集合应为一个正整数四则运算表达式的集合。因此,可以编写如下三条测试用例并加入初始种子集合中:
39-24/(30+8)
9-(1680/8)/7
((87-43)*8-29)*8
这些测试用例都是合法的正整数四则运算表达式,并且含有加减乘除四种运算符和括号,覆盖了上下文无关文法中出现的各种语法结构。
2.使用上下文无关文法分析每个测试用例的语法结构,生成解析树。多数已有的语法分析工具都可以实现这一功能,其中较为常用的有JavaCC和ANTLR。以表达式39-24/(30+8)为例,在使用四则运算上下文无关文法对其语法结构进行分析后,可得到如图3所示的解析树。
3.对步骤2中得到的解析树进行遍历,遍历顺序可以从深度优先和广度优先中任选其一,但要求在遍历同一父结点下的子结点时,位于左侧的子结点应先于右侧的子结点。每当访问到一个内结点时,该结点的名称即为它所对应的非终结符。考察以该内结点为根的子树,将子树所有叶结点中的文本按照遍历顺序连接在一起,即得到前述非终结符所能生成的一个字符串,此时应将该字符串加入非终结符可以生成的字符串集合中。
以图3中的解析树为例。遍历顺序采用深度优先遍历,当遍历至图3中含有阴影的结点时,该结点的名称为additiveExpression,因此以该结点为根的子树是由非终结符additiveExpression生成的。将该子树的三个叶结点中的文本“30”、“+”和“8”按照遍历顺序连接,即得到非终结符additiveExpression所能生成的一个子串“30+8”。这时,将该子串添加到additiveExpression可以生成的字符串集合中,得到FragadditiveExpression为:
FragadditiveExpression={“39-24/(30+8)”,“30+8”}
4.重复执行步骤2、3,直到初始种子集合中全部三条测试用例都得到处理为止。此时,各非终结符所能生成的字符串集合为:
Fragexpression={″((87-43)*8-29)*8″,″39-24/(30+8)″,″9-(1680/8)/7″}
FragadditiveExpression={″((87-43)*8-29)*8″,″(87-43)*8-29″,″1680/8″,″30+8″,″39-24/(30+8)″,″87-43″,″9-(1680/8)/7″}
FragmultiplicativeExpression={″((87-43)*8-29)*8″,″(1680/8)/7″,″(87-43)*8″,″1680/8″,″24/(30+8)″,″29″,″30″,″39″,″43″,″8″,″87″,″9″}
FragprimaryExpression={″((87-43)*8-29)″,″(1680/8)″,″(30+8)″,″(87-43)″,″1680″,″24″,″29″,″30″,″39″,″43″,″7″,″8″,″87″,″9″}
5.创建一个空队列,设定测试用例的入队条件为“表达式中语法记号的个数小于等于10”,并将初始种子集合中的合法测试用例全部添加到队列中。此时,队列中的内容为:
Q={″39-24/(30+8)″,″9-(1680/8)/7″,″((87-43)*8-29)*8″}
同时也创建一个空集合即结果集合,用于存放后续步骤中新生成的四则运算表达式。在所有步骤执行完毕后,该集合中的所有四则运算表达式将被作为结果输出。
6.从队列的队头取出一个测试用例即“39-24/(30+8)”,使用四则运算上下文无关文法分析其语法结构,得到相应的解析树如图3所示。
7.对步骤6中得到的解析树进行遍历,遍历顺序的要求同步骤3。每当访问到一个内结点时,使用与步骤3相同的方式确定与之对应的非终结符所生成的测试用例的子串。例如,当访问到图3中含有阴影的结点时,该结点的名称为additiveExpression,相应的非终结符即为additiveExpression,它在测试用例“39-24/(30+8)”中生成的子串为“30+8”。
8.使用相同非终结符所生成的其它子串来替代当前子串,得到一系列新的测试用例。此时,把这些测试用例添加到结果集合中,同时将其中满足入队条件的新测试用例作为新的种子添加到队列的队尾。同样以图3中含有阴影的结点为例,该结点的非终结符为additiveExpression,在当前测试用例中生成的子串为“30+8”。此时,使用集合FragadditiveExpression中每个与“30+8”不同的子串来替代子串“30+8”,替换后会生成如下一系列新的测试用例:
39-24/(((87-43)*8-29)*8)
39-24/((87-43)*8-29)
39-24/(1680/8)
39-24/(39-24/(30+8))
39-24/(87-43)
39-24/(9-(1680/8)/7)
这些替换后的表达式都尚未出现在结果集合中,因此把它们全部添加到结果集合里。同时可以观察到,这些新生成的测试用例里有两个表达式中的语法记号不多于10个,即“39-24/(1680/8)”和“39-24/(87-43)”。因此,这两个表达式将作为新的种子被添加到队列的队尾。
9.重复执行步骤6、7和8,直至队列中的全部表达式都被从队头取出。此时将结果集合中的所有四则运算表达式作为方法所生成的Fuzzing测试用例而输出。
Claims (10)
1.一种受上下文无关文法约束的测试用例生成方法,其步骤为:
1)建立一包括若干合法测试用例的初始集合I;所述合法测试用例为符合目标程序的上下文无关文法约束、能被程序正确地接受和处理的测试用例;
2)对于I中的每一合法测试用例,利用上下文无关文法分析其语法结构,得到一解析树T;
3)遍历解析树T中每一内结点n,对于n所对应的上下文无关文法非终结符N,将N在测试用例中所生成的子串s加入到该非终结符N对应的字符串集合FragN中;
4)对所述初始集合I中每一合法测试用例,重复步骤2)、3),得到每一非终结符在所有合法测试用例中所能生成的字符串集合;
5)将I中的合法测试用例作为初始种子测试用例加入到一队列Q中,并为Q设定一个测试用例入队条件P;同时创建一个空集合GEN,用于存放后续步骤中生成的新测试用例;
6)从队列Q的队头依次取出一个初始种子测试用例c,利用上下文无关文法分析其语法结构,得到一个解析树Tc;
7)遍历解析树Tc中每一内结点nc,对于nc所对应的上下文无关文法非终结符Nc,查找非终结符Nc所生成的初始种子测试用例c中的子串sc;
8)利用4)所得的与该非终结符Nc名称相同的集合FragN中每个字符串分别替代初始种子测试用例c的子串sc,每次得到一个新的测试用例c’,如果c’已经在集合GEN中出现,则将c’丢弃;否则将c’加入到集合GEN中,并且如果c’满足Q中入队条件P,则同时将c’加入队列Q的队尾;
9)重复步骤6)~8),直到队列Q中的种子测试用例全部被依次取出,此时将集合GEN中的全部元素作为测试用例输出。
2.如权利要求1所述的方法,其特征在于所述初始集合I中的测试用例覆盖上下文无关文法所有语法结构。
3.如权利要求2所述的方法,其特征在于采用深度优先的方法遍历解析树。
4.如权利要求2所述的方法,其特征在于采用广度优先的方法遍历解析树。
5.如权利要求3或4所述的方法,其特征在于遍历解析树中同一父结点下的子结点时,位于左侧的子结点先于右侧的子结点遍历。
6.如权利要求1或2所述的方法,其特征在于所述初始种子测试用例为所述初始集合I中的合法测试用例。
7.如权利要求1或2所述的方法,其特征在于所述入队条件P为测试用例长度小于一设定阈值。
8.如权利要求1或2所述的方法,其特征在于所述合法测试用例为Fuzzing测试用例。
9.如权利要求1或2所述的方法,其特征在于所述目标程序为以受上下文无关文法约束的数据为输入的软件或系统。
10.如权利要求9所述的方法,其特征在于所述软件包括但不限于:网络浏览器软件、数据库服务器系统软件。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN 201110062021 CN102141959B (zh) | 2011-03-15 | 2011-03-15 | 一种受上下文无关文法约束的测试用例生成方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN 201110062021 CN102141959B (zh) | 2011-03-15 | 2011-03-15 | 一种受上下文无关文法约束的测试用例生成方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN102141959A CN102141959A (zh) | 2011-08-03 |
CN102141959B true CN102141959B (zh) | 2013-10-30 |
Family
ID=44409493
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN 201110062021 Expired - Fee Related CN102141959B (zh) | 2011-03-15 | 2011-03-15 | 一种受上下文无关文法约束的测试用例生成方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN102141959B (zh) |
Cited By (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
WO2016036321A1 (en) * | 2014-09-05 | 2016-03-10 | Agency For Science, Technology And Research | Methods for generating a vulnerability pattern, methods for determining a security threat, vulnerability pattern generators, and vulnerability pattern scanners |
CN106681901A (zh) * | 2015-11-10 | 2017-05-17 | 中国电信股份有限公司 | 一种测试样本生成的方法和装置 |
Families Citing this family (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN102929781B (zh) * | 2012-11-12 | 2015-08-26 | 桂林电子科技大学 | 基于上下文定界的队列通信并发递归程序验证方法 |
CN104267936B (zh) * | 2014-09-16 | 2017-10-17 | 桂林电子科技大学 | 基于树语义的异步动态下推网络可达性分析方法 |
CN111123888B (zh) * | 2019-12-19 | 2022-03-15 | 江苏中天互联科技有限公司 | 一种工控协议测试方法、系统及电子设备和存储介质 |
CN111708542B (zh) * | 2020-06-24 | 2023-05-16 | 中国平安财产保险股份有限公司 | 测试用例生成方法、系统、设备及存储介质 |
CN112685314A (zh) * | 2021-01-05 | 2021-04-20 | 广州知图科技有限公司 | 一种JavaScript引擎安全测试方法及测试系统 |
Citations (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101853201A (zh) * | 2010-05-24 | 2010-10-06 | 南京航空航天大学 | 一种基于着色petri网的软件并行测试方法及工具 |
-
2011
- 2011-03-15 CN CN 201110062021 patent/CN102141959B/zh not_active Expired - Fee Related
Patent Citations (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101853201A (zh) * | 2010-05-24 | 2010-10-06 | 南京航空航天大学 | 一种基于着色petri网的软件并行测试方法及工具 |
Non-Patent Citations (4)
Title |
---|
一种改进的网络可生存需求分析方法;张玉清等;《中国科学院研究生院学报》;20090731;第26卷(第4期);555-562 * |
一种新的多路径覆盖测试数据进化生成方法;巩敦卫等;《电子学报》;20100630;第38卷(第6期);1299-1304 * |
巩敦卫等.一种新的多路径覆盖测试数据进化生成方法.《电子学报》.2010,第38卷(第6期),1299-1304. |
张玉清等.一种改进的网络可生存需求分析方法.《中国科学院研究生院学报》.2009,第26卷(第4期),555-562. |
Cited By (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
WO2016036321A1 (en) * | 2014-09-05 | 2016-03-10 | Agency For Science, Technology And Research | Methods for generating a vulnerability pattern, methods for determining a security threat, vulnerability pattern generators, and vulnerability pattern scanners |
CN106681901A (zh) * | 2015-11-10 | 2017-05-17 | 中国电信股份有限公司 | 一种测试样本生成的方法和装置 |
CN106681901B (zh) * | 2015-11-10 | 2019-12-06 | 中国电信股份有限公司 | 一种测试样本生成的方法和装置 |
Also Published As
Publication number | Publication date |
---|---|
CN102141959A (zh) | 2011-08-03 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
Zhang et al. | A survey of learning-based automated program repair | |
Zhong et al. | An empirical study on API usages | |
CN102141959B (zh) | 一种受上下文无关文法约束的测试用例生成方法 | |
CN102339252B (zh) | 基于xml中间模型以及缺陷模式匹配的静态检测系统 | |
WO2019075390A1 (en) | BOX BLACK MATCHING MOTOR | |
WO2019051422A1 (en) | AUTOMATION OF TEST CAS IDENTIFICATION FOR LIBRARY SUGGESTIONS MODELS | |
CN111459799B (zh) | 一种基于Github的软件缺陷检测模型建立、检测方法及系统 | |
CN110059006B (zh) | 代码审计方法及装置 | |
WO2019051420A1 (en) | AUTOMATION OF IDENTIFICATION OF CODE FRAGMENTS FOR LIBRARY SUGGESTION MODELS | |
WO2019051426A1 (en) | PRUNING ENGINE | |
Nguyen et al. | Cross-language program slicing for dynamic web applications | |
Nguyen et al. | Auto-locating and fix-propagating for HTML validation errors to PHP server-side code | |
Pauzi et al. | Applications of natural language processing in software traceability: A systematic mapping study | |
US7409619B2 (en) | System and methods for authoring domain specific rule-driven data generators | |
Kim et al. | Predictive mutation analysis via the natural language channel in source code | |
Sharma et al. | A survey on machine learning techniques applied to source code | |
Singh et al. | Literature analysis on model based slicing | |
Huang et al. | A comparative study on method comment and inline comment | |
CN108563561B (zh) | 一种程序隐性约束提取方法及系统 | |
Lawrie et al. | An empirical study of rules for well‐formed identifiers | |
Goloveshkin et al. | Tolerant parsing with a special kind of" Any" symbol: the algorithm and practical application | |
Lashram et al. | HCLPars: Α New Hierarchical Clustering Log Parsing Method | |
Dhoolia et al. | Debugging model-transformation failures using dynamic tainting | |
Burrows et al. | Coupling metrics for aspect-oriented programming: A systematic review of maintainability studies | |
Anderson et al. | Supporting analysis of SQL queries in PHP AiR |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
C14 | Grant of patent or utility model | ||
GR01 | Patent grant | ||
CF01 | Termination of patent right due to non-payment of annual fee |
Granted publication date: 20131030 Termination date: 20200315 |
|
CF01 | Termination of patent right due to non-payment of annual fee |