CN113076260B - 一种集成片段信息的结构化输入程序安全检测方法及设备 - Google Patents
一种集成片段信息的结构化输入程序安全检测方法及设备 Download PDFInfo
- Publication number
- CN113076260B CN113076260B CN202110459196.0A CN202110459196A CN113076260B CN 113076260 B CN113076260 B CN 113076260B CN 202110459196 A CN202110459196 A CN 202110459196A CN 113076260 B CN113076260 B CN 113076260B
- Authority
- CN
- China
- Prior art keywords
- node
- fragment
- input
- type
- segment
- 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.)
- Active
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
-
- 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/3676—Test management for coverage analysis
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)
- Debugging And Monitoring (AREA)
Abstract
本发明公开了一种集成片段信息的结构化输入程序安全检测方法及设备,所述方法包括:从待测软件的输入用例集中提取片段信息并存入片段库;根据软件的输入确定结构化输入的节点类型,并基于节点类型、输入流以及片段信息生成结构化输入;根据结构化输入进行程序的模糊测试。本发明利用容易获取的输入用例来产生片段信息,将片段信息集成到结构化输入的参数生成器中,提高模糊测试的代码覆盖率和测试效率。
Description
技术领域
本发明涉及软件测试领域,具体涉及一种程序安全检测的实现方法及设备。
背景技术
模糊测试是程序安全检测发现软件漏洞的常用方法之一,并且它常常能发现被另外两种漏洞发现方法(静态代码分析和人工代码检查)所忽略的安全漏洞。模糊测试的基本原理是通过提供各种不同的输入(包括边界、异常输入)给被测试程序,并监测程序在不同输入下的运行状态,从而发现其存在的安全漏洞。按照模糊测试时所利用的信息,现有模糊测试方法可以分为黑盒、灰盒和白盒三类,分别对应于不利用被测试程序信息、利用部分信息以及利用大量信息三种方式。但是现有的模糊测试方法主要针对接受一般输入(如图片)的程序,它们在应用到结构化输入程序的模糊测试时存在较大的挑战。
结构化输入程序,例如Apache Maven,在调用程序的实际功能之前,通常会处理并检查其输入。处理检查过程常包括两个阶段:语法(Syntax)分析阶段和语义(Semantic)分析阶段。语法分析阶段将原始输入转换为内部数据结构,例如抽象语法树;而语义分析阶段则检查输入是否满足某些语义约束。如果输入在语法和/或语义上无效,则该输入会进入错误处理逻辑,无法进入后续的实际功能。现有一些黑盒模糊测试系统如QuickCheck会使用生成器(Generator),能够生成出语法正确的输入,但却常常难以生成语义正确的输入。而灰盒模糊测试系统如目前流行的AFL和libFuzzer之类的基于覆盖率引导的模糊测试(Coverage-Guided Fuzzing,CGF)系统虽然能更好地遍历代码逻辑,但却难以生成出符合语法的输入。最近提出的Zest能通过参数化生成器(Parametric Generator)对输入进行映射,使得既能产生语义正确的输入,又能够在输入上采用基于覆盖率引导的方法进行变异,从而能获得最高的覆盖。Zest技术详见PADHYE R,LEMIEUX C,SEN K,et al.SemanticFuzzing with Zest[C]//Proceedings of the ACM SIGSOFT International Symposiumon Software Testing and Analysis(ISSTA).Beijing:ACM,2019:329–340.。据当前署名发明人的工作所知,Zest是目前结构化输入程序测试最有效的技术之一。但是Zest无法利用现有的输入用例,这使得它在测试初期的表现不佳,并且在测试复杂的结构化输入时其覆盖率仍然不高。
发明内容
为了克服现有技术测试方法的缺陷,本发明提供一种集成片段信息的结构化输入程序安全检测方法,基于Zest的框架进行模糊测试,但利用容易获取的输入用例来提高测试效率,并具有更高的代码覆盖率。
本发明还提供一种集成片段信息的结构化输入程序安全检测设备。
为了达到上述发明目的,本发明采用以下技术方案:
第一方面,提供一种集成片段信息的结构化输入程序安全检测方法,包括以下步骤:
从待测软件的输入用例集中提取片段信息并存入片段库;
根据软件的输入确定结构化输入的节点类型,并基于节点类型、输入流以及片段信息生成结构化输入;
根据结构化输入进行程序的模糊测试。
作为一种优选的实施方式,从待测软件的输入用例集中提取片段信息并存入片段库包括:
待测软件的一批输入用例构成输入用例集I,根据每个输入用例的文件类型将其解析为相应的内部存储格式;
对内部存储格式进行遍历,获取BNF范式表达中所有对应左侧非终结符号的部分作为片段,得到每个片段的类型type和内容snippet;
将每个片段对应的类型type、内容snippet作为一则片段信息存入片段库中。
作为一种优选的实施方式,所述从待测软件的输入用例集中提取片段信息并存入片段库还包括:
对内部存储格式进行遍历时,对片段进行计数,每遍历到一个片段时更新其出现次数count;
对每个片段,将该片段的出现次数除以所有同类型的片段出现次数,得到出其对应的出现概率probability;
将每个片段对应的类型type、出现概率probability、内容snippet作为一则片段信息存入片段库中。
作为一种优选的实施方式,根据软件的输入确定结构化输入的节点类型,并基于节点类型、输入流以及片段信息生成结构化输入包括:
步骤41)根据软件的输入确定结构化输入的节点个数及每个节点对应的节点类型;
步骤42)遍历每个节点所对应的节点类型,基于该节点的节点类型、输入流以及片段信息,对应生成结构化输入中包括节点内容的各内部节点,直至所有包括节点内容的节点均生成完毕;对于其中一个节点及其对应的节点类型具体包括:
步骤421)根据该节点的节点类型从片段库中查询是否存在同样类型的片段,当片段库中存在同样类型的片段,且第一随机概率条件成立时,从片段库中取得一个该类型的片段,并从一批片段处理操作中随机选择一个对取得的片段进行处理,将处理后的片段作为结构化输入中包括节点内容的该内部节点,否则,进入步骤422);
步骤422)当片段库中不存在同样类型的片段,或者虽存在同样类型的片段,但第一随机概率条件不成立时,利用Zest参数化生成器从输入流生成包括节点内容的该内部节点;
步骤43)输出由步骤421)生成的若干内部节点和步骤422)生成的若干内部节点共同构成的结构化输入。
其中,当步骤422)中生成包括节点内容的该内部节点时,如该节点内容中包括有子节点,则对每个子节点迭代步骤421)至步骤422)对应生成结构化输入中包括节点内容的各内部子节点,以此循环递归调用,直至所有包括节点内容的节点及子节点均生成完毕。
作为一种优选的实施方式,步骤421)中,所述从片段库中取得一个该类型的片段按照概率方式或随机方式来取得,其中按照概率方式取得该类型的片段,具体为:
按照各类型片段的不同出现概率进行加权随机采样的方式,从片段库中进行采样;或者
对各类型的片段按照各自出现概率分别分配指定长度数组,并保证最低分配数目,采样时在对应数组中进行均匀采样。
第二方面,提供一种集成片段信息的结构化输入程序安全检测设备,包括:
片段生成模块,用于从待测软件的输入用例集中提取片段信息并存入片段库;
结构化输入生成模块,用于根据软件的输入确定结构化输入的节点类型,并基于节点类型、输入流以及片段信息生成结构化输入;
测试执行模块,用于根据结构化输入进行程序的模糊测试。
作为一种优选的实施方式,片段生成模块包括:
输入用例解析单元,用于根据输入用例的文件类型将每个输入用例解析为相应的内部存储格式;
遍历单元,用于对内部存储格式进行遍历,获取BNF范式表达中所有对应左侧非终结符号的部分作为片段,得到每个片段的类型type和内容snippet,并在每遍历到一个片段时更新其出现次数count;
第一片段构成单元,用于将每个片段对应的类型type、内容snippet作为一则片段信息存入片段库中;
概率计算单元,用于对每个片段,将该片段的出现次数除以所有同类型的片段出现次数,得到出其对应的出现概率probability;
第二片段构成单元,用于将每个片段对应的类型type、出现概率probability、内容snippet作为一则片段信息存入片段库中。
作为一种优选的实施方式,所述结构化输入生成模块包括:
节点类型确定单元,用于根据软件的输入确定结构化输入的节点类型;
节点生成单元,用于遍历每个节点所对应的节点类型,基于该节点的节点类型、输入流以及片段信息,对应生成结构化输入中包括节点内容的各内部节点,直至所有包括节点内容的节点均生成完毕;
输出单元,用于输出由所有内部节点共同构成的结构化输入;
其中,所述节点生成单元具体包括:
决策子单元,用于根据节点的节点类型从片段库中查询是否存在同样类型的片段,并决策是否使用该类型的片段,当片段库中存在同样类型的片段,且第一随机概率条件成立时,决定使用该类型的片段,否则不使用该类型的片段;
第一处理子单元,用于在决策子单元决定使用该类型的片段时,从片段库中取得一个该类型的片段,并从一批片段处理操作中随机选择一个对取得的片段进行处理,将处理后的片段作为结构化输入中包括节点内容的该内部节点;
第二处理子单元,用于在决策子单元决定不使用该类型的片段时,利用Zest参数化生成器从输入流生成包括节点内容的该内部节点。
相比于现有技术,本发明具有以下有益效果:本发明提供的集成片段信息的结构化输入程序安全检测方法及设备,通过片段生成器解析输入用例来得到片段信息,并利用集成片段信息的参数化生成器来生成输入,这一方面使得在测试早期就能够获得和AFL系统一样的覆盖率,另一方面能通过复用现成的代码片段来取得更高的覆盖率。并且本发明利用容易获取的输入例子来提高模糊测试时的覆盖率,因为输入用例中的正确的片段,能够加速语义合法、结构复杂的输入的生成。
附图说明
图1为本发明实施例提供的集成片段信息的结构化输入程序安全检测方法流程图;
图2为本发明实施例提供的集成片段信息的结构化输入程序安全检测设备架构图。
具体实施方式
下面将结合附图对本发明实施例中的技术方案进行清楚、完整的描述,显然,所描述的实施例仅是本发明一部分实施例,并不是全部的实施例。需要说明的是,在下文描述中软件、程序均是指待测试的对象,可以互相替换使用。
参照图1,本发明实施例提出的集成片段信息的结构化输入程序安全检测方法,包括以下步骤:(1)从待测软件的输入用例集中提取片段信息并存入片段库;(2)根据软件的输入确定结构化输入的节点类型,并基于节点类型、输入流以及片段信息生成结构化输入;(3)根据结构化输入进行程序的模糊测试。其中步骤(1)的片段生成过程一般是在测试启动时执行一次,而步骤(2)和(3)则在每次生成测试输入和进行测试时均会执行。
如背景技术中提到的,Zest将基于覆盖率引导的模糊测试方法与包含语法信息的生成器进行结合,一定程度上提高了测试效率和代码覆盖率。在Zest中提出了参数化生成器,这种生成器将一个比特输入流当成能生成出符合语法的结构化输入生成器的参数流,从而实现从参数的比特位级突变到输入的结构突变的映射。然而,根据其参数化生成器很难逆向计算出基于覆盖率引导的模糊测试所需的种子输入。针对这个问题本发明设计了片段生成器,即步骤(1)的实现,利用现有输入用例中的正确的片段,来加速语义合法、结构复杂的种子的生成。
具体而言,片段是指结构化输入中的任意一个小部分。结构化输入通常可以采用BNF(Backus Normal Form)范式表示,即由多个形如“<符号>::=<使用符号的表达式>”的定义给出。此时所有对应左侧非终结符号的部分,均可以视为片段。片段的示例如下:
当然,也可以分别把<groupId>org.hamcrest</groupId>、<version>1.3</version>、以及<artifactId>hamcrest-library</artifactId>看成一个片段。
片段生成过程主要通过片段生成器进行。片段生成器对提供的种子集执行片段生成算法以生成片段库。在一个优选的实施方式中,算法的输入是用户提供的一批输入用例,常常用文件表示,也称为种子集I。输入用例即软件正常使用时的输入,例如对Maven程序而言其输入就是一批Pom.xml文件。算法的输出是片段库S,常存于内存中,其中每个片段都可能包括了该片段的类型、出现概率、片段内容,表示为<type,probability,snippet>。其中片段类型可由用户根据输入格式进行自定义,例如对于一般的XML文件,可以分类成根节点、元素(Element)节点、文本(Text)节点、属性(Attribute)节点等,这是现有技术中xml的标准定义;也可以按照语义进行更细的分类,例如对Maven可以分为project节点、build节点、dependencyManagement节点等。
算法执行过程中首先生成一个临时集合S’,存储信息与最终片段库S类似,除了每个元素中存储的不是片段出现概率而是出现次数,即元素为<type,count,snippet>。对于每个输入用例,算法首先将其解析为对应的内部格式,内部格式即在内存中存储的格式,常用自定义的类表示,可以是树形、图、Hashmap等格式,可用相应方法进行遍历。如对于XML文件,则会是一个类似Document的类,内部是一个包括子Node节点的树形结构(解析过程将在下文描述)。然后对该树形结构做广度优先的遍历(其它遍历顺序亦可),这将会遍历到所有片段(即对应BNF式子中左侧非终结符号的部分),即可得到片段的类型type和内容snippet。将每个遍历到的片段尝试加入到S’中并更新计数count。最后,将S’中某片段出现次数除以所有同类型的片段出现次数,估计出其对应的概率probability,得到片段库S。
在一个简便的实施方式中,也可以不记录片段出现概率,则不需要统计片段出现次数、计算概率,即用上述优选实施方式中遍历得到的<type,snippet>来表示输出的片段库S。这种方式下可以视各片段是均匀分布。
在本发明实施例中,片段生成时解析输入用例为内部结构并不会产生太多额外工作。这是因为一般已经有现成的解析器,例如,被测试程序自身就需要对输入进行解析以进行语法语义分析。所以只需要采用相同的解析代码就可以。另外在遍历内部结构过程中需要防止重复遍历,因为部分结构化输入中可能包括引用,类似Linux文件系统中的软链接,如果继续遍历引用则会导致重复遍历。可以通过简单的去重功能来避免重复遍历,例如用一个列表或Hashmap记录遍历过的节点。
在步骤(2)中,本发明实施例提出将获得的片段信息集成在参数化生成器中。参数化生成器读取输入中的字节作为参数,并据此生成不同的结构化输入内部节点(包括节点中的内容)。例如生成一个XML结构输入的参数化生成器在生成一个节点时,其对应generateNodeOfType方法的伪代码如下所示。
其中type为需要生成的节点类型,可以根据random读入的数值来决定生成的节点类型,比如有3种类型,则读取一个int值后,基于3进行模运算即可,当然还可能要考虑其它的比如,子节点不超过一个给定max值,例如递归调用generateNodeOfType方法时所考虑的(第4、第8行)。在本实施例中,片段snippet的类型type对应于xml中节点类型,对于其它文件可能对应其它类型,如对于javascript语言可能要对应语句类型、函数类型等等。而random为输入流,视为随机源以方便使用,如调用random.nextInt(100)会从流中读取4字节以获取100以内的整型随机数。生成过程一般是先判断需要生成的节点类型(第2行),例如可能为生成一个元素节点,或为生成一个属性节点等等。其中第3-12行为生成一个元素节点,第14行则生成一个属性节点,其余类型类似,这里不列出。关于XML的参数化生成器的详细代码可以参照以下信息:https://github.com/rohanpadhye/JQF/blob/master/examples/src/main/java/edu/berkeley/cs/jqf/examples/xml/XmlDocumentGenerator.java。以生成元素节点为例,首先是调用createEmptyElement方法,生成一个空的元素节点(第3行),该方法中可能会随机地从字符串字典库中选取一个作为元素名称。字符串字典库可以事先编写好或自动从输入用例中抽取而得。然后通过从输入流中读取数值决定生成多少属性节点(第4行),AttrMax表示最多生成多少个属性,并循环调用生成属性和添加属性的方法来添加(第5-6行),ATTR_TYPE表示类型为属性节点,generateNodeOfType(ATTR_TYPE,random)表示根据输入流和ATTR_TYPE得到属性,attribute表示生成的属性,addAttribute(attribute,element)表示为元素节点element添加属性attribute。接下来,类似地通过从输入流读取数值决定生成多少元素节点作为子节点(第8行),并循环调用生成子节点和添加子节点的方法进行添加(第9-10行)。
而集成片段的参数化生成器则需要将片段库的信息结合到生成器中。集成片段的参数化生成器中也主要是从输入流生成结构化输入,首先根据输入流决定生成什么样的结构化输入,即需要生成的节点类型,然后执行更新后的方法getNodeOfType(type,random,S)来得到结构化输入。方法getNodeOfType(type,random,S)步骤如下,其中会使用到片段库,并且会调用原来的生成节点的方法generateNodeOfType(type,random):
首先根据节点类型判断片段库中是否有该类型,且根据输入流以一定的概率Pt/100决定是否使用片段,Pt为预先确定的阈值(第3行),“if(has_snippet(type,S)&&random.nextInt(100)<Pt)”表示当查到片段库S中存在type类型的片段,且从输入流中随机获取的数小于预设的阈值Pt时,则使用这个片段。需要说明的是,本实施例中是根据输入流中随机获取的数小于预设阈值Pt作为条件之一,在其他实施例中,也可以用其他判断方式,例如输入流中随机获取的数大于预设阈值Pt时,或者满足任意一种随机概率条件时,即第一随机概率条件成立,达到以一定的随机概率来决定是否使用片段的目的。还需要指出的是,生成测试输入时并不需要每次可以使用片段时都使用片段,即使完全不用片段也可以生成出合格的测试输入,加入片段是使得结果更加“逼真”;输入流一方面在用于决定生成什么样的结构化输入,一方面也被用于是否使用片段,因为模糊测试的更改(mutation)步骤中都是在更改输入流。如果决定不使用片段,则采用之前的方式生成(第7行)。而如果采用片段,则首先调用getRandomSnippet(type,S,random)方法从S中的type类型片段中按照各片段的概率或随机方式取得片段(第4行)。片段取出后,可以从一批片段处理操作(Operators)中随机选择一个对片段进行处理后返回(第5行),返回的片段作为结构化输入中的一个内部节点。这种操作是为了增加片段的多样性,操作包括如,删除片段内部的所有子节点、部分子节点,或删除所有属性、部分属性,或改变片段内的数值为最大或最小值,当然也包括不做任何更改的无动作操作。
根据以上描述,得到融合片段信息的结构化输入生成过程如下:
步骤41)根据软件的输入确定结构化输入的节点个数及每个节点对应的节点类型;
步骤42)遍历每个节点所对应的节点类型,基于该节点的节点类型、输入流以及片段信息,对应生成结构化输入中包括节点内容的各内部节点,直至所有包括节点内容的节点均生成完毕;对于其中一个节点及其对应的节点类型具体包括:
步骤421)根据该节点的节点类型从片段库中查询是否存在同样类型的片段,当片段库中存在同样类型的片段,且第一随机概率条件成立时,从片段库中取得一个该类型的片段,并从一批片段处理操作中随机选择一个对取得的片段进行处理,将处理后的片段作为结构化输入中包括节点内容的该内部节点,否则,进入步骤422);
步骤422)当片段库中不存在同样类型的片段,或者虽存在同样类型的片段,但第一随机概率条件不成立时,利用Zest参数化生成器从输入流生成包括节点内容的该内部节点;
步骤43)输出由步骤421)生成的若干内部节点和步骤422)生成的若干内部节点共同构成的结构化输入。
其中,当步骤422)中生成包括节点内容的该内部节点时,如该节点内容中包括有子节点,则对每个子节点迭代步骤421)至步骤422)对应生成结构化输入中包括节点内容的各内部子节点,以此循环递归调用,直至所有包括节点内容的节点及子节点均生成完毕。
文中所述内部节点也即节点。
在getRandomSnippet方法中可采用按照各片段的不同概率取样的方式或者同样概率取样的方式。按照各片段的不同概率采样是一个加权随机采样(Weighted RandomSampling)问题,已有很多加权随机采样的实现方法,此处不再赘述。而在样本并不多时,可以采用一种简单的方式,如对每种类型预先分配长度1000的数组,对每种类型的片段按照它们各自概率分配这1000数组,并保证最低分配数目,采样时则在这个数组中均匀采样。如果是未进行count计数,以及计算probability概率的情况下,则可以随机方式取得该类型片段。
从一批片段处理操作中选择一个操作的概率也可以并不相同,比如删除节点操作概率大于无动作操作,以减少片段大小。并且,也可以进一步采用叠加(Stacked)的方式来对一个片段用多个操作进行处理。叠加方式即同时应用多种处理操作,例如对片段进行删除部分子节点操作后又做删除部分属性节点的操作。
在步骤(3)中,根据生成的结构化输入,基于Zest的JQF框架进行测试。JQF提供了代码插桩、执行监控等的功能,相当于Java版本的AFL。具体细节不再赘述。
参照图2,根据本发明的另一实施例,提供一种集成片段信息的结构化输入程序安全检测设备,包括:片段生成模块,图上所示为片段生成器,用于从待测软件的输入用例集中提取片段信息并存入片段库;结构化输入生成模块,图上所示为结构化输入参数生成器,用于根据软件的输入确定结构化输入的节点类型,并基于节点类型、输入流以及片段信息生成结构化输入;测试执行模块,用于根据结构化输入进行程序的模糊测试,如图所示,为基于总覆盖率和有效覆盖率引导的模糊测试。
其中,片段生成模块包括:
输入用例解析单元,用于根据输入用例的文件类型将每个输入用例解析为相应的内部存储格式;
遍历单元,用于对内部存储格式进行遍历,获取BNF范式表达中所有对应左侧非终结符号的部分作为片段,得到每个片段的类型type和内容snippet,并在每遍历到一个片段时更新其出现次数count;
第一片段构成单元,用于将每个片段对应的类型type、内容snippet作为一则片段信息存入片段库中。
更优选地,片段生成模块还包括:
概率计算单元,用于对每个片段,将该片段的出现次数除以所有同类型的片段出现次数,得到出其对应的出现概率probability;
第二片段构成单元,用于将每个片段对应的类型type、出现概率probability、内容snippet作为一则片段信息存入片段库中。
作为一种优选的实施方式,结构化输入生成模块包括:
节点类型确定单元,用于根据软件的输入确定结构化输入的节点类型;
节点生成单元,用于遍历每个节点所对应的节点类型,基于该节点的节点类型、输入流以及片段信息,对应生成结构化输入中包括节点内容的各内部节点,直至所有包括节点内容的节点均生成完毕;
输出单元,用于输出由所有内部节点共同构成的结构化输入;
其中,节点生成单元具体包括:
决策子单元,用于根据节点的节点类型从片段库中查询是否存在同样类型的片段,并决策是否使用该类型的片段,当片段库中存在同样类型的片段,且第一随机概率条件成立时,决定使用该类型的片段,否则不使用该类型的片段;
第一处理子单元,用于在决策子单元决定使用该类型的片段时,从片段库中取得一个该类型的片段,并从一批片段处理操作中随机选择一个对取得的片段进行处理,将处理后的片段作为结构化输入中包括节点内容的该内部节点;
第二处理子单元,用于在决策子单元决定不使用该类型的片段时,利用Zest参数化生成器从输入流生成包括节点内容的该内部节点。
作为一种优选的实施方式,节点生成单元还包括:第三处理子单元,用于对生成包括节点内容的子节点,具体地,当第二处理子单元生成包括节点内容的该内部节点时,如该节点内容中包括有子节点,则第三处理子单元对每个子节点迭代第一处理子单元以及第二处理子单元的处理过程,对应生成结构化输入中包括节点内容的各内部子节点,以此循环递归调用,直至所有包括节点内容的节点及子节点均生成完毕。
其中,第一处理子单元在从片段库中取得一个该类型的片段按照概率方式或随机方式来取得,其中按照概率方式取得该类型的片段,具体为:按照各类型片段的不同出现概率进行加权随机采样的方式,从片段库中进行采样;或者
对各类型的片段按照各自出现概率分别分配指定长度数组,并保证最低分配数目,采样时在对应数组中进行均匀采样。
应当理解,本实施例中提供的集成片段信息的结构化输入程序安全检测设备能够实现上述方法实施例中的全部技术方案,其各个功能模块的功能可以根据上述方法实施例中的方法具体实现,其具体实现过程可参照上述实施例中的相关描述,此处不再赘述。
本领域内的技术人员应明白,本发明实施例中的实施例可提供为方法、系统、或计算机程序产品。因此,本发明实施例中可采用完全硬件实施例、完全软件实施例、或结合软件和硬件方面的实施例的形式。而且,本发明实施例中可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器、CD-ROM、光学存储器等)上实施的计算机程序产品的形式。
本发明实施例中是参照根据本发明实施例中实施例的方法、设备(系统)、和计算机程序产品的流程图和/或方框图来描述的。应理解可由计算机程序指令实现流程图和/或方框图中的每一流程和/或方框、以及流程图和/或方框图中的流程和/或方框的结合。可提供这些计算机程序指令到通用计算机、专用计算机、嵌入式处理机或其他可编程数据处理设备的处理器以产生一个机器,使得通过计算机或其他可编程数据处理设备的处理器执行的指令产生用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的装置。
这些计算机程序指令也可存储在能引导计算机或其他可编程数据处理设备以特定方式工作的计算机可读存储器中,使得存储在该计算机可读存储器中的指令产生包括指令装置的制造品,该指令装置实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能。
这些计算机程序指令也可装载到计算机或其他可编程数据处理设备上,使得在计算机或其他可编程设备上执行一系列操作步骤以产生计算机实现的处理,从而在计算机或其他可编程设备上执行的指令提供用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的步骤。
尽管已描述了本发明实施例中的优选实施例,但本领域内的技术人员一旦得知了基本创造性概念,则可对这些实施例作出另外的变更和修改。所以,所附权利要求意欲解释为包括优选实施例以及落入本发明实施例中范围的所有变更和修改。
显然,本领域的技术人员可以对本发明实施例中实施例进行各种改动和变型而不脱离本发明实施例中实施例的精神和范围。这样,倘若本发明实施例中实施例的这些修改和变型属于本发明实施例中权利要求及其等同技术的范围之内,则本发明实施例中也意图包含这些改动和变型在内。
Claims (7)
1.一种集成片段信息的结构化输入程序安全检测方法,其特征在于,包括以下步骤:
从待测软件的输入用例集中提取片段信息,根据每个输入用例的文件类型将其解析为相应的内部存储格式,对内部存储格式进行遍历,得到每个片段的类型type、内容snippet和出现概率probability,并存入片段库中;
根据软件的输入,确定结构化输入的节点类型,并基于节点类型、输入流以及片段信息生成结构化输入,包括:
步骤41)根据软件的输入确定结构化输入的节点个数及每个节点对应的节点类型;
步骤42)遍历每个节点所对应的节点类型,基于该节点的节点类型、输入流以及片段信息,对应生成结构化输入中包括节点内容的各内部节点,直至所有包括节点内容的节点均生成完毕;对于其中一个节点及其对应的节点类型具体包括:
步骤421)根据该节点的节点类型从片段库中查询是否存在同样类型的片段,当片段库中存在同样类型的片段,且第一随机概率条件成立时,从片段库中取得一个该类型的片段,并从一批片段处理操作中随机选择一个对取得的片段进行处理,将处理后的片段作为结构化输入中包括节点内容的该内部节点,否则,进入步骤422);
步骤422)当片段库中不存在同样类型的片段,或者虽存在同样类型的片段,但第一随机概率条件不成立时,利用Zest参数化生成器从输入流生成包括节点内容的该内部节点;
步骤43)输出由步骤421)生成的若干内部节点和步骤422)生成的若干内部节点共同构成的结构化输入;
根据结构化输入进行程序的模糊测试。
2.根据权利要求1所述的集成片段信息的结构化输入程序安全检测方法,其特征在于,每个片段的类型type、内容snippet的获取方法包括:
待测软件的一批输入用例构成输入用例集I,对每个输入用例的内部存储格式进行遍历,获取BNF范式表达中所有对应左侧非终结符号的部分作为片段,得到每个片段的类型type和内容snippet。
3.根据权利要求1所述的集成片段信息的结构化输入程序安全检测方法,其特征在于,出现概率probability的获取方法包括:
在对内部存储格式进行遍历时,对片段进行计数,每遍历到一个片段时更新其出现次数count;
对每个片段,将该片段的出现次数除以所有同类型的片段出现次数,得出其对应的出现概率probability。
4.根据权利要求1所述的集成片段信息的结构化输入程序安全检测方法,其特征在于,当步骤422)中生成包括节点内容的该内部节点时,如该节点内容中包括有子节点,则对每个子节点迭代步骤421)至步骤422)对应生成结构化输入中包括节点内容的各内部子节点,以此循环递归调用,直至所有包括节点内容的节点及子节点均生成完毕。
5.根据权利要求1所述的集成片段信息的结构化输入程序安全检测方法,其特征在于,步骤421)中所述第一随机概率条件成立时,具体为:从输入流中随机获取的数满足预设条件时;步骤422)中所述第一随机概率条件不成立时,具体为:从输入流中随机获取的数不满足预设条件时;
所述片段处理操作包括以下中的至少一项:删除片段内部的所有子节点或部分子节点、删除所有属性或部分属性、改变片段内的数值为最大或最小值、以及不做任何更改的无动作操作。
6.根据权利要求1所述的集成片段信息的结构化输入程序安全检测方法,其特征在于,步骤421)中,所述从片段库中取得一个该类型的片段按照概率方式或随机方式来取得,其中按照概率方式取得该类型的片段,具体为:按照各类型片段的不同出现概率进行加权随机采样的方式,从片段库中进行采样;或者
对各类型的片段按照各自出现概率分别分配指定长度数组,并保证最低分配数目,采样时在对应数组中进行均匀采样。
7.一种集成片段信息的结构化输入程序安全检测设备,其特征在于,包括:
片段生成模块,用于从待测软件的输入用例集中提取片段信息,包括:
输入用例解析单元,用于根据输入用例的文件类型将每个输入用例解析为相应的内部存储格式;
遍历单元,用于对内部存储格式进行遍历,获取BNF范式表达中所有对应左侧非终结符号的部分作为片段,得到每个片段的类型type和内容snippet,并在每遍历到一个片段时更新其出现次数count;
片段概率计算单元,用于对每个片段,将该片段的出现次数除以所有同类型的片段出现次数,得到出其对应的出现概率probability;
片段构成单元,用于将每个片段对应的类型type、出现概率probability、内容snippet作为一则片段信息存入片段库中;
结构化输入生成模块,用于根据软件的输入确定结构化输入的节点类型,并基于节点类型、输入流以及片段信息生成结构化输入,包括:
节点类型确定单元,用于根据软件的输入确定结构化输入的节点类型;
节点生成单元,用于遍历每个节点所对应的节点类型,基于该节点的节点类型、输入流以及片段信息,对应生成结构化输入中包括节点内容的各内部节点,直至所有包括节点内容的节点均生成完毕;
输出单元,用于输出由所有内部节点共同构成的结构化输入;
其中,所述节点生成单元具体包括:
决策子单元,用于根据节点的节点类型从片段库中查询是否存在同样类型的片段,并决策是否使用该类型的片段,当片段库中存在同样类型的片段,且第一随机概率条件成立时,决定使用该类型的片段,否则不使用该类型的片段;
第一处理子单元,用于在决策子单元决定使用该类型的片段时,从片段库中取得一个该类型的片段,并从一批片段处理操作中随机选择一个对取得的片段进行处理,将处理后的片段作为结构化输入中包括节点内容的该内部节点;
第二处理子单元,用于在决策子单元决定不使用该类型的片段时,利用Zest参数化生成器从输入流生成包括节点内容的该内部节点;
测试执行模块,用于根据结构化输入进行程序的模糊测试。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202110459196.0A CN113076260B (zh) | 2021-04-27 | 2021-04-27 | 一种集成片段信息的结构化输入程序安全检测方法及设备 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202110459196.0A CN113076260B (zh) | 2021-04-27 | 2021-04-27 | 一种集成片段信息的结构化输入程序安全检测方法及设备 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN113076260A CN113076260A (zh) | 2021-07-06 |
CN113076260B true CN113076260B (zh) | 2022-08-05 |
Family
ID=76618903
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202110459196.0A Active CN113076260B (zh) | 2021-04-27 | 2021-04-27 | 一种集成片段信息的结构化输入程序安全检测方法及设备 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN113076260B (zh) |
Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
EP3109763A1 (en) * | 2015-06-24 | 2016-12-28 | Tata Consultancy Services Limited | Method and system for generating functional test cases for software systems |
CN110399300A (zh) * | 2019-07-22 | 2019-11-01 | 南京大学 | 一种基于动态类型感知的Python软件模糊测试方法 |
CN111367815A (zh) * | 2020-03-24 | 2020-07-03 | 中国电子科技网络信息安全有限公司 | 一种基于人机协同的软件漏洞模糊测试方法 |
-
2021
- 2021-04-27 CN CN202110459196.0A patent/CN113076260B/zh active Active
Patent Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
EP3109763A1 (en) * | 2015-06-24 | 2016-12-28 | Tata Consultancy Services Limited | Method and system for generating functional test cases for software systems |
CN110399300A (zh) * | 2019-07-22 | 2019-11-01 | 南京大学 | 一种基于动态类型感知的Python软件模糊测试方法 |
CN111367815A (zh) * | 2020-03-24 | 2020-07-03 | 中国电子科技网络信息安全有限公司 | 一种基于人机协同的软件漏洞模糊测试方法 |
Non-Patent Citations (2)
Title |
---|
AFL-based Fuzzing for Java with Kelinci;Rody Kersten;《https://doi.org/10.1145/3133956.3138820》;20171103;第2511-2513页 * |
Validity Fuzzing and Parametric Generators for Effective Random Testing;Rohan Padhye;《2019 IEEE/ACM 41st International Conference on Software Engineering: Companion Proceedings (ICSE-Companion)》;20190819;第266-267页 * |
Also Published As
Publication number | Publication date |
---|---|
CN113076260A (zh) | 2021-07-06 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US10146532B2 (en) | Apparatus and method for detecting code cloning of software | |
US8181163B2 (en) | Program synthesis and debugging using machine learning techniques | |
US7278135B2 (en) | Method and system for generating an efficient test suite from a domain description with given constraints | |
CN108595341B (zh) | 测试用例自动生成方法及系统 | |
US8019709B2 (en) | Method and system for rule-based content filtering | |
US6321376B1 (en) | Apparatus and method for semi-automated generation and application of language conformity tests | |
US8732676B1 (en) | System and method for generating unit test based on recorded execution paths | |
US20040260516A1 (en) | Method and system for supporting negative testing in combinatorial test case generators | |
US20200225921A1 (en) | Lookup table optimization for programming languages that target synchronous digital circuits | |
US8701084B1 (en) | Preview of auto-fix changes to software code | |
US20200210158A1 (en) | Automated or machine-enhanced source code debugging | |
CN110633200A (zh) | 用于测试智能合约的方法和设备 | |
CN111694746A (zh) | 面向编译型语言AS3的Flash缺陷模糊测评工具 | |
Delahaye et al. | Infeasible path generalization in dynamic symbolic execution | |
CN112085166B (zh) | 一种卷积神经网络模型加速训练方法、装置、电子设备及存储介质 | |
Binkley et al. | Tree-oriented vs. line-oriented observation-based slicing | |
JP2023071664A (ja) | フォーマット特有のデータ処理動作 | |
Hodován et al. | Tree preprocessing and test outcome caching for efficient hierarchical delta debugging | |
CN112783786A (zh) | 测试案例的生成方法、装置、设备、介质和程序产品 | |
US20150121508A1 (en) | Method, a computer program and apparatus for analyzing symbols in a computer | |
Guo | Mongodb's javascript fuzzer | |
Lasser et al. | CoStar: a verified ALL (*) parser | |
Schulz | A Comparison of Different Techniques for Grounding Near-Propositional CNF Formulae. | |
CN113076260B (zh) | 一种集成片段信息的结构化输入程序安全检测方法及设备 | |
CN111258562B (zh) | Java代码质量检查方法、装置、设备和存储介质 |
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 | ||
GR01 | Patent grant | ||
GR01 | Patent grant |