本发明涉及软件安全领域,尤其涉及一种模糊测试方法和装置。
背景技术:
模糊测试是一种在上世纪九十年代引入的新型黑盒测试技术,用于查找各种软件中的故障。模糊测试在实际应用中取得了巨大的成功。模糊测试提供一些“模糊”(随机的或错误的)数据作为待测软件的输入,然后检查软件是否正常响应。相应地,如果软件出现了错误(例如崩溃或输出意外响应),就能够检测出相应的错误。模糊测试被认为能够提高提高软件的安全性、可靠性和有效性,这是因为模糊测试经常能够找出被忽略的缺陷。由于生成测试用例的成本相对较低,并且可以完全自动实现,因此,近年来,模糊测试变得越来越普遍。此外,通过模糊测试找到的错误经常是可以被攻击者使用的严重的、可利用的错误。
模糊测试取得了广泛的应用。例如,在电力、电信、运输、供水、石油、天然气、制造以及商业等领域都要用到不同的协议进行通信。随着为这些重要产业的基础设施提供通信,网络协议的安全性变得越来越重要。缓冲区溢出、格式字符串、代码注入、竞争条件等网络协议的弱点可能导致非预期的结果。例如,服务崩溃、DoS攻击、反常状态或响应等。攻击者可能获得权限,从而干扰或完全控制重要的控制系统。因此,无论对于学术研究或是工业开发,网络协议的安全性和健壮性都已经成为关键性的问题。模糊测试可用于检测通信协议的安全性,发现上述缺陷。
尽管模糊测试在上述的实际应用中能够发现很多安全弱点,但模糊测试完全是一种黑盒测试,其必须利用大量的测试用例以暴力方式来实现查找潜在弱点的目标。因此,测试过程是昂贵、费时的。并且,即使执行了很多测试用例,也不一定能够为软件的正确性提供可信的依据。
技术实现要素:
鉴于上述问题,提出了本发明以便提供一种克服上述问题或者至少部分地解决上述问题的测试方法和装置。
根据本发明的一个方面的实施例,提供了一种模糊测试方法,包括:利用第一测试用例集中的测试用例对测试对象进行模糊测试;确定部分测试用例对测试对象进行的模糊测试的测试覆盖率;以及如果所确定的测试覆盖率不再提高且小于目标测试覆盖率,则利用第二测试用例集中的测试用例对所述测试对象进行模糊测试。重复上述过程,直至达到目标测试覆盖率为止。
其中,所述确定包括:监测测试对象在部分测试用例下的运行行为信息,基于所监测的运行行为信息,获取测试对象中已被部分测试用例测试到的单元的数量,以及计算所获取的单元的数量与测试对象包含的单元的总数的比值,作为所述确定的覆盖率。
其中,单元包括测试对象的代码或路径。
其中,第二测试用例集是基于所述测试对象中未被所述部分测试用例测试到的单元确定的。
其中,方法还包括:如果确定的测试覆盖率继续提高,则继续利用第一测试用例集中的剩余测试用例对测试对象进行测试。
根据本发明另一个方面的实施例,提供了一种模糊测试装置,包括:测试模块,用于利用第一测试用例集中的部分测试用例对测试对象进行模糊测试,以及在覆盖率分析模块确定的测试覆盖率不再提高且小于目标测试覆盖率时,利用第二测试用集中的测试用例对测试对象进行模糊测试;覆盖率分析分析模块,用于确定第一测试用例集的部分测试用例对测试对象进行的模糊测试的测试覆盖率。
其中,覆盖率分析模块进一步用于:监测测试对象在部分测试用例下的运行行为信息,基于所监测的运行行为信息,获取测试对象中已被部分测试用例测试到的单元的数量,以及计算所获取的单元的数量与测试对象包括的单元的总数的比值作为所述确定的测试覆盖率。
其中,所述单元包括所述测试对象的代码或路径。
其中,测试模块还用于:基于测试对象中未被第一测试用例集中的部分 测试用例测试到的单元来确定第二测试用例集。
其中,测试模块还用于:当覆盖率分析模块确定测试覆盖率继续提高时,继续利用第一测试用例集中的剩余测试用例对测试对象进行测试。
根据本发明上述实施例的模糊测试方法或装置,确定测试对象在模糊测试的第一测试用例集中的部分测试用例下的测试覆盖率,来判断第一测试用例集是否能够覆盖更多的代码或覆盖其他路径,若判断为不能,则略过第一测试用例集中剩下的测试用例,选择第二测试用例集。通过该方案,可以略过冗余测试用例,节省测试成本和测试时间。
附图说明
通过阅读下文优选实施方式的详细描述,各种其他的优点和益处对于本领域普通技术人员将变得清楚明了。在附图中:
图1示出了根据本发明一个实施例的测试方法的流程图;
图2示出了本发明实施例中的测试方法的一种应用场景的示意图;
图3示出了根据本发明另一个实施例的测试方法的流程图;
图4示出了根据本发明一个实施例的测试装置的结构框图;
图5示出了根据本发明一个实施例的测试设备的结构框图。
具体实施方式
下面将参照附图更详细地描述本公开的示例性实施例。虽然附图中显示了本公开的示例性实施例,然而应当理解,可以以各种形式实现本公开而不应被这里阐述的实施例所限制。相反,提供这些实施例是为了能够更充分地理解本公开,并且能够将本公开的范围完整的传达给本领域的技术人员。
图1示出了根据本发明一个实施例的测试的方法。如图1所示,方法开始于步骤S110,其中,利用第一测试用例集中的部分测试用例对测试对象进行模糊测试。
本发明实施例中,测试对象可以是任何的软件,包括但不限于应用程序,例如在Windows、Android等系统上运行的应用软件;在电信、物联网设备中的各种通信协议;以及本地文件、操作系统提供的接口函数等,例如,API(应用程序编程接口)。
对模糊测试而言,源代码通常是不可知的,因此,本发明实施例中,对测试对象进行模糊测试一般是指对测试对象的二进制代码进行模糊测试工具。
具体地,对测试对象进行模糊测试可以利用现有的模糊测试工具,例如PEACH等工具,或测试者开发的其他工具,本发明实施例对此不做限定。
本发明实施例中的测试用例是指为测试目标而生成、编制的一组测试输入。对模糊测试而言,这通常是一些随机的输入或一些可能导致测试对象出现错误或非预期相应的输入数据,例如,使程序崩溃的输入数据。测试用例一般是分组生成的,一组测试用例即构成了本实施例中所说的测试用例集,例如,对同一待测试的代码段,采用同一类型的变异策略生成的一组测试用例。
在对测试对象进行模糊测试的同时或之后,执行步骤S120,其中,对测试对象进行动态二进制分析以监测测试对象在第一测试用例集的部分测试用例下的运行行为信息。
如前文中所述,模糊测试是一种黑盒测试技术,利用大量的测试用例以暴力方式来实现查找潜在弱点的目标,但其效率通常较低。
对此,现有技术中出现了一些指导模糊测试过程以提高测试效率的方法。例如,通过对待测对象的源代码进行动态分析,来指导测试用例的生成;或者通过静态二进制分析来指导测试用例的生成。然而,源代码经常是不可知的,静态分析方法也不能获得待测对象的运行特征,难以对动态行为进行准确建模。并且,静态二进制分析方法需要结合复杂的符号执行技术来计算可能的执行路径,因此占用更多的计算资源。
本发明实施例中,通过动态二进制分析来指导模糊测试过程。动态二进制分析能够确定测试用例的测试覆盖率。在本发明实施例的一种实施方式中,测试覆盖率通过动态二进制分析监测到的测试对象的运行行为信息确定。这些运行行为信息包括但不限于测试对象在第一测试用例集中的一部分测试用例的驱动下的执行过的路径、执行过的代码数量等。
本发明实施例中,通过测试对象的运行行为信息来确定所述部分测试用例对测试对象进行的模糊测试的测试覆盖率。
在本实施例的后续步骤中,将针对以下示例程序对本实施例方法进行描述:
上述代码是对测试对象的二进制代码进行反汇编而得到的对应的汇编程序。具体地,该反汇编过程可以在对测试对象进行模糊测试和动态二进制分析之前进行,用于统计汇编代码中的路径数量、代码数量等单元的总数,以供计算路径覆盖率或代码覆盖率时使用。可以看出,在上述代码中,代码的行数为7,代码包括由cmpl和jl指令构成的一个代码分支点,以及对应的两条分支路径,即分别对应于x>y的路径和对应于x<y的路径。
具体地,对执行中的上述代码的动态二进制分析将获得测试用例驱动执行的路径,例如,其可能是x>y的路径和/或x<y的路径。
之后,方法进入步骤S130,其中,基于所监测的运行行为信息,获取测试对象中已被第一测试用例集中的部分测试用例测试到的单元的数量。
本发明实施例中,通过动态二进制分析来监测运行行为信息。
具体地,在本发明实施例中,单元包括测试对象中的代码或路径。相应的,所述测试到的单元数量是测试对象在第一测试用例集的部分测试用例下的执行过的路径数量或代码的行数。对上述示例代码,若仅执行了对应于x>y的路径,则执行过的路径数量为1,执行过的代码行数为5。
之后,方法进入步骤S140,根据单元的数量确定测试覆盖率。
具体地,可以计算获取的单元的数量与测试对象包括的单元的总数的比值来确定测试覆盖率。作为示例,本发明实施例给出两种根据单元数量来确定测试覆盖率的可能方式,分别是通过执行过的路径数量来计算路径的测试 覆盖率,以及根据执行过的代码的行数来计算代码的测试覆盖率。
对于基于路径的测试覆盖率的方式,以上文中的代码为例,假设已经输入的第一测试用例集中的多个测试用例均对应于x>y的路径,这时,显然测试用例只覆盖了两条分支路径中的一条,因此可以计算得到第一测试用例集中的测试用例的路径覆盖率为1/2。
对于基于代码的测试覆盖率的方式,具体包括:基于运行行为信息获取测试对象在第一测试用例集中的测试用例驱动下的执行过的不重复的代码数量。根据不重复的代码数量计算第一测试用例集中的测试用例的代码覆盖率。例如,对上述代码示例,如果模糊测试触发的是L3路径,则执行过的代码行数为5,可以计算出代码覆盖率为5/7。
之后,方法进入步骤S150,判断所确定的测试覆盖率是否不再提高并且小于目标测试覆盖率,若所确定的测试覆盖率不再提高并且小于目标测试覆盖率,执行步骤S160,否则执行步骤S180。
本发明实施例中,目标测试覆盖率是指模糊测试过程最终要达到的覆盖率。对于上述简单的示例程序,当基于路径来计算覆盖率时,如果期望第一测试用例集能够将两条路径都覆盖,那么目标测试覆盖率可以设置为1。若步骤S140中计算的路径的测试覆盖率为1/2,则判断为未达到。当然,对于复杂结构的测试对象,可以根据实际需求设置目标路径覆盖率的值,本发明对此不做限定。
当然,对应于步骤S140中的测试覆盖率确定方式,还可以对代码的测试覆盖率进行判断。例如,期望的目标代码覆盖率为1,如果模糊测试触发的是L3路径,则输入的多个测试用例的代码测试覆盖率将保持在5/7并且未达到目标代码覆盖率。
在本发明实施例中,根据与第一测试用例集中的部分测试用例的测试结果来预测第一测试用例集是否能够达到更高的测试覆盖率,也就是说,预测第一测试用例集中的其他测试用例是否能够覆盖更多的路径或代码,或者是否能够覆盖测试对象的其他路径。
本发明实施例中的方法是基于模糊测试的测试用例的这样的特性,即一组测试用例集通常是对通信协议的同一报文,甚至同一报文的同一字段进行测试,并且通常基于相同的策略生成。因此,可以认为同一测试用例集中的测试用例是相似的,将覆盖相同的路径或代码。在上述现有的模糊测试方法 中,由于这种相似性,模糊测试的测试用例集中可能存在大量的冗余,导致较高的测试成本和测试时间。
利用上文描述的测试用例的相似性,在本实施例中,如果第一测试用例集中的已输入的多个测试用例不再提高并且未达到目标测试覆盖率,则不必将第一测试用例集执行完成,可以略过第一测试用例集中剩下的用例,而利用第二测试用例集进行测试。
在步骤S160中,基于测试对象中未被第一测试用例集中的测试用例测试到的单元来确定第二测试用例集。
在一种具体的实施方式中,通过调整路径上的分支条件来得到未被测试到的单元。例如,在上述示例中,对cmpl和jl指令构成的一个代码分支点,该分支点上的分支条件包括两种情况,即x>y和x<y。由于第一测试用例集中已输入的测试用例均对应于x>y的路径,则在该步骤S250中,未测试到的单元就是对应于x<y的路径。要覆盖更多的代码,应该使分支条件满足x<y。
具体地,基于测试对象中未被第一测试用例集中的测试用例测试到的单元来确定第二测试用例集包括:在多个测试用例集中选择对应于分支条件x<y的测试用例集作为第二测试用例集;或者,根据分支条件x<y生成新的测试用例集作为第二测试用例集。
本领域技术人员应该理解,对于包含更多层次的分支的测试对象,可以根据实际需求分别设置各个代码分支点的分支条件,从而覆盖每一条路径。
在步骤S160后,方法进入步骤S170,利用确定的的第二测试用例集中的测试用例对测试对象进行模糊测试。
在步骤S180中,继续利用第一测试用例集中的剩余测试用例对测试对象进行模糊测试。
方法重复上述过程,直到达到目标的测试覆盖率。
根据本发明上述实施例提供的方法,利用动态二进制分析方法来获取测试对象在第一测试用例集中的测试用例驱动下的运行行为信息,根据运行行为信息判断第一测试用例集是否能够覆盖更多的代码或触发其他路径,若判断为不能,则略过第一测试用例集中剩下的测试用例,并且还可以根据所述运行行为信息来确定分支条件,根据分支条件针对性地选择或生成测试用例集。通过该方案,可以略过冗余的测试用例,节省测试成本和测试时间,并 且利用较少的测试用例取得更高的路径覆盖率和代码覆盖率。
现在参照图2,图2示出了根据本发明实施例中的测试方法的一种应用场景的示意图。如图2所示,其中,包括模糊测试工具,对测试对象进行模糊测试。模糊测试工具包括但不限于PEACH等;动态二进制分析工具,对测试对象进行二进制分析,动态二进制分析工具可以是例如DynamoRIO、DECAF等工具;以及智能分析引擎。该智能分析引擎用于对动态二进制分析工具获得的测试对象在第一测试用例集中的部分测试用例驱动下的运行行为信息进行分析,根据运行行为信息判断第一测试用例集中的测试用例是否符合目标的测试覆盖率。
该智能分析引擎可以是软件程序,或以硬件方式实现。具体地,当智能分析引擎以软件实现时,可以与模糊测试工具、动态二进制测试工具集成在一个测试平台上,通过测试平台的统一调度,来实现本发明实施例方法的各个步骤。
在本发明实施例的一种具体实施方式中,动态二进制分析工具与待测软件安装在同一主机上,动态二进制分析工具可以直接链接到待测软件的进程,对待测软件进行动态二进制分析,监测待测软件的运行行为信息。但是这种方式只能在用户态下进行监测。
在本发明实施例另一种实施方式中,测试对象是安装在虚拟机中的待测软件。根据这种实施方式,能够在用户态或内核态对二进制代码进行监测,但需要更多的计算资源。
具体地,在图2所示的应用场景中,本发明实施例的方法包括:调用模糊测试工具,利用第一测试用例集中的部分测试用例对测试对象进行模糊测试;调用动态二进制分析工具对测试对象进行动态二进制分析以监测测试对象的运行行为信息,并将运行行为信息发送给智能分析引擎;智能分析引擎判断测试覆盖率是否达到目标测试覆盖率;智能分析引擎将判断结果以及测试覆盖率等信息发送给模糊测试工具;模糊测试工具根据运行行为信息选择或生成第二测试用例集;模糊测试工具利用第二测试用例集对测试对象进行模糊测试。
其他变形
本领域技术人员应该理解,虽然在上面的实施例中,根据测试用例未测 试到的路径来确定第二测试用例,然而,在本发明的一些其他实施例中,可以根据未测试到的代码来生成或选择第二测试用例。
本领域技术人员应该理解,虽然在上面的实施例中,当第一测试用例集中的部分测试用例未达到目标测试覆盖率时,根据未测试到的单元来确定第二测试用例集,但本发明并不局限于此。在本发明的其他一些实施例中,可以顺序选择的下一测试用例集,或者是随机选择其他的测试用例集。这同样能够一定程度地避免冗余,提高测试效率。
本领域技术人员应该理解,虽然在上面的实施例中,利用动态二进制分析方法来监测测试对象在第一测试用例集中的部分测试用例下的运行行为信息,然后基于所监测的运行行为信息来计算部分测试用例的测试覆盖率,但本发明并不局限于此。在本发明的其他一些实施例中,可以采用现有技术中的其他方法来确定测试用例的测试覆盖率。
本领域技术人员应该理解,虽然在上面的实施例中,以测试对象在测试用例下执行过的路径或代码作为所述单元来计算测试覆盖率,但本发明并不局限于此。在本发明的其他一些实施例中,可以根据路径和代码二者来共同确定计算测试覆盖率,或者利用其它的单元来计算测试覆盖率。例如,单元还可以是测试对象中的各模块的逻辑结构、调用关系等。
现在参照图3,其示出了根据本发明另一个实施例的测试方法的流程图。图3所示的方法可以由计算机等有计算能力的设备来执行。
如图3所示,在步骤S310中,利用第一测试用例集中的部分测试用例对测试对象进行模糊测试。
在步骤S320中,确定第一测试用例集中的部分测试用例对测试对象进行的模糊测试的测试覆盖率。
在步骤S330中,如果所确定的测试覆盖率不再提高且小于目标测试覆盖率,则利用第二测试用例集中的测试用例对测试对象进行模糊测试。
图4示出了根据本发明一个实施例的模糊测试装置,如图4所示,装置400包括:测试模块410,以及覆盖率分析模块420。其中,测试模块410用于利用第一测试用例集中的部分测试用例对测试对象进行模糊测试,以及在覆盖率分析模块420确定的测试覆盖率不再提高且小于目标测试覆盖率 时,利用第二测试用集中的测试用例对所述测试对象进行模糊测试。覆盖率分析模块420用于确定所述部分测试用例对所述测试对象进行的模糊测试的测试覆盖率。
在本发明实施例的一种具体实施方式中,测试模块410进一步用于:基于测试对象中未被部分测试用例集测试到的单元确定第二测试用例集。
在本发明实施例的一种具体实施方式中,测试模块410进一步用于:根据执行过的路径上的代码分支点确定第二测试用例集的分支条件;根据分支条件选择或生成第二测试用例集。
在本发明实施例的一种具体实施方式中,覆盖率分析模块420进一步用于:监测测试对象在第一测试用例集的部分测试用例下的运行行为信息,基于所监测的运行行为信息,获取测试对象中已被第一测试用例集的部分测试用例测试到的单元的数量;以及计算所获取的单元的数量与测试对象包括的单元的总数的比值作为所述确定的测试覆盖率。
在本发明实施例的一种具体实现方式中,测试对象为安装在虚拟机上的待测软件,则覆盖率分析模块420进一步用于:监测虚拟机的运行以获取待测软件在第一测试用例集的测试用例驱动下的运行行为信息。
在本发明实施例的一种具体实施方式中,所述单元包括测试对象的代码或执行过的路径。
在本发明实施例的一种具体实施方式中,测试模块410进一步用于:当所述覆盖率分析模块420确定测试覆盖率继续提高时,继续利用第一测试用例集中的剩余测试用例对测试对象进行测试。
本领域技术人员应当理解,上述模糊测试装置400可以利用软件、硬件或者软硬件结合的方式来实现。
根据本发明上述实施例提供的模糊测试装置,确定测试对象在模糊测试的第一测试用例集中的部分测试用例下的测试覆盖率,来判断第一测试用例集是否能够覆盖更多的代码或触发其他路径,若判断为不能,则略过第一测试用例集中剩下的测试用例,选择第二测试用例集。通过该方案,可以略过冗余测试用例,节省测试成本和测试时间。
图5示出了根据本发明一个实施例的模糊测试设备的结构框图,如图5所示,模糊测试设备包括:
用于存储可执行指令的存储器510以及与存储器510链接的处理器520, 其中,处理器520可以执行前述装置400的各个模块所执行的操作。
本发明的实施例还提供一种机器可读介质,其上存储可执行指令,当该可执行指令被执行时,使得机器实现处理器520的操作。
本领域技术人员应当理解,上面公开的各个实施例可以在不偏离发明实质的情况下做出各种变形和修改。因此,本发明的保护范围应当由所附的权利要求书来限定。