一种残膜回收机防缠绕挑膜装置的制 一种秧草收获机用电力驱动行走机构

基于模糊测试的程序测试方法和装置与流程

2022-06-29 21:10:22 来源:中国专利 TAG:


1.本公开涉及测试技术领域,具体涉及一种基于模糊测试的程序测试方法和装置。


背景技术:

2.模糊测试通过自动化的方式对程序进行测试,能够极大地节省人力。然而,现有的模糊测试根据一定的规则随机地生成测试用例,盲目性较高,测试效率较低。


技术实现要素:

3.有鉴于此,本公开提供一种基于模糊测试的程序测试方法和装置,以提高模糊测试的测试效率。
4.第一方面,提供一种基于模糊测试的程序测试方法,包括:利用静态分析生成包含函数间接调用关系的函数调用图和控制流图;利用所述函数调用图和所述控制流图生成可达集合,其中,所述可达集合中的代码通过跳转到达待测的目标代码;计算可达集合中的代码到所述目标代码的距离;利用所述距离对所述程序进行模糊测试。
5.可选的,在一些实施例中,所述函数调用图和所述控制流图包括函数的间接调用关系。
6.可选地,在一些实施例中,所述利用所述距离对所述程序进行模糊测试包括:交替使用基于覆盖率的模糊测试和导向式模糊测试对所述程序进行模糊测试,其中,所述基于覆盖率的模糊测试利用模糊测试过程中产生的覆盖率信息更新种子集合,所述导向式模糊测试利用模糊测试过程中产生的距离信息更新所述种子集合。
7.可选地,在一些实施例中,所述交替使用基于覆盖率的模糊测试和导向式模糊测试对所述程序进行模糊测试包括:当使用所述基于覆盖率的模糊测试对所述程序进行模糊测试时,在满足第一预设条件后,切换为使用导向式模糊测试对所述程序进行模糊测试;当使用所述导向式模糊测试对所述程序进行模糊测试时,在满足第二预设条件后,切换为使用基于覆盖率的模糊测试对所述程序进行模糊测试。
8.可选地,在一些实施例中,所述第一预设条件包括在第一预设时间内没有产生新的覆盖率信息,所述第二预设条件包括在第二预设时间内没有产生新的覆盖率信息。
9.可选地,在一些实施例中,所述计算可达集合中的代码到目标代码的距离包括:利用广度优先搜索方法计算所述可达集合中的代码到目标代码的距离。
10.可选地,在一些实施例中,所述通过静态分析生成函数调用图和控制流图包括:使用快速类型分析生成所述函数调用图;基于所述函数调用图生成所述控制流图。
11.可选地,在一些实施例中,所述通过静态分析生成函数调用图和控制流图包括:将所述程序编译为llvm的中间代码形式;静态分析所述中间代码形式,生成所述函数调用图和控制流图。
12.可选地,在一些实施例中,所述程序为操作系统内核程序。
13.可选地,在一些实施例中,所述可达集合中的代码为基本块代码。
14.第二方面,提供一种基于模糊测试的程序测试的装置,包括:分析模块,被配置为利用静态分析生成包含函数间接调用关系的函数调用图和控制流图;生成模块,被配置为利用所述函数调用图和所述控制流图生成可达集合,其中,所述可达集合中的代码通过跳转到达待测的目标代码;计算模块,被配置为计算可达集合中的代码到所述目标代码的距离;测试模块,被配置为利用所述距离对所述程序进行模糊测试。
15.可选的,在一些实施例中,所述函数调用图和所述控制流图包括函数的间接调用关系。
16.可选地,在一些实施例中,所述利用所述距离对所述程序进行模糊测试包括:交替使用基于覆盖率的模糊测试和导向式模糊测试对所述程序进行模糊测试,其中,所述基于覆盖率的模糊测试利用模糊测试过程中产生的覆盖率信息更新种子集合,所述导向式模糊测试利用模糊测试过程中产生的距离信息更新所述种子集合。
17.可选地,在一些实施例中,所述交替使用基于覆盖率的模糊测试和导向式模糊测试对所述程序进行模糊测试包括:当使用所述基于覆盖率的模糊测试对所述程序进行模糊测试时,在满足第一预设条件后,切换为使用导向式模糊测试对所述程序进行模糊测试;当使用所述导向式模糊测试对所述程序进行模糊测试时,在满足第二预设条件后,切换为使用基于覆盖率的模糊测试对所述程序进行模糊测试。
18.可选地,在一些实施例中,所述第一预设条件包括在第一预设时间内没有产生新的覆盖率信息,所述第二预设条件包括在第二预设时间内没有产生新的覆盖率信息。
19.可选地,在一些实施例中,所述计算可达集合中的代码到目标代码的距离包括:利用广度优先搜索方法计算所述可达集合中的代码到目标代码的距离。
20.可选地,在一些实施例中,所述通过静态分析生成函数调用图和控制流图包括:使用快速类型分析生成所述函数调用图;基于所述函数调用图生成所述控制流图。
21.可选地,在一些实施例中,所述通过静态分析生函数调用图和控制流图包括:将所述程序编译为llvm的中间代码形式;静态分析所述中间代码形式,生成所述函数调用图和控制流图。
22.可选地,在一些实施例中,所述程序为操作系统内核程序。
23.可选地,在一些实施例中,所述可达集合中的代码为基本块代码。
24.第三方面,提供一种计算机可读存储介质,其上存储有可执行代码,当所述可执行代码被执行时,能够实现如第一方面所述的方法。
25.第四方面,提供一种计算机程序产品,包括可执行代码,当所述可执行代码被执行时,能够实现如第一方面所述的方法。
26.本公开实施例提供的程序测试方法,在计算程序中的代码到目标代码的距离前,先利用函数调用图和控制流图对目标代码做可达性分析,生成可达集合。在计算程序中的代码到目标代码的距离时,仅计算可达集合中的代码到目标代码的距离。相比于相关技术中计算全量代码到目标代码的距离,仅计算可达集合中的代码到目标代码的距离,可以有效地提高计算代码间距离的效率,从而提高测试效率。
附图说明
27.图1是本公开一实施例提供的基于模糊测试的程序测试方法的流程示意图。
28.图2是本公开又一实施例提供的基于模糊测试的程序测试方法的流程示意图。
29.图3是本公开一实施例提供的基于模糊测试的程序测试的装置的结构示意图。
30.图4是本公开又一实施例提供的基于模糊测试的程序测试的装置的结构示意图。
31.图5是本公开又一实施例提供的基于模糊测试的程序测试的装置的结构示意图。
具体实施方式
32.下面对本公开实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅是本公开一部分实施例,而不是全部的实施例。
33.基本块
34.基本块(basic block,bbl)是指程序中顺序执行的语句序列。基本块中只有一个入口和一个出口,入口就是其中的第一条语句,出口就是其中的最后一条语句。对一个基本块来说,执行时只从其入口进入,从其出口退出。
35.只有一个入口表示程序中不会有其他任何代码可以通过跳转等方式进入基本块除入口外的其他代码中。只有一个出口表示程序只有执行到最后一条指令后才会执行其他基本块中的指令。
36.基本块的一个典型特点是:只要基本块中第一条指令被执行了,那么基本块内所有执行都会按照顺序仅执行一次。
37.函数调用图
38.函数调用图(call graph,cg)是程序分析中的概念。函数调用图是一种描述程序中所有函数之间调用关系的有向图。函数调用图中的每个节点表示一个函数,节点之间的有向边表示函数之间的调用关系。
39.控制流图
40.控制流图(control flow graph,cfg)是程序分析中的概念。控制流图是一种描述程序执行流程的有向图。控制流图由代码块节点和连接代码块的边组成。一个代码块可以是一个函数,也可以是一个基本块。控制流图中包含了程序中所有可能执行的分支信息。通常将描述一个函数内控制流信息的图称作“过程内”控制流图,将描述整个程序控制流信息的图称作“过程间”控制流图。
41.灰盒模糊测试
42.灰盒模糊测试(graybox fuzzing,gf)是指通过向被测的程序提供大量测试用例从而发现程序中漏洞的过程。灰盒测试是在传统随机模糊测试上的改进。灰盒模糊测试可以根据目标程序内部结构信息指导测试用例生成,从而提高测试效率。
43.基于覆盖率的灰盒模糊测试
44.基于覆盖率的灰盒模糊测试(coverage based graybox fuzzing,cgf)目标是最大程度的覆盖目标程序的代码从而发现程序中漏洞。基于覆盖率的灰盒模糊测试也可以称为基于覆盖率的模糊测试。基于覆盖率的灰盒模糊测试是目前应用最广泛的模糊测试。
45.导向式灰盒模糊测试
46.导向式灰盒模糊测试(directed greybox fuzzing,dgf)的核心思想是将测试精力集中在程序的目标代码区域上,而不是像传统的基于覆盖率的灰盒模糊测试那样花费大量时间进行随机地路径探测。导向式灰盒模糊测试也可以称为导向式模糊测试或定向模糊
测试。导向式灰盒模糊测试具有很强的实用性,可以更好地利用计算资源,在实际测试大规模程序时,比基于覆盖率的灰盒模糊测试更加有效。
47.程序,也可以称为计算机程序,是一组计算机可以识别和执行的指令。程序可以运行于计算机上,以满足用户的某种需求。一个程序可以由多个子程序组成。每个子程序也可以称为一个计算机函数(或称函数)。函数可以指一段可以直接被另一段函数引用的代码或指令集。
48.一个程序可以仅通过一个函数(或子程序)实现,也可以通过多个函数实现。本公开对程序包含的函数的数量不做限定。程序可以利用多种不同类型的编程语言编写,本公开对程序具体使用的编程语言类型不做限定。例如,程序可以利用c语言编写。又如,程序可以利用java语言编写。一个程序可以由同一种编程语言实现,也可以由多种不同类型的编程语言共同实现,本公开对一个程序使用的编程语言的数量不做限定。
49.计算机软件(或称软件)可以是对计算机系统中程序和文档的总称。在一些场景中,软件也可以指代程序。本公开对软件和程序不作区分,即,本公开提及的程序也可以指计算机软件。
50.为了保证程序运行过程中的健壮性,通常需要对程序进行测试。测试的主要目的是挖掘程序中的漏洞。程序中的漏洞指程序的异常运行状态,或者说,程序不符合预期的运行状态。例如,程序的漏洞可以指程序编写中缺乏某些判断(例如,缺乏对除法操作的被除数的非零判断),导致程序崩溃。又如,程序的漏洞可以指程序运行过程中非预期地修改了程序中的某些变量(例如非预期地修改了某个全局变量),影响程序正常运行。程序中的漏洞可能造成严重的影响。例如,程序漏洞可能导致程序甚至计算机系统崩溃。
51.为了便于理解,以操作系统为例介绍程序漏洞对实际使用的影响。操作系统可以看做是一种大型的程序。操作系统是整个计算机系统的核心部件。操作系统可以向下实现对底层硬件资源的抽象,向上为应用层提供服务。内核(或称操作系统内核),是一个操作系统的核心,是基于硬件的第一层软件扩充。内核可以为操作系统提供最基本的功能,是操作系统工作的基础。内核可以负责管理系统的进程、内存、设备驱动程序、文件和网络系统等。内核的性能和稳定性决定着操作系统的性能和稳定性。
52.随着互联网技术的不断发展,各种计算设备、移动终端、物联网等设备的数量呈现爆发式增长。为了与之适配,操作系统的数量和种类也不断地增加。相应地,操作系统内核的数量和种类也随之增加。由于操作系统使用范围广泛,因此,操作系统内核漏洞具有危险性大、影响范围广等特点。这些特点导致对操作系统内核的漏洞挖掘工作存在巨大的挑战。
53.操作系统内核漏洞已造成非常严重的损失。例如,2016年爆发的脏牛漏洞(cve-2016

5195)可被攻击者所利用以实现内核提权,从而控制整个系统。脏牛漏洞影响了多个基于linux内核的操作系统,例如移动端、pc端和服务器端的操作系统。可见,程序的漏洞挖掘是目前软件与计算机系统安全领域亟需解决的问题。
54.目前在程序漏洞挖掘方面所采用的方法主要有人工分析、静态分析和模糊测试等。传统的漏洞挖掘方法主要基于人工分析。人工分析过度依赖测试人员的知识和经验,需要耗费较多的人力。而且人工分析能够检测到的漏洞数量极为有限,难以满足对程序(尤其是大型程序)的测试需求。
55.程序静态分析(program static analysis)是指不运行代码,仅通过词法分析、语
法分析、控制流、数据流分析等技术对程序代码进行扫描,验证代码是否满足规范性、安全性、可靠性、可维护性等指标的一种代码分析技术。程序静态分析也可以简称为静态分析。在一些实施例中,静态分析也可以根据人工总结的漏洞模式进行漏洞挖掘。
56.随着静态分析技术的发展,静态分析能够发现更多传统意义上动态测试才能发现的缺陷。例如,静态分析可以发现符号执行、抽象解释、值依赖分析等缺陷。
57.相比于人工分析方法,静态分析方法自动化程度高。然而,相关技术中的静态分析方法存在误报率高、扩展性差等问题。
58.模糊测试通过在被测程序运行过程中向其提供大量的测试用例(test case)的方式修改程序运行状态,并监控其是否产生异常行为来检测程序漏洞。相比于人工分析和静态分析,模糊测试技术自动化程度高、误报率低,因此,逐步成为目前主流的漏洞挖掘方法。
59.测试用例可以指为某个特殊目标而编写的一组测试输入、执行条件以及预期结果,用于核实程序在执行该组输入后,是否能得到预期的输出。本公开提及的测试用例也可以表示一组完整的测试用例,也可以仅表示程序的测试输入。
60.模糊测试的测试输入也可以称为种子或种子文件。种子文件可以作为程序的输入用于测试目标程序。因此,也可以称为输入文件。种子文件也可以指模糊测试工具生成的用于测试目标程序的输出文件,因此,也可以将种子文件称为输出文件。种子文件可以作为模糊测试的输入,通过模糊测试的变异生成新的用于测试的种子文件。
61.传统的模糊测试生成种子文件的过程是基于随机生成的方式。利用该随机生成的输入文件(或称种子文件)对程序进行测试,测试过程盲目性较高,浪费大量计算资源,且效率较低。因此,目前多使用灰盒模糊测试。灰盒模糊测试主要包括基于覆盖率的灰盒模糊测试和导向式的灰盒模糊测试。
62.基于覆盖率的模糊测试主要关注如何提高程序覆盖率,以对程序进行更为全面的测试。然而,这种基于覆盖率的模糊测试技术仍然存在盲目性高、效率较低的问题。例如,在对大型程序(例如操作系统内核)进行测试时,很难在较短时间内取得较高的覆盖率,严重影响了程序漏洞挖掘的效率。
63.为了提高漏洞挖掘的效率,可以使用导向式模糊测试。与基于覆盖率的模糊测试不同,导向式模糊测试只关注对程序中指定的代码位置(为了便于描述,将指定的代码位置称为目标代码)的覆盖。定向模糊测试的目标是生成能触发目标代码的测试用例,以实现针对目标代码的漏洞挖掘。
64.现有的导向式模糊测试技术主要以距离信息为反馈指标,不断引导模糊测试生成距离目标代码位置更近的测试用例(例如程序输入),直到触发目标位置。距离信息可以指程序中其他的代码到目标代码之间的距离。相比于基于覆盖率的模糊测试,导向式模糊测试更加高效。
65.然而,相关技术提供的导向式模糊测试在计算静态距离时存在时间开销较大的问题,严重影响了漏洞挖掘的效率。
66.有鉴于此,本公开提供一种基于模糊测试的程序测试方法,以提高模糊测试的测试效率。
67.图1是本公开一实施例提供的基于模糊测试的程序测试方法的流程示意图。如图1所示,本公开提供的测试方法可以包括步骤s110至步骤s140。
68.在步骤s110,利用静态分析生成函数调用图和控制流图。静态分析是一种在不运行程序的前提下对程序进行分析的方法。静态分析可以由人工完成,也可以由计算机软件或硬件实现。本公开对静态分析的具体实现方法不做限定。
69.可以通过多种方式对程序进行静态分析。例如,可以直接分析程序的源码。又如,可以对程序进行编译,分析编译后生成的文件。编译过程通常会生成中间文件和二进制文件。在一些实施例中,可以对编译后生成的中间文件进行分析。通常而言,不同的编程语言使用相同的编译器(例如gcc或clang)编译得到的中间文件形式相同或类似。因此,分析编译后生成的中间文件,可以适用于多种编程语言,通用性强。
70.作为一个示例,可以将程序编译为llvm的中间代码形式。中间代码形式也可以称为中间表达式(intermediate representation,ir)。llvm的中间代码有成熟的静态分析工具。因此,将程序编译为llvm中间代码形式,可以复用已有的工具,实现简单。可以通过多种方式将程序编译为llvm的中间代码形式。例如,可以使用clang编译器将程序编译为llvm中间形式。
71.通过对程序进行静态分析,可以生成程序的函数调用图和控制流图。函数调用图可以表示程序中函数之间的调用关系。控制流图可以表示程序中所有可能执行的分支信息。
72.根据前文的介绍可知,一个程序通常包含多个函数。通过生成函数调用图,可以确认函数之间的调用关系,从而便于计算程序中代码到目标代码的距离。通过静态分析生成函数调用图和控制流图的方法将在后文结合具体的实施例进行介绍。
73.在步骤s120,利用函数调用图和控制流图生成可达集合。其中,可达集合中的代码可以通过跳转到达待测的目标代码。
74.可达集合中的代码可以指函数级别的代码,也可以指基本块级别的代码。本公开对可达集合中代码的具体指代范围不做限定。由前文描述可知,基本块是程序中可以连续执行的最小代码块。因此,可达集合中存储基本块级别的代码,计算出的代码到待测的目标代码之间的距离更准确,误报率更低。
75.待测的目标代码可以指导向式模糊测试过程中作为测试目标的代码块。目标代码可以指函数级别的代码,也可以指基本块级别的代码。目标代码以基本块为粒度,可以提升模糊测试过程的精度和针对性,降低误报。
76.可达集合中的代码可以通过跳转到达待测的目标代码,表示可达集合中的代码可以通过跳转的方式执行至待测的目标代码。跳转可以指在不同的代码块之间跳转。例如,程序在执行过程中从一个代码块跳转至另一个代码块。跳转也可以指程序顺序执行过程中由一个代码块执行至另一个代码块。本公开对代码块之间的跳转行为的具体指代不做限定。
77.本公开对不同的代码块的具体指代不做限定。例如,不同的代码块可以指程序中不同的函数。又如,不同的代码块可以指不同的函数中不同的基本块。又如,不同的代码块可以指同一函数中不同的基本块。
78.在步骤s130,计算可达集合中的代码到目标代码的距离。本公开对可达集合中的代码到目标代码的距离的具体类型不做限定。例如,可达集合中的代码到目标代码的距离可以指代码间的静态距离。
79.可以通过多种方式计算可达集合中的代码到目标代码的距离。作为一个示例,可
以利用广度优先算法(例如广度优先搜索算法)得到可达集合中的代码到目标代码的距离。以控制流图中包含v个点和e条边为例。每个点可以指一个代码块,每条边可以指不同代码块之间的指向关系。使用迪杰特斯拉方法,算法的复杂度为o(v2),使用广度优先算法,算法的复杂度为o(v e)。因此,相比于现有技术中使用的迪杰斯特拉方法,使用广度优先搜索计算距离,可以有效地降低算法复杂度,同时提升计算效率,且不影响计算结果的准确性。
80.在一些实施例中,可以设置具有相邻跳转关系(例如直接调用关系或间接调用关系)的两个代码块之间的距离为固定值。通过设置具有相邻跳转关系的代码块之间的距离为固定值,可以进一步降低距离计算的复杂度,提升距离计算过程的计算效率。
81.在另一些实施例中,也可以为不同的相邻跳转关系之间的距离设置权重。例如,可以设置跳转概率更高的跳转关系权重更高或者更低。通过为距离设置权重,可以提高距离计算的精确度,使得按该距离进行模糊测试时,测试效率更高。
82.在步骤s140,利用距离对程序进行模糊测试。可以通过多种不同的方式利用距离对程序进行模糊测试,本公开对利用距离对程序进行模糊测试的具体方式不做限定。
83.在一些实施例中,利用距离对程序进行模糊测试可以包括:从种子集合中选择一个或几个种子文件进行变异得到新的种子文件;利用新的种子文件对程序进行模糊测试;利用距离信息更新模糊测试的种子集合。
84.本公开对测试的种子集合的来源不做限定。例如,可以不设置种子集合,利用传统的模糊测试方式随机生成预定数量的种子文件作为测试的种子集合。又如,可以获取已有的种子文件作为测试的种子集合。
85.利用新的种子文件对程序进行模糊测试可以有多种方式。例如,可以将新的种子文件作为程序的输入执行该程序,监控执行后的输出或执行结果是否符合预期,以判断该种子文件是否触发程序漏洞或生成新的代码覆盖。
86.可以利用多种方式对种子集合进行更新,本公开对更新种子集合的具体方式不做限定。作为一个示例,可以在每次执行完模糊测试后对种子文件的距离进行排序,保留距离最近的n个种子文件作为模糊测试的输入文件。种子文件的距离例如可以指种子文件执行过程中覆盖的代码到目标代码的距离。本公开对种子文件距离的具体计算方式不做限定。例如,可以选择种子文件执行过程中覆盖的代码到目标代码的最近距离作为种子文件的距离。又如,可以选择种子文件执行过程中所有覆盖的代码到种子文件的距离的平均值作为种子文件的距离。n可以指任意的自然数。n的实际数值可以根据测试需求设置,本公开对模糊测试过程中保留的种子文件的具体个数不做限定。
87.本公开实施例提供的模糊测试方法,在计算程序中的代码到目标代码的距离前,先对程序中的代码进行可达分析,仅对可达集合内的代码计算距离,减少了对其他与目标代码无关的代码的距离计算开销。因此,相比于相关技术的定向模糊测试,本公开实施例提供的模糊测试计算开销小,测试效率高。本公开实施例提供的模糊测试,也可以称为一种轻量级的模糊测试方法。
88.前文提及了利用静态分析生成函数调用图和控制流图,下文将对利用静态分析生成函数调用图和控制流图的方式进行介绍。
89.可以通过多种方式利用静态分析生成函数调用图和控制流图。本公开对具体的静态分析方法不做限定。实际中,可以仅利用静态分析生成函数调用图或控制流图。在计算代
码间距离时,可以仅利用函数调用图计算程序中的代码到目标代码之间的距离,或仅利用控制流图计算程序中的代码到目标代码之间的距离。应理解,仅利用函数调用图或控制流图计算代码之间的距离,计算简单。而同时根据函数调用图和控制流图计算距离,计算的结果更加精确,且可以降低模糊测试过程中产生误报的概率。
90.在一些实施例中,通过静态分析生成的函数调用图和控制流图可以包含函数的间接调用关系。可以通过多种方式生成包含函数的间接调用关系的函数调用图和控制流图。例如,可以使用快速类型分析(rapid type analysis)生成函数调用图,基于函数调用图生成控制流图。
91.快速类型分析方法不仅可以生成函数的直接调用关系,还可以生成间接调用关系,因此,利用快速类型分析方法生成的函数调用图调用关系更加全面,可以避免相关技术中由于不考虑函数间接调用关系导致的误报和漏报,从而提高测试精度。
92.基于包含函数间接调用关系的函数调用图生成的控制流图,也包含函数的间接调用关系。利用包含函数间接调用关系的函数调用图和控制流图生成可达集合,可达集合中的代码更全面。因此,生成包含函数间接调用关系的函数调用图和控制流图可以提高模糊测试的可靠性
93.为了便于理解,对函数间的间接调用关系进行简要介绍。程序中的函数之间,可能存在间接调用关系。间接调用关系也可以称为间接调用、间接跳转、间接分支等。间接调用可以指程序中的控制流跳转。间接调用的寻址方式并非通过直接寻址,而是通过间接寻址计算得到。
94.以c语言(例如c )为例,程序中使用函数指针或虚函数等实现的函数调用,都可能产生间接跳转。例如,函数func1调用了函数指针pfunc。函数指针pfunc可以表示指向函数的指针。在不同的条件下,函数指针pfunc可能对应于不同的函数实现。例如,函数指针pfunc可能指向func2或func3。而函数指针pfunc在函数func1中实际指向的函数(例如func2或func3)则根据程序的实际运行决定。这种需要根据程序实际运行决定具体的函数的函数调用,可以称为函数的间接调用。
95.在一些实施例中,利用距离对程序进行模糊测试可以包括交替使用基于覆盖率的模糊测试和导向式模糊测试对程序进行模糊测试。其中,基于覆盖率的模糊测试利用模糊测试过程中产生的覆盖率信息更新种子集合,导向式模糊测试利用模糊测试过程中产生的距离信息更新所述种子集合。
96.基于覆盖率的模糊测试和导向式的模糊测试在单独测试的过程中,都可能产生测试瓶颈。测试瓶颈例如可以指无论对种子集合中的种子进行何种变异,产生的新种子都无法覆盖新的代码。换句话说,测试瓶颈可以指模糊测试过程中,新生成的种子无法增加程序的代码覆盖率。应理解,测试过程对程序的代码的覆盖率越高,表示对程序的测试越全面。
97.通过交替使用基于覆盖率的模糊测试和导向式模糊测试对程序进行模糊测试,可以避免仅使用一种模糊测试方式产生的测试瓶颈。同时可以弥补静态分析的局限性,实现对距离信息的合理利用。
98.可以通过多种方式交替使用基于覆盖率的模糊测试和导向式模糊测试,本公开对具体的交替方式不做限定。
99.在一些实施例中,可以先使用基于覆盖率的模糊测试对程序进行模糊测试,当满
足第一条件后,切换为导向式模糊测试对程序进行模糊测试。第一条件可以根据实际的测试需要进行选择。例如,第一条件可以指测试产生的覆盖率满足预设的覆盖率指标。又如,第一条件可以指测试过程不再产生新的代码覆盖。又如,第一条件可以指满足某一预设的测试时长(例如5分钟或1小时)。
100.在另一些实施例中,可以先使用导向式模糊测试对程序进行模糊测试,当满足第二条件后,切换为导向式模糊测试对程序进行模糊测试。应理解,第一条件和第二条件仅为了方便描述,并非用于限定具体的条件。第二条件可以参见第一条件的描述。
101.在又一些实施例中,可以随机选择首先使用的模糊测试方式,当满足一定条件后,切换为另一种模糊测试方式。例如,可以先使用基于覆盖率的模糊测试进行测试,当满足第一预设条件后,切换为使用导向式模糊测试对程序进行测试。在使用导向式模糊测试进行测试时,当满足第二预设条件后,切换为使用基于覆盖率的模糊测试对程序进行模糊测试。
102.应理解,第一预设条件和第二预设条件仅为了方便描述。第一预设条件和第二预设条件可以是相同的条件,也可以是不同的条件。本公开对第一预设条件和第二预设条件的具体设置方式不做限定。
103.作为一个示例,第一预设条件可以包括在第一预设时间内没有产生新的覆盖率信息,第二预设条件可以包括在第二预设时间内没有产生信息的覆盖率信息。第一预设时间和第二预设时间可以相同。例如,第一预设时间和第二预设时间可以都设置为5分钟。第一预设时间和第二预设时间也可以不同。例如,第一预设时间可以设置3分钟,第二预设时间可以设置6分钟。
104.作为另一个示例,第一预设条件可以包括执行第一预设时长的模糊测试,第二预设条件可以包括在第二预设时间内没有产生新的覆盖率信息。
105.通过交替使用基于覆盖率的模糊测试和导向式模糊测试,可以提升测试效率,防止产生测试瓶颈。
106.应理解,随着技术的发展,可能产生其他灰盒模糊测试方式。本公开对交替使用的模糊测试的具体种类不做限定。
107.根据前文的描述可知,操作系统内核代码具有种类多,代码量大,调用关系复杂等特点。本公开提供的方法可以应用于对操作系统内核代码的测试。相比于现有的操作系统内核代码的测试方法,本公开提供的方法可以提高测试精度和效率,减少误报。
108.为了使方案更加清晰,下文将结合图2以一个具体的实施例介绍本公开提供的程序测试方法。
109.图2是本公开又一实施例提供的基于模糊测试的程序测试方法的流程示意图。如图2所示,本实施例可以包括步骤s201~s207,下面分别对每个步骤进行介绍。
110.步骤s201,编译程序代码为llvm中间代码。程序可以指任意的程序,例如,程序可以指操作系统的内核程序。可以使用多种方式将程序代码编译为llvm中间代码,例如,可以使用clang编译器将程序代码编译为llvm中间代码。
111.步骤s202,生成函数调用图和控制流图。可以通过多种方式生成函数调用图和控制流图。例如,可以利用广度优先算法生成函数调用图,利用函数调用图生成控制流图。较优地,函数调用图和控制流图可以包括函数的间接调用关系。通过生成包含间接调用关系的函数调用图和控制流图,可以使得函数调用图和控制流图更准确和全面,减少由于缺乏
间接调用关系导致的漏报。
112.在一些实施例中,可以直接使用广度优先算法生成包含函数间接调用关系的函数调用图。在另一些实施例中,也可以先利用传统的静态分析方法生成不包含函数间接调用关系的函数调用图,再利用广度优先算法补充缺失的函数的间接调用关系。通过两种方法的结合,可以提高生成的函数调用图的准确性。
113.步骤s203,生成可达集合。可以利用函数调用图和控制流图生成可达集合。可达集合中的代码可以通过跳转等方式到达待测的目标代码。可达集合中的代码和目标代码都可以是函数级别的代码。较优地,可达集合中的代码和目标代码都可以是基本块级别的代码。基本块为代码的最小逻辑单位。通过以基本块为粒度进行可达集合分析,可以提高模糊测试的测试精度,提高测试准确性,减少误报。
114.步骤s204,计算可达集合中的代码到目标代码的距离。可以通过多种方式计算可达集合中的代码到目标代码的距离。例如,可以利用迪杰斯特拉方法计算可达集合中的代码到目标代码的距离。又如,可以利用广度优先算法或深度优先算法计算可达集合中的代码到目标代码之间的距离。广度优先算法计算过程简单,复杂度低,可以提升计算效率。
115.作为一个示例,当可达集合中的代码和目标代码都是基本块级别的代码时,可以使用如下公式计算每个代码块的距离:
[0116][0117]
其中di为基本块i目标基本块的距离。基本块j能直接调用基本块i。直接调用例如可以指从基本块j可以不经过其他基本块直接执行基本块i。可以理解,基本块为代码的最小逻辑单元。因此,以基本块组成的控制流图的边可以没有权重信息。即,以基本块组成的控制流图中,相邻基本块之间的距离可以取固定值(例如1)。当基本块之间的距离没有权重信息时,可以进一步简化距离计算过程,提高距离计算的效率。
[0118]
在一些实施例中,步骤s201~s204可以在模糊测试的初始阶段执行,在模糊测试的动态测试过程中,可以不再执行步骤s201~s204。即,在模糊测试过程中可以不更新可达集合到目标代码之间的距离。应理解,程序的实际调用关系在测试过程中通常不会发生改变。因此,测试过程中函数调用图和控制流图通常不会发生改变。通过静态分析得到可达集合到目标代码之间的距离后,不再更新距离,可以减少计算过程,有效地节约计算资源。此时,步骤s201~s204可以称为静态分析阶段。
[0119]
在另一些实施例中,可以在模糊测试的过程中动态更新函数调用图和控制流图。应理解,虽然函数实际调用关系在测试过程中通常不会发生改变,然而通过静态分析生成的函数调用图和控制流图可能并不全面。例如,通过静态分析生成的函数调用图和控制流图可能不包含需要实际运行才能确认调用关系的代码块之间函数调用关系和控制关系。通过在模糊测试过程中更新函数调用图和控制流图,并根据更新的函数调用图和控制流图更新可达集合中的代码到目标代码之间的距离,可以提高测试的准确性,降低漏报。
[0120]
可以通过各种方式对函数调用图和控制流图进行更新。例如,可以实时更新。即,每执行一个测试用例即更新一次函数调用图和控制流图。又如,可以每执行一段时间(例如5分钟)或每执行一定数量的测试用例(例如100个)后对函数调用图和控制流图进行更新。
[0121]
步骤s205,利用预定义的种子文件进行模糊测试。预定义的种子文件可以是任意数量的种子文件。例如,可以不设置起始种子文件,直接利用传统的模糊测试方法随机生成种子文件进行模糊测试。又如,可以利用现有的种子文件作为初始的种子集合进行模糊测试的变异。
[0122]
以操作系统内核为例,通常的操作系统内核会提供一定数量的测试文件。可以利用程序提供的测试文件作为起始的种子集合进行模糊测试,以提高测试效率。
[0123]
在一些实施例中,在步骤s205的执行过程中,可以将能触发程序异常的种子文件加入种子集合,直到种子集合中的种子文件的数量达到或超过预定的数量。程序异常可以包括使程序产生不符合预期的输出、不符合预期地修改程序中的某些变量、种子文件执行过程中产生了新的代码覆盖(或称提升了覆盖率)等。
[0124]
预定数量可以根据测试需要进行设置。作为一个示例,可以设置预定数量为100。即,当种子集合中的种子文件的数量达到或超过100时,可以停止执行步骤s205,继续执行下一个步骤。
[0125]
步骤s206,根据距离更新种子集合。根据距离更新种子集合,也可以称为导向性模糊测试阶段或近距离种子利用阶段。可以利用多种方式根据距离更新种子集合。例如,可以在执行模糊测试的过程中,计算每个种子的距离,保留距离最近的前m个种子文件作为变异的种子集合。m可以是任意的自然数。m的具体数值可以根据测试需求进行设定。
[0126]
作为一个示例,可以设置m为30。即,每次模糊测试选择种子文件进行变异时,可以从前30个距离最近的种子文件中选择作为变异起点的种子文件。变异起点的种子文件例如可以指模糊测试工具的输入。模糊测试工具可以对输入的种子文件进行随机的改变,生成新的种子文件。例如,模糊测试可以删除输入的种子文件中的几个字符,并将删除了上述字符后的文件作为新的种子文件输出。该新的种子文件可以作为程序的输入,对程序进行测试。
[0127]
可以理解,种子文件的距离越近,触发目标代码的可能性越高。因此,对种子文件的距离进行排序,对距离最近的前m个种子文件执行变异操作,生成新的用于测试的种子文件,新的种子文件触发目标代码的概率更高。相应地,可以提升模糊测试的效率。
[0128]
在一些实施例中,可以在更新后仅保留前m个距离最近的种子文件,而删除其他的种子文件,以降低测试过程中占用的存储空间。
[0129]
根据前文的描述可知,一种类型的模糊测试(例如导向式模糊测试)在测试过程中,可能产生测试瓶颈。因此,可以为步骤s206设置退出条件。例如,可以设置每生成一定数量的测试用例后,即退出步骤s206。又如,可以设置每持续t1分钟不再生成新的代码覆盖后,退出步骤s206。
[0130]
退出步骤s206后,可以继续执行步骤s207。在一些实施例中,当判断当前的模糊测试执行满足预设的退出条件后,也可以退出本次模糊测试。预设的退出条件可以根据测试需要设置。例如,可以设置执行10万次测试用例后退出本次模糊测试。又如,可以设置执行一定时间(例如20小时、2天等)后退出模糊测试。
[0131]
步骤s207,根据覆盖率更新种子集合。根据覆盖率更新种子集合,也可以称为基于覆盖率的模糊测试阶段或新路径探索阶段。
[0132]
在步骤s207,从种子集合中选择覆盖率高的种子文件作为变异的输入文件生成新
的种子文件;利用新的种子文件测试程序;将触发新路径的种子加入种子集合。
[0133]
根据覆盖率选择种子文件时,可以以覆盖率为权重对种子文件进行排序,选择覆盖率最高的前k个种子文件进行变异。k可以是任意的自然数,本公开对k的实际取值不做限定。应理解,根据覆盖率选择种子文件的方式不限于上述方式。
[0134]
与步骤s206类似,步骤s207对应的阶段也可能产生测试瓶颈。因此,可以对步骤s207也设置退出条件。退出条件的具体设置可以参见步骤s206中对应的描述。退出步骤s207后,可以重新执行步骤s206。即,实际的模糊测试过程中,可以交替使用导向性模糊测试和基于覆盖率的模糊测试,以提升测试效率,充分利用距离信息。退出步骤s207后,当判断当前模糊测试满足退出条件时,也可以退出本次模糊测试。
[0135]
应理解,上述步骤可以全部使用,也可以根据需要选择其中的部分步骤进行模糊测试。例如,可以不执行步骤s205,直接从步骤s206或步骤s207开始动态模糊测试。
[0136]
本公开实施例提供的模糊测试方法,可以充分利用静态分析生成的距离信息,提升模糊测试的效率和准确性。通过仅对可达代码到目标代码的距离进行计算,可以降低占用的计算资源,减少导向性模糊测试在距离计算阶段计算开销较大的问题。通过对函数间接调用关系的分析和利用,弥补了现有工具不考虑间接调用导致的误报。
[0137]
前文结合图1和图2,详细描述了本公开的方法实施例,下文将结合图3至图5,详细描述本公开的装置实施例。应理解,方法实施例的描述与装置实施例的描述相互对应,因此,装置实施例中未详细描述的部分可以参见前文方法实施例对应的介绍。
[0138]
图3是本公开一实施例提供的基于模糊测试的程序测试的装置的结构示意图。如图3所示,装置300可以包括分析模块310、生成模块320、计算模块330以及测试模块340。
[0139]
分析模块310可以被配置为利用静态分析生成包含函数间接调用关系的函数调用图和控制流图。
[0140]
生成模块320可以被配置为利用所述函数调用图和所述控制流图生成可达集合,其中,所述可达集合中的代码通过跳转到达待测的目标代码。
[0141]
计算模块330可以被配置为计算可达集合中的代码到所述目标代码的距离。
[0142]
测试模块340可以被配置为利用所述距离对所述程序进行模糊测试。
[0143]
可选的,在一些实施例中,所述函数调用图和所述控制流图包括函数的间接调用关系。
[0144]
可选地,在一些实施例中,所述利用所述距离对所述程序进行模糊测试包括:交替使用基于覆盖率的模糊测试和导向式模糊测试对所述程序进行模糊测试,其中,所述基于覆盖率的模糊测试利用模糊测试过程中产生的覆盖率信息更新种子集合,所述导向式模糊测试利用模糊测试过程中产生的距离信息更新所述种子集合。
[0145]
可选地,在一些实施例中,所述交替使用基于覆盖率的模糊测试和导向式模糊测试对所述程序进行模糊测试包括:当使用所述基于覆盖率的模糊测试对所述程序进行模糊测试时,在满足第一预设条件后,切换为使用导向式模糊测试对所述程序进行模糊测试;当使用所述导向式模糊测试对所述程序进行模糊测试时,在满足第二预设条件后,切换为使用基于覆盖率的模糊测试对所述程序进行模糊测试。
[0146]
可选地,在一些实施例中,所述第一预设条件包括在第一预设时间内没有产生新的覆盖率信息,所述第二预设条件包括在第二预设时间内没有产生新的覆盖率信息。
[0147]
可选地,在一些实施例中,所述计算可达集合中的代码到目标代码的距离包括:利用广度优先搜索方法计算所述可达集合中的代码到目标代码的距离。
[0148]
可选地,在一些实施例中,所述通过静态分析生成函数调用图和控制流图包括:使用快速类型分析生成所述函数调用图;基于所述函数调用图生成所述控制流图。
[0149]
可选地,在一些实施例中,所述通过静态分析生成函数调用图和控制流图包括:将所述程序编译为llvm的中间代码形式;静态分析所述中间代码形式,生成所述函数调用图和控制流图。
[0150]
可选地,在一些实施例中,所述程序为操作系统内核程序。
[0151]
可选地,在一些实施例中,所述可达集合中的代码为基本块代码。
[0152]
图4是本公开又一实施例提供的基于模糊测试的程序测试的装置的结构示意图。如图4所示,装置400可以包括程序分析模块410、静态距离计算模块420以及自适应模糊测试模块430。
[0153]
程序分析模块410可以包括数据预处理模块411、调用分析模块412以及控制分析模块413。数据预处理模块411可以将程序编译为llvm中间代码形式。调用分析模块412可以用于生成包含函数间接调用关系的函数调用图。控制分析模块413可以用于生成包含函数间接调用关系的控制流图。
[0154]
静态距离计算模块420可以包括可达性分析模块421和距离计算模块422。可达性分析模块421可以利用程序分析模块410生成的函数调用图和控制流图对程序进行分析,得到能够到达目标代码的可达集合。能够到达目标代码例如可以指可以通过代码间的跳转从该代码执行至目标代码。距离计算模块422可以用于计算可达集合中的代码到目标代码的距离。计算可达集合中的代码到目标代码的距离例如可以使用广度优先算法。
[0155]
自适应模糊测试模块430可以包括初始化模块431、近距离种子利用模块432和新路径探索模块433。初始化模块431可以对模糊测试进行初始化,生成预定数量的种子文件,形成种子集合。生成方式例如可以通过随机方式生成种子文件。近距离种子利用模块432可以利用距离信息更新种子集合中的种子文件。新路径探索模块433可以利用覆盖率信息更新种子集合中的种子文件。近距离种子利用模块432和新路径探索模块433可以交替执行。
[0156]
图5是本公开又一实施例提供的基于模糊测试的程序测试的装置的结构示意图。该装置500例如可以是可以用于测试的设备或者服务器。装置500可以包括存储器510和处理器520。存储器510可用于存储可执行代码。处理器520可用于执行所述存储器510中存储的可执行代码,以实现前文描述的各个方法中的步骤。在一些实施例中,该装置500还可以包括网络接口530,处理器520与外部设备的数据交换可以通过该网络接口530实现。
[0157]
在上述实施例中,可以全部或部分地通过软件、硬件、固件或者其他任意组合来实现。当使用软件实现时,可以全部或部分地以计算机程序产品的形式实现。所述计算机程序产品包括一个或多个计算机指令。在计算机上加载和执行所述计算机程序指令时,全部或部分地产生按照本公开实施例所述的流程或功能。所述计算机可以是通用计算机、专用计算机、计算机网络、或者其他可编程装置。所述计算机指令可以存储在计算机可读存储介质中,或者从一个计算机可读存储介质向另一个计算机可读存储介质传输,例如,所述计算机指令可以从一个网站站点、计算机、服务器或数据中心通过有线(例如同轴电缆、光纤、数字用户线(digital subscriber line,dsl))或无线(例如红外、无线、微波等)方式向另一个
网站站点、计算机、服务器或数据中心进行传输。所述计算机可读存储介质可以是计算机能够存取的任何可用介质或者是包含一个或多个可用介质集成的服务器、数据中心等数据存储设备。所述可用介质可以是磁性介质(例如,软盘、硬盘、磁带)、光介质(例如数字视频光盘(digital video disc,dvd))、或者半导体介质(例如固态硬盘(solid state disk,ssd))等。
[0158]
本领域普通技术人员可以意识到,结合本公开实施例描述的各示例的单元及算法步骤,能够以电子硬件、或者计算机软件和电子硬件的结合来实现。这些功能究竟以硬件还是软件方式来执行,取决于技术方案的特定应用和设计约束条件。专业技术人员可以对每个特定的应用来使用不同方法来实现所描述的功能,但是这种实现不应认为超出本公开的范围。
[0159]
在本公开所提供的几个实施例中,应该理解到,所揭露的系统、装置和方法,可以通过其它的方式实现。例如,以上所描述的装置实施例仅仅是示意性的,例如,所述单元的划分,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式,例如多个单元或组件可以结合或者可以集成到另一个系统,或一些特征可以忽略,或不执行。另一点,所显示或讨论的相互之间的耦合或直接耦合或通信连接可以是通过一些接口,装置或单元的间接耦合或通信连接,可以是电性,机械或其它的形式。
[0160]
所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部单元来实现本实施例方案的目的。
[0161]
另外,在本公开各个实施例中的各功能单元可以集成在一个处理单元中,也可以是各个单元单独物理存在,也可以两个或两个以上单元集成在一个单元中。
[0162]
以上所述,仅为本公开的具体实施方式,但本公开的保护范围并不局限于此,任何熟悉本技术领域的技术人员在本公开揭露的技术范围内,可轻易想到变化或替换,都应涵盖在本公开的保护范围之内。因此,本公开的保护范围应以所述权利要求的保护范围为准。
再多了解一些

本文用于企业家、创业者技术爱好者查询,结果仅供参考。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表

相关文献