掌桥专利:专业的专利平台
掌桥专利
首页

一种面向软件更新的软件测试方法和装置

文献发布时间:2023-06-19 12:19:35


一种面向软件更新的软件测试方法和装置

技术领域

本发明属于软件安全测试技术领域,具体涉及一种面向软件更新的软件测试方法和装置。

背景技术

软件的可扩展性既是福也是祸。一方面,软件补丁可以轻松添加新功能或修复软件错误。另一方面,任何软件更改都可能带来意外的错误和安全漏洞,这对用户而言是便是灾难,使用户不愿更新其软件。事实上,许多人宁愿使用包含严重错误且功能较少的早期版本软件,也不愿将其软件升级到最新版本。为了减少程序错误并改善用户体验,开发人员必须在发布程序之前对其程序进行全面测试。但是,软件测试既昂贵又耗时,因为软件维护成本的很大一部分与检测和修复错误有关。程序补丁作为软件更改的一种典型形式,理想情况下应对其进行全面测试,至少补丁中的每一行,以及原始代码中可能受补丁程序影响的每一行代码都应至少包含一个测试用例。但是这种水平的测试在目前的实践中还很遥远。

当前,涉及手动编写大量验证各种路径的测试程序占了软件开发周期的很大一部分。这些测试程序的目标是最大化覆盖特定的范围,例如覆盖路径或分支范围,但这是一个单调乏味的过程,需要大量的工作并需要对被测试系统有很好的理解。在过去的几年中,我们已经看到测试生成技术的重大进步。这些技术中的许多技术都是基于concolic执行(Cristian Cadar and Koushik Sen.2013.“Symbolic execution for softwaretesting:three decades later,”Commun.ACM 56,2(2013),82–90.)的,它是一种基于动态符号执行的程序分析技术,能够生成高覆盖率测试套件的输入,它已被证明是全面测试真实软件的不错选择,因为它能够系统地探索不同的程序路径并准确地进行内存推理。

concolic执行的大部分工作都集中在“整个程序”测试上,程序的所有部分都受到同等对待。但是程序中执行路径的数量通常与分支数量成指数关系,因此探索所有可能的执行路径是不可行的。也就是说,保守的执行面临着路径爆炸的挑战,在面对特定路径(如受补丁影响的路径)的测试输入生成时,该方法会显得有些力不从心,因此有效的搜索策略对于克服补丁测试过程中的路径爆炸挑战非常重要。尽管有一些研究在实现面向补丁的高覆盖率测试技术取得了新进展,但它们仍远没有达到快速自动生成包含实际程序中的代码更改的测试用例的目标。

发明内容

本发明开发了一种面向软件更新的软件测试方法和装置,用于实现基于concolic执行的软件自动测试,该方法称为FCEP(Fast Concolic Execution for Patches),以确保补丁的正确性和可靠性,该方法利用静态和动态分析的优势来生成测试输入,以覆盖补丁中被更改的行。FCEP不会探索候选列表中的所有分支,而是根据未测试的状态与目标之间的距离(例如补丁中的行)选择分支。FCEP将补丁的探索与补丁所在函数的探索结合起来,动态的调整搜索目标以对补丁所在的函数进行更全面的测试。

本发明采用的技术方案如下:

一种面向软件更新的软件测试方法,包括以下步骤:

建立新版本二进制程序的控制流图CFG和函数调用图CG,在CFG中对核心目标可能的执行路径进行标记,并在CG中标记相应的函数调用关系;

在新版本二进制程序的concolic执行过程中,当执行路径遇到分支时,为执行路径创建一个新状态,然后在CFG中为该新状态查找下一条指令的地址,将新状态映射到该下一条指令的地址,并将新状态放入候选列表中;

当一条路径执行结束后,采用基于目标的搜索策略从候选列表中选择一个落入目标函数的新状态以继续运行concolic执行。

进一步地,根据补丁所属的函数将补丁分组,在每一组中选择补丁的一行作为所述核心目标,该行尽可能代表函数修改的核心部分。

进一步地,如果在concolic执行过程中遇到间接跳转或函数指针调用,则对CFG和CG进行动态修正,以获得准确的路径信息。

进一步地,所述基于目标的搜索策略推断出补丁所覆盖的路径及补丁所在函数的相关路径,并将搜索引向这些路径以避免探索大量冗余路径。

进一步地,所述基于目标的搜索策略包括:

当一条路径执行结束后,确定候选列表中新状态的下一条指令地址是否命中目标函数,即补丁所在的函数;

如果命中,则为所有命中的新状态分配最高优先级,在最高优先级的新状态中选择最接近核心目标的一条路径以继续运行,该路径执行后,将继续在最高优先级的新状态中选择执行路径;

如果没有命中,或最高优先级的新状态全部执行完成,则结合CFG和CG查找目标函数的上层调用函数,并确认候选列表中是否存在新状态命中该上层调用函数;在命中该上层调用函数的新状态中选择最接近调用点的一个新状态继续执行。

进一步地,使用公式D

进一步地,在concolic执行过程中,如果遇到分支则将生成的两个分支的状态添加到执行树中,并将正分支置于左侧子树中,将负分支置于右侧子树中,即在创建新状态时将状态的正分支和负分支调整为与静态分析中生成的CFG一致。

一种采用上述方法的面向软件更新的软件测试装置,其包括:

地址映射模块,用于建立新版本二进制程序的控制流图CFG和函数调用图CG,在CFG中对核心目标可能的执行路径进行标记,并在CG中标记相应的函数调用关系;在新版本二进制程序的concolic执行过程中,当执行路径遇到分支时,为执行路径创建一个新状态,然后在CFG中为该新状态查找下一条指令的地址,将新状态映射到该下一条指令的地址,并将新状态放入候选列表中;

基于目标的搜索模块,用于当一条路径执行结束后,采用基于目标的搜索策略从候选列表中选择一个落入目标函数的新状态以继续运行concolic执行。

本发明的优点和有益效果如下:

Concolic执行通常用于软件测试,但面临搜索路径庞大带来的路径爆炸等方面的挑战,有效的搜索策略对于克服搜索空间挑战非常重要。软件更新很容易引入错误,因此对软件补丁进行全面测试是必不可少的。本发明提出了一种基于concolic执行的技术,以确保补丁的正确性和可靠性。该方法是通过使用基于目标的搜索策略来生成测试输入,以覆盖补丁的更改行和相关函数,实现了一个名为FCEP的原型系统。本发明将软件补丁作为测试的潜在目标,通过在concolic执行中结合静态分析的优势以提高搜索潜在目标的效率,同时可以在测试过程中排除不感兴趣的代码部分,更加专注于与潜在目标最相关的那些路径。FCEP可以在减少探索路径的数量以及到达补丁相关代码的时间成本方面带来重大改进。

附图说明

图1是FCEP总体框图。

图2是搜索策略示例图。

具体实施方式

为使本发明的上述目的、特征和优点能够更加明显易懂,下面通过具体实施例和附图,对本发明做进一步详细说明。

软件更新的目的是为用户带来新功能或修复已存在的错误,但软件更新通常会又会带来新的错误,从而严重影响用户的体验,使得用户常常犹豫是否要跟新软件。因此,在软件发布之前程序测试是必不可少的,至少代码中可能受补丁影响的每一行至少应包含一个测试用例,但是软件测试既费时又昂贵,越来越多的研究人员致力于开发能够自动生成高覆盖率测试套件并检测补丁程序引入的软件错误的新技术。本发明提出了一种基于concolic执行的技术,将静态分析和动态分析相结合来生成测试输入,以覆盖补丁中被更改的行,并对补丁所在的函数进行全面的测试,从而确保补丁的正确性和可靠性,并实现了一个名为FCEP的原型系统。

1.背景知识

Concolic执行是一种基于符号执行的自动测试生成技术,它是一种可以系统地探索程序路径的分析技术。“Concolic”一词是“concrete”(具体的)和“symbolic”(符号的)两个词的引申词。其背后的关键思想是使用符号值而不是具体值运行程序,如果遇到的分支直接或间接依赖于符号输入时,concolic执行都会确定分支两侧的可行性,并创建两个独立的符号状态进行分析,在这个过程中,concolic执行需要维护各条路径的符号值、具体值,以及路径约束。在选择了合适的具体值后,通过更新路径约束具体地和符号地执行程序,每当具体执行采取一个分支时,符号执行也指向同一个分支,从分支中提取的约束被添加到当前的路径约束中,为了探索不同的路径,可以否定一个或多个分支给出的路径条件,并调用求解器来为新的约束找到满意的赋值,即生成一个新的输入。

路径爆炸:由于程序中执行路径的数量通常与分支数量成指数关系,因此探索所有可能的执行路径是不可行的。符号执行能够过滤两种类型的路径:(1)不依赖于符号输入的路径;(2)对于当前路径约束不可满足的路径。尽管符号执行已经对路径做了过滤,但是路径爆炸问题依然是符号执行最主要的挑战之一。为了解决这个问题,策略执行依赖于搜索启发式,以在给定的有限时间预算内最大化代码覆盖率的方式引导策略执行。

搜索策略:由于枚举程序的所有路径可能非常昂贵,因此在许多与测试和调试相关的软件工程项目中,通过首先查看最有希望的路径来优先进行搜索,以下介绍几种尝试提高搜索空间覆盖率的代表性搜索策略。

深度优先搜索(DFS)和宽度优先搜索(BFS)是最常见的策略。在回溯到最深的未探索分支之前,DFS尽可能扩展路径,而BFS并行扩展所有路径。当内存使用非常宝贵时,通常会采用DFS。但是,此策略有几个局限性。首先,当程序包含条件取决于符号输入的循环或递归时,DFS可能会陷入循环或递归中。另外,由于它以深度的增加顺序选择分支,因此随着所涉及约束的数量也增加,随着深度的增加,生成输入向量变得更加困难。广度优先搜索(BFS)策略根据BFS顺序遍历执行树。BFS策略更喜欢出现在执行路径中较早的分支,因此生成新的输入向量更加容易,因为这些分支将涉及较少的约束。因此,尽管存在更高的内存压力和完成特定路径探索所需的长时间,但某些工具还是采用了BFS。从理论上讲,DFS和BFS策略都可以覆盖执行树中的所有执行路径。但是现实程序具有很大数量的执行路径,甚至这些策略都无法扩展到中等大小的程序。

2.整体流程

图1展示了FCEP的总体框图。它的输入是:1)新版本的二进制程序和补丁;2)从测试套件中选择的测试输入。它的输出是一组能够触发程序崩溃错误的输入或能够覆盖补丁及其所在函数的输入。

一方面,FCEP使用反汇编器生成新版本程序的CFG(控制流图)和CG(函数调用图)。它在CFG中为每个目标(即补丁中的一行)标记位置,并基于CG生成函数地址范围列表。另一方面,执行器在运行二进制程序过程中如果遇到分支会为执行路径创建一个新状态,然后利用地址查找器在生成的CFG中分别为两个状态(原状态和新生成的状态)搜索下一条指令的地址,并将新状态映射到其下一条指令地址,之后将新生成的状态放入候选列表中,以等待下一次路径选择器在其中选择新状态以完成concolic执行。

当使用初始输入的路径执行结束时,FCEP在候选列表中采用基于目标的搜索策略来选择新的状态,以继续运行concolic执行,它能够为触发崩溃的路径提供测试输入。该搜索策略会推断出补丁所覆盖的路径及补丁所在函数的相关路径,并将搜索引向这些路径以避免探索大量冗余路径。

一旦有触发补丁所在函数的状态出现后,基于目标的搜索策略将选择落入目标函数(即补丁所在的函数)的状态作为新状态,并尽可能执行这些状态以保证补丁的安全性。这主要是因为对于补丁的测试,本发明认为仅仅覆盖补丁代码行远远不能满足确保补丁安全性的测试要求。另外,在concolic执行中如果被测试的路径存在通过间接跳转或函数指针调用时,FCEP将对静态生成的CFG和CG进行修正,以涵盖静态分析无法正确分析的间接跳转或函数指针调用问题,从而能够增加FCEP测试的准确性。

3.实施细节

3.1地址映射

1)生成CFG和CG

我们分析的第一步是确定软件新版本与其旧版本之间的差异(即补丁)。从理论上讲,补丁中的每一行都是FCEP的潜在目标。而实际上,由于源代码包含许多不可执行的行(例如,声明,注释,空白行或未编译为可执行文件的行),因此许多行在实践中可以被忽略。FCEP根据补丁所属的函数将补丁分组,然后在后续步骤中分别处理每一组中的补丁。在每一组中选择补丁的一行作为核心目标,而该行尽可能代表该函数修改的核心部分。FCEP使用IDA Pro工具集静态分析软件的新版本,建立控制流图(CFG)和函数调用图(CG)。FCEP在CFG中对核心目标可能的执行路径进行标记,并在CG中标记相应的函数调用关系。请注意,考虑到间接跳转和指针可能会导致静态分析不准确,因此FCEP会在后续步骤中实时动态校正CFG和CG。

2)构建映射

Concolic执行器使用初始输入来测试软件的新版本。当路径遇到分支时,执行器将生成新的路径状态,并通知地址查找器在静态生成的CFG中为新状态查找到下一条指令的地址。FCEP将新状态映射到该指令地址,并将新状态放入候选列表中,以便可以在后续的路径选择中使用它。对于concolic执行而言,需要将被测试的程序翻译成中间语言才能解释和执行,如果在执行过程中遇到分支,它将生成的两个分支状态添加到执行树中。FCEP按照静态分析中的相同方法构造执行树,即将正分支置于左侧子树中,将负分支置于右侧子树中。由于在创建新状态时已将状态的正分支和负分支调整为与静态分析中生成的CFG一致,因此可以快速查询与每个分支相对应的下一条指令地址。

3)动态修正CFG和CG

我们需要注意的是,由于静态分析无法准确地推断出间接跳转或函数指针调用,因此在使用静态分析方法来指导concolic执行时会出现漏报的情况。因此FECP如果在concolic执行过程中遇到间接跳转或函数指针调用,则会通过地址查找器动态修正CFG和CG,以获得更加准确的路径信息。

3.2基于目标的搜索策略

执行器在条件分支所在的位置生成新状态,FCEP将新产生的新状态放入候选列表中供后续选择。当一条路径执行结束后,选择器会根据搜索策略从候选列表中选择一个新状态继续运行concolic执行。由于搜索策略通常会影响concolic执行的覆盖范围,因此仔细的选择搜索策略可以帮助实现所需的目标。

在测试开始之前,FCEP已从CG获得每个函数的地址范围,并选择一条在CFG中标记的路径,该路径可以从软件入口函数执行到选定的核心目标(即补丁中的一行)。当初始状态的路径执行完后,FCEP会确定候选列表中新状态的下一条指令地址是否命中目标函数(即补丁所在的函数),换句话说,该地址是否在目标函数的范围内。如果命中,FCEP将为所有命中的新状态分配最高优先级(即将优先级置位)。搜索策略将在最高优先级的新状态中选择最接近核心目标的一条路径以继续运行,该路径执行后,将继续在最高优先级的新状态中选择执行路径。如果没有新状态命中目标函数,或最高优先级的新状态全部执行完成,则FCEP将结合CFG和CG查找目标函数的上层调用函数,并确认候选列表中是否存在新状态命中该上层调用函数。类似地,FCEP在命中调用函数的新状态中选择最接近调用点的一个新状态继续执行。注意:除针对命中目标函数的新状态外,其它新状态均不含有优先权。由于已经确认先前生成的新状态是否命中目标函数或其调用者,因此FCEP优先考虑从当前运行状态派生的新状态,以确认它们是否命中目标函数。

众所周知,程序的代码地址不是完全连续的,但是在程序的相同函数中代码地址是连续的。因此,FCEP使用公式D

此后,它将继续为下一条核心目标代码执行上述所有步骤。运行命中目标函数的所有新状态(即运行全部最高优先级新状态)的目的是在补丁附近尽可能多地测试代码。因为对于补丁程序的安全性测试,仅关注补丁代码本身覆盖的路径通常无法满足要求,补丁附近的代码通常与补丁相关联,因此有必要对补丁所在的函数进行更加全面的测试。

3.3示例

图2是一个FCEP搜索策略的例子,该图是CFG和CG图的结合,假设FCEP从CG中获得各个函数的地址区间为FunA(0x00,0X2F),FunB(0x40,0x6F),FunA(0xA0,0xAF),在目标函数FunC中选定的核心目标位于节点n

当状态state_0执行结束后,选择器将从候选列表中选择一条新的状态,FCEP首先判断新生成的三个状态中的下一条指令地址是否命中目标函数FunC,如果有在目标函数区间的则在其中选择一条离核心目标(n

在状态state_1执行时,假设其执行路径为{n

本发明的关键点主要包括:

第一个关键点是提出了在concolic测试过程中对产生的新状态进行地址映射,并提出了构建地址映射方法。

第二个关键点是提出了利用concolic测试中的动态调用信息对静态分析生产的CFG和CG进行修正的方法。

第三个关键点是提出了基于目标的搜索策略方法对新产生的分支路径进行搜索。

上述方法的的地址映射部分,本发明采用CFG和CG作为静态分析基础,也可通过其他预处理方法将程序结构表示为其他有效形式。

上述方法的的基于目标的搜索策略中,本发明以程序代码的块地址作为计算基础,采用绝对差作为路径选择的依据。也可利用块地址采用其它有效的计算方法作为路径选择依据。

基于同一发明构思,本发明的另一实施例提供一种采用本发明方法的面向软件更新的软件测试装置,其包括:

地址映射模块,用于建立新版本二进制程序的控制流图CFG和函数调用图CG,在CFG中对核心目标可能的执行路径进行标记,并在CG中标记相应的函数调用关系;在新版本二进制程序的concolic执行过程中,当执行路径遇到分支时,为执行路径创建一个新状态,然后在CFG中为该新状态查找下一条指令的地址,将新状态映射到该下一条指令的地址,并将新状态放入候选列表中;

基于目标的搜索模块,用于当一条路径执行结束后,采用基于目标的搜索策略从候选列表中选择一个落入目标函数的新状态以继续运行concolic执行。

基于同一发明构思,本发明的另一实施例提供一种电子装置(计算机、服务器、智能手机等),其包括存储器和处理器,所述存储器存储计算机程序,所述计算机程序被配置为由所述处理器执行,所述计算机程序包括用于执行本发明方法中各步骤的指令。

基于同一发明构思,本发明的另一实施例提供一种计算机可读存储介质(如ROM/RAM、磁盘、光盘),所述计算机可读存储介质存储计算机程序,所述计算机程序被计算机执行时,实现本发明方法的各个步骤。

以上公开的本发明的具体实施例,其目的在于帮助理解本发明的内容并据以实施,本领域的普通技术人员可以理解,在不脱离本发明的精神和范围内,各种替换、变化和修改都是可能的。本发明不应局限于本说明书的实施例所公开的内容,本发明的保护范围以权利要求书界定的范围为准。

相关技术
  • 一种面向软件更新的软件测试方法和装置
  • 一种交通工具软件更新方法及交通工具软件更新装置
技术分类

06120113255929