首页> 中国专利> 基于全局超级块支配图的动态符号执行方法及其装置

基于全局超级块支配图的动态符号执行方法及其装置

摘要

本发明提供了一种基于全局超级块支配图的动态符号执行方法及其装置,属于计算机软件测试和软件安全领域。方法如下:获取被测可执行程序的控制流图,按支配关系相关理论转化为超级块支配图。对图中每个节点标“权”,并在每次符号执行前更新,“权”表示执行该节点最少能覆盖的基本块个数。在一次动态符号执行结束后,从超级块支配图中选择“权”值最大的节点,并生成对应的预测路径约束条件,然后用求解器求解生成新测试用例,驱动下次执行。本方案与已有技术相比,能够以最少的测试用例尽可能覆盖更多的代码块,有效提高代码覆盖率增长速度,缓解路径爆炸问题。本发明对提高动态符号执行测试大型应用软件的性能有重大的意义。

著录项

  • 公开/公告号CN103116540A

    专利类型发明专利

  • 公开/公告日2013-05-22

    原文格式PDF

  • 申请/专利权人 电子科技大学;

    申请/专利号CN201310024675.5

  • 申请日2013-01-23

  • 分类号G06F11/36(20060101);

  • 代理机构成都华典专利事务所(普通合伙);

  • 代理人徐丰;杨保刚

  • 地址 610000 四川省成都市高新区(西区)西源大道2006号

  • 入库时间 2024-02-19 18:53:05

法律信息

  • 法律状态公告日

    法律状态信息

    法律状态

  • 2015-02-18

    授权

    授权

  • 2013-06-19

    实质审查的生效 IPC(主分类):G06F11/36 申请日:20130123

    实质审查的生效

  • 2013-05-22

    公开

    公开

说明书

技术领域    

本发明提出的基于全局超级块支配图的动态符号执行方案,属于计算机动态软件测试和软件安全领域,可用于动态程序分析、自动测试用例生成、软件漏洞挖掘等方面。

背景技术                                                    

 动态符号执行技术是最近几年提出的新技术,目前在软件行为分析、软件缺陷分析、漏洞测试、测试用例自动生成等领域都有应用。动态符号执行能够生成每条路径对应的测试输入,可动态检测每条路径及死角上存在的Bug,并且不依赖源代码,避免了静态测试方法人工开销大、效率低、误报率高以及Fuzzing测试的随机性等缺陷,能够更全面、精确地进行软件脆弱性检测,具有更广泛的应用前景,已成为软件测试技术新的研究及发展方向。

动态符号执行主要由二进制插装、混合执行(实际执行与符号执行)、漏洞检测、约束条件求解四个模块组成。一般执行过程如下:在首次执行时,由测试人员提供随机或者组织好的输入值,通过对二进制文件插桩,将输入数据符号化,在实际执行被测程序同时符号执行,插装程序跟踪输入符号在执行路径上的操作,实际执行调用漏洞检测工具检测程序漏洞;符号执行在条件分支处搜集输入变量相关的约束条件(即分支条件表达式)。执行完成后将依次收集到的约束条件组成路径约束条件,这些路径约束条件按照指定的路径搜索算法将某条取反,用求解器求解,可生成新的测试用例。新的测试用例驱动新一次执行沿不同路径自动执行。在执行过程中,如果漏洞检测工具检测出了漏洞,则会产生相应的报警,并保存触发该漏洞的输入测试用例,以便在具体分析时能够再次触发该漏洞。此后,程序继续执行,直到被测程序所有可执行路径都被测试完成。

目前,基于动态符号执行的软件安全检测方法在理论上已经基本成熟,但在实际应用还存在着许多尚未解决的问题阻碍其实用化,如路径爆炸问题、约束求解问题、外部函数跟踪问题、浮点指针计算问题、环境交互问题等。其中路径爆炸问题是动态符号执行面临的主要问题,已成为符号执行实际应用于大中型应用软件的瓶颈。符号执行在理论上能够遍历程序中的每一条可达路径并生成测试用例。实际上,程序的可执行路径数目随着程序中分支的数目成接近指数倍增长。并且在遇到循环的情况下,路径数目的增长更加迅速,这就是所谓的路径爆炸问题。路径爆炸问题是由被分析程序内部结构引起的,不能消除而只能采取一定的方法缓解。主流的符号执行工具只能探测所有路径的小部分,这与动态符号执行的设计目标相差甚远。使用最少的测试用例覆盖最多的代码,从而提高符号执行的覆盖率,是缓解路径爆炸的最优方法。

现有的处理路径爆炸的方法大多可归纳为路径裁剪法,如限制路径探测的深度、获取循环控制变量,控制循环次数等,这些方法将很多可执行路径盲目裁剪掉,导致这些路径上的代码块将永远不能被执行到,从而降低了动态符号执行的精度,不能有效检测死角上的不够。而设计良好的路径选择算法,用尽量少的测试用例覆盖尽量多的代码块,能有效缓解路径爆炸问题,提高符号执行的性能。但是常使用的深度优先和广度优先的路径探索算法都达不到该目的。目前看似最优的代生算法在实际执行过程中开销和误差都非常大。本发明提出了一种利用全局超级块支配图来控制路径选择的方法,能够有效提高动态符号执行的性能。该方法采用类似于贪心算法的思想,使每次选择的路径都是局部最优的,从而达到整体最优的近似解。

发明内容

本发明旨在目的在于提高符号执行的代码覆盖率,能够有效缓解路径爆炸问题对动态符号执行性能的影响。本方案利用超级块支配图来驱动动态符号执行的路径选择,使每次都能尽可能的覆盖到最多的代码块,需要解决的技术问题主要包含以下两个:

1、准确生成目标二进制程序对应的全局超级块支配图。全局超级块支配图是由软件对应的控制流图根据图论转化而来的,因此转化的每个步骤都必须以图论作为基础,以保证超级块支配图的准确性。

2、将全局超级块支配图作用于动态符号执行的路径选择。本发明的核心思想就是利用全局超级块支配图来控制动态符号执行的每一次路径选择,以保证每次符号执行都能尽可能覆盖到最多的代码块。

本发明为了实现上述目的采用以下技术方案:

一种基于全局超级块支配图的动态符号执行方法,其特征在于包括以下步骤:

1)、获得程序的控制流图和函数调用关系图;

 2)、利用Boost图形库提供的支配树算法获得被测程序的立即前、立即后支配树;

3)、合并立即前、并立即后支配树形成函数基本块支配图;

4)、合并函数基本块支配图中的强连通分量形成超级块支配图;

5)、利用函数调用关系图将所有函数的超级块支配图合并,形成全局超级块支配图,并为全局超级块支配图各节点设置初始权值及标记为“未执行”状态;

6)、为被测程序提供初始输入,并对被测程序插装,将被测试程序运行起来;

7)、检测程序执行路径上是否有潜在的漏洞,并自动搜集路径约束条件;

8)、利用执行过程中的基本块覆盖信息更新超级块支配图中各节点的权值和执行状态;

9)、根据超级块支配图的权值,从已执行路径上的所有分支中选择权值最大的分支节点;

10)、从路径约束条件中找出第(9)步选择出的分支节点对应的条件表达式,将该表达式取反,保留该表达式之前的约束条件,删除之后的,形成预测路径约束条件;

11)、利用求解器求解预测路径约束条件,生成新测试用例,如果无解,则回到第(9)步,重新选择分支;

12)、如果还有新的测试用例生成,则代替初始测试用例回到第(6)步续执行。否则表示所有的可执行路径分支都已被执行,则测试结束。

所述的程序的控制流图表示为四元组G = (NEentryexit);

N是控制流图的节点结合,每个节点代表程序中的一个基本块;

E是有向边的集合,每一条边代表了一个基本块之间的控制流转移;

entry是程序的入口点;

exit是程序的出口点。

所述合并基本块支配图中的强连通分量形成超级块支配图包括以下步骤:

31)、从entry基本块开始到exit结束,如果相邻基本块节点相互支配,则合并为超级块节点,并删除两条相互指向的边,其他边保持不变;

32)、如果新生成的超级块还有相互支配的相邻基本块,则根据(31)的方法继续合并;将支配图中的所有强连通分量的节点合并成一个节点;

33)、合并同向边,若相邻节点之间有两条以上同向边,则只保留一条。

所述步骤8具体包括以下步骤:

41)、根据基本块覆盖信息文件,将已被执行的超级块全部标记为“执行”;

42)、从根节点开始以递归方式依次为各节点设置新权值,设置方式如下:

如果当前超级块已被执行,则其权值=父节点的权值和;否则权值=父节点的权值和+本节点基本块的个数。

一种基于全局超级块支配图的动态符号执行装置,其特征在于包括:

控制流图生成模块:本模块的功能是产生目标程序每个函数对应的控制流图,以及程序内部函数调用关系图;

支配图生成模块:本模块的功能是根据程序每个函数的控制流图,根据节点的支配关系生成对应的立即前支配树和立即后支配树,然后将两者合并成函数基本块支配图;

超级块支配图生成模块:本模块的功能是将函数基本块支配图化简生成超级块支配图;

全局超级块支配图生成模块:本模块的功能是根据程序的函数调用关系图和每个函数对应的超级块支配图,产生程序对应的全局超级块支配图,并为每个超级块节点设置初始权值;

插装模块:本模块的功能是对可执行文件插入监视指令,并动态监控程序执行情况,通过该模块,程序当前执行的指令信息、寄存器信息、内存信息、函数调用信息都可以获得,用于符号执行搜集路径约束条件;

混合执行模块:本模块的功能是实际执行应用程序,调用漏洞检测工具检测执行路径上潜在的bug,并符号执行搜集路径约束条件;

路径选择模块:本模块的功能是在每次符号执行结束后,更新全局超级块支配图的节点的权值,并根据权值判断下次执行能够覆盖最多基本块的分支路径,生成预测路径约束条件;

求解器求解模块:本模块的功能是对预测路径约束条件求解,生成新的测试用例,用来驱动下一次混合执行。

一种基于全局超级块支配图的动态符号执行装置中所述的程序的控制流图表示为四元组G = (NEentryexit);

N是控制流图的节点结合,每个节点代表程序中的一个基本块;

E是有向边的集合,每一条边代表了一个基本块之间的控制流转移;

entry是程序的入口点;

exit是程序的出口点。

一种基于全局超级块支配图的动态符号执行装置中所述超级块支配图生成模块将函数基本块支配图化简生成超级块支配图包括以下步骤:

71)、从entry基本块开始到exit结束,如果相邻基本块节点相互支配,则合并为超级块节点,并删除两条相互指向的边,其他边保持不变;

72)、如果新生成的超级块还有相互支配的相邻基本块,则根据(71)的方法继续合并;将支配图中的所有强连通分量的节点合并成一个节点;

73)、合并同向边,若相邻节点之间有两条以上同向边,则只保留一条。

一种基于全局超级块支配图的动态符号执行装置中所述路径选择模块具体包括以下步骤:

81)、根据基本块覆盖信息文件,将已被执行的超级块全部标记为“执行”;

82)、从根节点开始以递归方式依次为各节点设置新权值,设置方式如下:如果当前超级块已被执行,则其权值=父节点的权值和;否则权值=父节点的权值和+本节点基本块的个数;         

83)、更新权值后,从已执行路径的所有未执行分支中选择权值最大的节点;

84)、从路径约束条件中选择与该节点对应的条件表达式,将该条件表达式取反,保留之前的约束条件,删除之后的,形成预测路径约束条件。

本发明具有以下有益效果:

本发明能用最少的测试用例尽可能的覆盖最多的代码块,缓解动态符号执行在测试大型应用程序时产生的路径爆炸问题,显著提高动态符号执行的效率。

 

附图说明

图1为基于全局超级块支配图的动态符号执行框架图;

图2为控制流图示例;

图3为立即前支配树;

图4为立即后支配树;

图5为基本块支配图;

图6为超级块支配图。

具体实施方式

本实施案例详细讲述了一种实现本发明的方式,但本发明的保护范围不仅仅局限于采用这种方式,凡是采用本发明思想的实施方式都在本发明的保护范围内。

控制流图生成模块:

本模块的功能是生成目标程序每个函数对应的控制流图及函数调用关系图。下面简要介绍与控制流图相关的图论知识。程序的控制流图可由四元组G = (NEentryexit),N是控制流图的节点结合,每个节点代表程序中的一个基本块;E是有向边的集合,每一条边代表了一个基本块之间的控制流转移;entry是程序的入口点;exit是程序的出口点。基本块是程序中的一段指令序列,在一个基本块中,程序只能从第一条指令逐条执行到最后一条语句,基本块的最后一条语句完成从当前基本块到下一个基本块的控制流转移,基本块可以简化程序结构,方便程序分析。图2是一个大约100行汇编指令的函数对应的控制流图,标号为0的节点是控制流图的entry基本块;13表示控制流图的exit基本块,图中包含大量的分支和循环。函数调用关系图与控制流图类似,只需把各个函数看作基本块既可。

控制流图是程序分析的基础,一个函数有唯一对应控制流图。整个程序的控制流图需要由函数的控制流图和函数调用关系图组合而成,结构复杂。本专利只对每个函数的控制流图分析处理,只在最后阶段生成整个程序对应的全局超级块支配图。有大量的算法和现成较成熟的工具可以绘制控制流图,在本实施方案中,利用编写商业软件IDA Pro的插件来生成目标程序对应的控制流图和函数调用关系图。

支配图生成模块

本模块的功能是生成被测试程序的支配图,本模块的输入是程序每个函数的控制流图,输出是函数对应的支配图。控制流图的支配图是通过合并立即前、后支配树而来的,下面简要介绍与支配图相关的图论知识。在控制流图G = (NEentryexit)中,一条从节点n1到节点nv的路径被定义为有向边的序列:(n1n2)… (ni-1ni)… (nv-1nv), "1≤i<v, ni ??V, (ni-1ni) ??E

立即前支配:一个节点w前支配一个节点v,当且仅当从entryv的所有路径都经过w,表示为                                                。节点m立即前支配节点n,当且仅当并且不存在节点o(o!=m),满足且,表示为。立即前支配树是一棵具有根节点的树,且树中的节点和控制流图的节点完全一致,树的根节点是控制流图的entry结点。如图2中,节点1是节点2的立即前支配,节点3是节点6的立即前支配。图3是图2的立即前支配树。

立即后支配:一个节点w后支配一个节点v,当且仅当从vexit的所有路径都经过w,表示为。节点m立即后支配节点n,当且仅当节点并且不存在节点(o!=m),满足且,表示为。立即后支配树是一颗具有根节点的树,树中的节点和控制流图的节点完全一致,根节点是控制流图的exit结点。立即后支配树可以通过将程序流图逆置(将边翻转),然后求逆图的立即前支配树获取。图4是图2的立即后支配树。

支配图:一个节点w支配一个节点v,当且仅当从entryexit的所有经过v的路径都经过ww!=v),。从数学定义上讲,节点w支配节点v,当且仅当且。支配图可通过合并立即前支配树和立即后支配树,合并同向边得到。由支配图的定义可知支配图是有向无环图,而不是树。图5是与图2对应的支配图。

立即前、后支配树算法现已是研究的比较成熟,在编译优化、网络拓扑、程序分析等方面都有应用,并且有大量现成的函数库支持立即前、后支配树的计算。在本实施方案中,采用Boost图形库BGL中的支配树算法来实现立即前、后支配树。并通过简单的边合并生成支配图。

超级块支配图生成模块

本模块的功能是将支配图通过化简形成超级块支配图。输入是函数的支配图,输出是函数的超级块支配图。通过观察支配图5可以发现,图中存在很多相邻节点双向联通的情况,即两个节点相互支配。如节点(3,2)等,也就是说从entryexit所有经过节点2的路径必然经过节点3,经过节点3的所有路径必然经过节点2。进一步的讲,节点2和节点3在同一条路径上,如果基本块2被执行则基本块3也必然会被执行,反之亦然。如此,可以将所有双向联通的基本块合并成一个超级块节点,则超级块中的所有基本块都必将会在同一条执行路径上被执行。合并步骤如下:

(1)从entry基本块开始到exit结束,如果相邻基本块节点相互支配,则合并为超级块节点,并删除两条相互指向的边,其他边保持不变。

(2)如果新生成的超级块节点还有相互支配的相邻基本块,则根据(1)的方法继续合并。也就是说将支配图中的所有强连通分量的节点合并成一个节点。如图5中2、3、6这3个节点分别双向可达,是一个强连通分量,将被合并成一个超级块节点(2,3,6)。

(3)删除复合边。复合边的定义如下:设uv是有向图中的两个节点,且uv有有向边<u,v>直接可达,若节点u还有不经过<u,v>边的其他路径可以到达节点v,则称边<u,v>为复合边。在强连通分量合并后需要删除图中的复合边,简化超级块支配图。

图5经过化简后得到的超级块支配图如图6所示,所用的强连通分量都被合并成一个超级块节点,图的形状变得非常精简。在超级块支配图中,一个超级块中的所有基本块都在同一条路径上,如果一个基本块被执行,则其他基本块也将会被执行。超级块支配图是一个有向无环图(示例图没有表现出这一特性),有一个根节点,根节点是由每次执行都会被执行到的所有基本块组成的。从图2也可看出,每条执行路径都必定会经过entry、1、7、exit等节点。同一层的节点表示不同路径上的基本块,父子关系表示子节点在父节点的某一条分支路径上。

全局超级块支配图生成模块

本模块的功能是根据程序的函数调用关系图,将每个函数对应的超级块支配图组合成程序对应的全局超级块支配图。当然,也可以根据程序全局控制流图生成全局超级块支配图,但是由于函数之间调用关系复杂,所以我们采取先生成每个函数的超级块支配图,再根据函数调用关系图,组成全局超级块支配图,这样可以简化实现过程。合并各个函数超级块支配图后,形成新的图形将与图5类似,只不过图中的节点可能是超级块节点,需要按照超级块支配图生成模块中介绍的合并方法,重新合并强连通分量,删除复合边,最终形成全局超级块支配图,形状与图6类似。

全局超级块支配图生成后需要为各个超级块节点设置初始权值,并标记为 “未执行”。初始权值表示从entry到该超级块(包括entry和当前超级块)的路径上,未执行的基本块的个数,进一步的讲,可以表示执行该节点所在的路径时最少可以覆盖的基本块的数量。如图6所示,根节点的初始权值为6,(2,3,6)节点的权值为9。全局超级块支配图只需生成一次,在整个测试阶段都可复用,每次符号执行后更新。本发明的关键也就在于生成全局超级块支配图,然后根据图的权值来执行路径选择,达到符号执行性能优化的效果。

插装模块

该模块的功能是在运行时对被测程序插入监视指令。通过对被测程序插桩,可以监测正在执行的指令信息、寄存器信息、内存信息、函数调用等信息,从而跟踪符号的流通、操作,并在分支指令处收集路径约束条件。二进制插装是进行程序动态分析常用的一项技术,现已有很多程序的二进制插装工具,如:ATOM、Dynins、Valgrind、PIN、Nirvana、HDTrans等。在本方案中采用Valgrind作为插桩工具,Valgrind还能在混合执行时进行漏洞检测。

混合执行模块

本模块的功能是加载被测试程序运行,调用漏洞检测工具检测执行路径上潜在的缺陷;同时伴随符号执行,搜集路径约束条件。混合测试仅在启动时需要用户提供输入,之后在执行过程中自动产生新测试用例,完成程序路径状态空间的检测。符号执行的具体过程在很多论文和专利中都有详细的讲述,在这里就不作具体介绍了。

路径选择模块

本模块的功能是在本次符号执行结束后,更新全局超级块支配图节点的权值,并根据权值选择下次的执行路径分支,生成预测路径约束条件。模块的功能如下:

(1)根据基本块覆盖信息文件,将已被执行的超级块全部标记为“执行”。

(2)从根节点开始以递归方式依次为各节点设置新权值。设置方式如下:如果当前超级块已被执行,则其权值=父节点的权值和(有向无环图,可能有多个父节点);否则权值=父节点的权值和+本节点基本块的个数。如图6,每个节点旁边有一组表示权值的数据,“\”之前是初始权值,“\”之后是执行路径之后更新了的权值。

(3)更新权值后,从已执行路径的所有未执行分支中选择权值最大的节点。从图2中可以知道路径的所有未执行分支有(1,2)、(8,9)、(11,12)。如果下次执行(1,2)分支则最少可以覆盖3个基本块,如果执行(8,9)分支,则最少可以覆盖1个基本块。因此选择(1,2)分支,作为下次被执行的路径。

(4)从路径约束条件中选择与该节点对应的条件表达式,将该条件表达式取反,保留之前的约束条件,删除之后的,形成预测路径约束条件。

该算法类似于贪心算法,虽然不能保证全局最优,但是能够保证局部最优。每次选择的分支能够保证下次执行覆盖的基本块本是已知最多的。贪心算法虽然不能保证整体最优,但对无法得到最优解,或则得到最优解开销很大时,贪心算法能够产生整体最优的近似解。

求解器求解模块

本模块的功能是对预测路径约束条件求解,生成新的测试用例,以驱动下一次混合执行。预测路径约束条件是一组可满足性问题,用SMT求解器求解。SMT求解器是一种数学工具,用来判定给出的条件表达式是否可满足。如果满足,则解出满足条件的一组数据,用该组数据作为输入能使程序沿预测的路径执行;如果不满足,需要重新调用路径选择模块得到新的预测路径约束条件。常见的SMT求解器有STP,CVC,OpenSMT,Yices,Z3等,在本模块中选择STP作为SMT的求解器。

下面详细的给出了本发明的实现步骤:

1)利用Ida Pro获得被测试程序每个函数的控制流图和函数调用关系图;

2)利用Boost图形库提供的支配树算法获得每个函数的立即前、后支配树;

3)合并立即前、后支配树形成函数基本块支配图;

4)合并函数基本块支配图中的强连通分量形成超级块支配图;

5)利用函数调用关系图将所有函数的超级块配图合并,形成全局超级块支配图。并为全局超级块支配图中各节点设置初始权值并标记为“未执行”状态;

6)为被测程序提供初始输入,利用Valgrind对被测程序插装,将被测试程序运行起来;

7) 检测程序执行路径上是否有潜在的漏洞。并自动搜集路径约束条件;

8)利用执行过程中的基本块覆盖信息更新超级块支配图中每个节点的权值和执行状态;

9)根据超级块支配图节点的权值,从已执行路径上的所有分支中选择权值最大的分支节点;

10)从路径约束条件中找出第(9)步选择出的分支节点对应的条件表达式。将该表达式取反,保留该表达式之前的约束条件,删除之后的,形成预测路径约束条件;

11)利用求解器求解预测路径约束条件,生成新测试用例。如果无解,则回到第(9)步,重新选择分支;

12)如果还有新的测试用例生成,则代替初始测试用例回到第(6)步续执行。否则表示所有的可执行路径分支都已被执行,则测试结束。 

去获取专利,查看全文>

相似文献

  • 专利
  • 中文文献
  • 外文文献
获取专利

客服邮箱:kefu@zhangqiaokeyan.com

京公网安备:11010802029741号 ICP备案号:京ICP备15016152号-6 六维联合信息科技 (北京) 有限公司©版权所有
  • 客服微信

  • 服务号