一种符号执行方法、装置及系统的制作方法

文档序号:6384163阅读:300来源:国知局
专利名称:一种符号执行方法、装置及系统的制作方法
技术领域
本发明涉及计算机软件安全领域,尤其涉及一种符号执行方法、装置及系统。
背景技术
符号执行是通过使用符号变量取代输入中的具体值来模拟程序执行的程序分析方法(即用静态分析的形式完成动态分析的工作)。该方法既具有动态分析方法的可靠性(路径敏感,无误报),又具有静态分析方法的完备性(可保证覆盖率,理论上有可能做到无漏报),在软件漏洞检测中正得到越来越多的关注。
符号执行也是一种形式化和自动化的软件分析技术,其核心思想是用符号表示程序的输入数据,并将程序的运算过程逐指令或逐语句地转换为数学表达式,再在程序控制流图的基础上生成符号执行树,并为每一条路径建立一系列的以输入数据为变量的表达式。通常,可以使用一个三元组〈指令指针,路径函数,路径条件〉来表示符号执行过程。其中,指令指针用于标识当前被分析的指令,路径函数表示程序路径中不同点处变量的值是变量初始值的函数,路径条件是程序路径在各分支点满足的分支条件的合取。路径条件是约束在符号执行中的一种具体表现形式。约束通常是一组等式或不等式的合取,而约束求解的目的是得到等式或不等式组的可满足解。根据获取约束(路径条件和分支条件)的不同方法,可将当前的符号执行方法划分为基于变异和基于生成两类。其中,基于生成的符号执行依次解释程序中的每一条指令。具体地说,对于非分支指令,其通常需要更新路径函数(通过函数的复合实现);而对于分支指令,其可能需要创建新的符号进程(执行一条新的路径)以探测每个分支目标,并将原路径条件与每个分支目标满足的分支条件取合取作为每个新路径的路径条件。当有多个符号进程时,按照一定的路径选择策略(例如先创建的符号进程先分析)依次选择每一个符号进程进行分析。当某个符号进程结束时,调用约束求解器求解路径条件以获取一个具体输入向量,该向量可驱使程序执行该路径。当所有符号进程结束时,整个符号执行过程结束。以示例I所示的程序片段为例,下面对现有技术中基于生成的符号执行处理进行说明
01if(a < 100)%判断a是否小于100;
02printf("a<100");%在&小于 100时,打印;
03else if(b < 100)%在3不小于100时,判断b是否小于100;
04priritf("a>-100&&b<100"); %在&不小于丨00且b<IOO时,打印;
05else
06printf(0 && "a>=i00&&b>=100"); %否則,a不小干 100且b不小于 100: -j 叩
07end:示例 I第一步在行01,查询(a〈100)在当前路径条件(true)下的恒真与恒假性恒真则前进到行02,恒假则前进到行03,此处即非恒真又非恒假,因此创建一个新的符号进程(#1)以同时分析每条路径,原符号进程(#0)前进到行02,并更新路径条件为(a〈100),新符号进程(#1)前进到行03,并更新路径条件为i(a〈100),所述原符号进程以及新符号进程是逻辑上的虚拟进程,并不是实际的一个进程。第二步按照先创建的符号进程先分析策略,分析#0符号进程,即解释行02,然后转向行07,求解路径条件(a〈100)得测试用例(0,0);第三步按照先创建的符号进程先分析策略,分析#1符号进程,即解释行03 ;第四步在行03,查询(KlOO)在当前路径条件(](a〈100))下的恒真与恒假性恒真则前进到行04,恒假则前进到 行05,此处即非恒真又非恒假,因此创建一个新的符号进程以同时分析每条路径,原符号进程(#1)前进到行04,并更新路径条件为i(a〈100)八(b〈 100),新符号进程(#2)前进到行05,并更新路径条件为I(a〈 100) A^(b<100);第五步按照先创建的符号进程先分析策略,分析#1符号进程,即解释行04,然后转向行07,求解路径条件q(a〈100) A(KlOO)得测试用例(100,0);第六步按照先创建的符号进程先分析策略,分析#2符号进程,即解释行05,然后转向行06-07,求解路径条件q(a〈100) Ai(KlOO)得测试用例(100,100)。目前,基于符号执行的程序分析方法在理论上已经基本成熟,而阻止其实用化的最主要问题是路径爆炸。理论上,符号执行技术能够遍历程序中的每一条执行路径并生成测试用例。实际上,程序中的路径数目随着程序中分支的数目近似指数增长,在出现循环的情况下,路径数目的增长更加迅速。由于需要探测的路径是如此之多,这就会产生的路径爆炸问题。在基于生成的符号执行中,与路径爆炸息息相关的另一个问题是资源耗尽,这是因为上述基于生成的符号执行过程的所有符号进程(逻辑上的进程,也可称为虚拟进程)均在单个符号执行器进程中进行,各符号进程执行过程通常需要在内存中存储与对应路经相关的数据信息,随着需要分析的路径数量增多,需要的内存空间也越来越大,最终不可避免出现资源耗尽。

发明内容
本发明实施例提供了一种符号执行方法、装置及系统,用以解决现有的符号执行技术存在的路径爆炸问题,以及使用单个符号执行器进程而引起的资源耗尽问题。本发明实施例提供的具体技术方案如下一种符号执行方法,应用于包含负载均衡器和至少两个控制器的系统中,所述方法包括负载均衡器向选择的一控制器发送第一指示指令;接收到第一指示指令的控制器,按照设定的执行策略确定待测试程序中的第一条路径,且在确定第一条路径过程中在每一条最终引起路径分叉的分支指令处生成相应的路径种子;将生成的路径种子发送至负载均衡器,并收集该第一条路径上的路径条件,获得满足所述第一条路径上的路径条件的测试用例,向负载均衡器发送进入空闲状态的通知,其中,所述路径种子是由设定个数的元素组成的顺序字节流,所述元素是表示程序路径中依次遇到的每个分支指令的取向;负载均衡器接收路径种子后,向至少一个空闲的控制器分别发送含有路径种子的第二指示指令,且每个空闲的控制器对应的第二指示指令中的路径种子不同;
收到第二指示指令的控制器,确定所述第二指示指令中的路径种子所表示的第一段路径,在该第一段路径的基础上按照设定的执行策略确定能与第一段路径结合构成第N条路径的第二段路径,并在确定第二段路径过程中在每一条最终引起路径分叉的分支指令处生成相应的路径种子,将生成的路径种子发送至负载均衡器,收集该第N条路径上的路径条件,获得满足所述第N条路径上的路径条件的测试用例,向负载均衡器发送进入空闲状态的通知,所述N为大于I的正整数。一种符号执行系统,所述符号执行系统包括负载均衡器和至少两个控制器;所述负载均衡器,用于向选择的一控制器发送第一指示指令,接收来自控制器的路径种子和进入空闲状态通知,向至少一个空闲的控制器分别发送含有路径种子的第二指示指令,且每个空闲的控制器对应的第二指示指令中的路径种子不同;所述控制器,用于在接收到第一指示指令时,按照设定的执行策略确定待测试程序中的第一条路径,且在确定第一条路径过程中在每一条最终引起路径分叉的分支指令处生成相应的路径种子,收集该第一条路径上的路径条件,获得满足所述第一条路径上的路径条件的测试用例,其中,所述路径种子是由设定个数的元素组成的顺序字节流,所述元素是表示程序路径中依次遇到的每个分支指令的取向;在接收到第二指示指令时,确定所述第二指示指令中的路径种子所表示的第一段路径,在该第一段路径的基础上按照设定的执行策略确定能与第一段路径结合构成第N条路径的第二段路径,并在确定第二段路径过程中在每一条最终引起路径分叉的分支指令处生成相应的路径种子,收集该第N条路径上的路径条件,获得满足所述第N条路径上的路径条件的测试用例,所述N为大于I的正整数。一种符号执行装置,所述符号执行装置包括第一发送模块、接收模块和第二发送模块;第一发送模块,用于向选择的一控制器发送第一指示指令,该第一指示指令用于指示控制器按照设定的执行策略确定待测试程序中的第一条路径,且在确定第一条路径过程中在每一条最终引起路径分叉的分支指令处生成相应的路径种子,并收集该第一条路径上的路径条件,获得满足所述第一条路径上的路径条件的测试用例,其中,所述路径种子是由设定个数的元素组成的顺序字节流,所述元素是表示程序路径中依次遇到的每个分支指令的取向;接收模块,用于接收来自控制器的路径种子和进入空闲状态通知;第二发送模块,用于向至少一个空闲的控制器分别发送含有路径种子的第二指示指令,且,每个空闲的控制器对应的第二指示指令中的路径种子不同,该第二指示指令用于指示控制器确定所述第二指示指令中的路径种子所表示的第一段路径,在该第一段路径的基础上按照设定的执行策略确定能与第一段路径结合构成第N条路径的第二段路径,并在确定第二段路径过程中在每一条最终引起路径分叉的分支指令处生成相应的路径种子,收集该第N条路径上的路径条件,获得满足所述第N条路径上的路径条件的测试用例,所述N为大于I的正整数。一种符号执行装置,所述符号执行装置包括接收模块、第一执行模块、第二执行模块和发送模块;接收模块,用于接收负载均衡器发送的第一指示指令和含有路径种子的第二指示指令;
第一执行模块,用于在接收模块接收到第一指示指令时,按照设定的执行策略确定待测试程序中的第一条路径,且在确定第一条路径过程中在每一条最终引起路径分叉的分支指令处生成相应的路径种子,并收集该第一条路径上的路径条件,获得满足所述第一条路径上的路径条件的测试用例,其中,所述路径种子是由设定个数的元素组成的顺序字节流,所述元素是表示程序路径中依次遇到的每个分支指令的取向;第二执行模块,用于在接收模块接收到第一指示指令时,确定所述第二指示指令中的路径种子所表示的第一段路径,在该第一段路径的基础上按照设定的执行策略确定能与第一段路径结合构成第N条路径的第二段路径,并在确定第二段路径过程中在每一条最终引起路径分叉的分支指令处生成相应的路径种子,收集该第N条路径上的路径条件,获得满足所述第N条路径上的路径条件的测试用例,所述N为大于I的正整数;发送模块,用于将第一执行模块和第二执行模块生成的路径种子发送给负载均衡器,并在第一执行模块或第二执行模块获得测试用例后向负载均衡器发送进入空闲状态通知。在本发明实施例的方案中,利用控制器执行待测试程序中的某条路径的同时将待测试程序中与该路径相关的路径进行分解,生成路径种子,并将生成的路径种子发送至负载均衡器,由负载均衡器将路径种子分发给多个空闲的控制器,该多个空闲的控制器根据分发的路径种子执行程序中的路径并同时生成路径种子,将生成的路径种子发送至负载均衡器,直至路径种子被执行完毕。一方面由于采用了分布式并行方式对待测试程序进行符号执行分析,使得每一控制器执行的路径的数量均在自己可负荷的范围内,有效解决了基于生成的符号执行中遇到的路径爆炸问题;另一方面,负载均衡器仅需保存路径种子,占用的内存资源较少,且每个分布式控制器在执行完本次的符号执行任务后就释放了占用的内存资源,因此也有效地解决了资源耗尽问题。


图1为本发明实施例一的符号执行方法流程示意图;图2为本发明实施例一中的符号执行树;图3为本发明实施例二中的待测试程序的符号执行树示意图;图4为本发明实施例三中的符号执行系统结构示意图;图5为本发明实施例四中的符号执行方法流程示意图;图6为本发明实施例五中的符号执行方法流程示意图;图7为本发明实施例六中的符号执行装置结构示意图;图8为本发明实施例七中的符号执行装置结构示意图。
具体实施例方式下面结合说明书附图,对本发明实施例提供的符号执行方法、装置及系统的具体实施方式
进行说明。实施例一如图1所示,为本发明实施例一的符号执行方法流程图,所述方法应用于包含负载均衡器和至少两个控制器的系统中,包括以下步骤
步骤101 :负载均衡器向选择的一控制器发送第一指示指令。具体的,在起始阶段,其中的一个已启动控制器接收到负载均衡器的第一指示指令。需要说明的是,每个控制器启动时主动建立与负载均衡器的通信信道,负载均衡器标记其状态为空闲,且本步骤101中不需要所有的控制器一开始全部启动。步骤102 :接收到第一指示指令的控制器按照设定的执行策略确定待测试程序中的第一条路径。具体的,接收到第一指示指令的控制器可以在接收到第一指示指令时,创建与自身一一对应的符号执行器进程,利用符号执行器进程按照设定的执行策略确定待测试程序中的第一条路径,并对该符号执行器进程的运行状态进行监控,在该符号执行器进程执行完自身的任务且结束后,控制器向负载均衡器汇报工作完成情况,并被负载均衡器标记为 空闲状态。这里控制器和符号执行器进程的实现模式可以为父子进程模式,即控制器为父进程,符号执行器进程为子进程。步骤103 :控制器在确定第一条路径的过程中在每一条最终引起路径分叉的分支指令处生成相应的路径种子。具体的,控制器创建了符号执行器进程,由符号执行器在确定第一条路径的过程中在每一条最终引起路径分叉的分支指令处生成相应的路径种子。在符号执行过程中,有两种类型的指令可能引起符号执行器创建新的路径,即二路分支和多路分支指令。二路分支指令最多仅能够创建一条新路径,而多路分支指令通常可能引起符号执行器创建多于一条新路径。较优地,为了简化本发明实施例一的符号执行方法的实现,并使得对符号执行过程的分析和追踪更加清晰,提高符号执行执行的速度,在步骤102中对存在多路分支指令的待测试程序进行符号执行分析时,按照设定的执行策略确定待测试程序中的第一条路径之前,所述方法还包括符号执行器进程将该多路分支指令转换为多条二路分支指令。根据程序变换和分析领域技术可知,所有多路分支指令均可等价转换为多条二路分支指令。下述示例2和示例3演示了多路分支指令和多条二路分支令的等价转换。
switch (a) {%对a的取值判断;
case cl:%在8等于cI时,执行block I;
{block I}
case c2:%在8等于c2时,执行block2;{block 2}
case c3:%在&等于 c3 时,执行block 3;
{block 3}default:
{block final}} %在a均不等于c1、c2、c3 时,执行block final;示例 2
if (a == cl) %判断a是否等于c I
{block I} %在8等于cl时,执行block Ielse if (a == c2) %在8不等于cl时,判断a是否等于c2{block2} %在3等于c2时,执行block2else if (a == c3) %在8不等于c2时,判断a是否等于c3{block 3} %在&等于c3时,执行block 3else
jblock final \ %3不等于c3 时,执行block final示例3 其中示例2为多路分支指令,示例3为将示例2的多路分支指令等价转换的一列链接的二路分支指令,也即转化为了多条二路分支指令。一般的,分支指令有可能引起路径分叉,也有可能不引起路径分叉,本步骤103中,由于在不引起路径分叉的分支指令处无需生成路径种子,故仅在每一条最终引起路径分叉的分支指令处生成相应的路径种子。所述路径种子是由设定个数的元素组成的顺序字节流;所述元素是表示程序路径中依次遇到的每个分支指令的取向。若符号执行器进程将多分路指令转换为了二分路指令,则在本步骤103中,可以通过以下方法在该第一条路径的每一条最终引起路径分叉的分支指令处生成相应的路径种子第一步确定该第一路径中起始分支指令到该分支指令前的子路径对应的路径种子;第二步在该确定的子路径对应的路径种子后添加一个表示与第一条路径在该分支指令处的取向相反的元素得到一个新的路径种子,将该新的路径种子作为生成的一个路径种子。步骤104 :控制器将生成的路径种子发送至负载均衡器,并收集该第一条路径上的路径条件,获得满足所述第一条路径上的路径条件的测试用例。具体的,控制器创建符号执行器进程时,可由符号执行器进程将生成的路径种子发送至负载均衡器进程,并且该符号执行器进程也可以创建约束求解器进程时,由符号执行器进程收集该第一条路径上的路径条件,该符号执行器进程调用约束求解器进程对收集的该第一条路径上的路径条件进行求解,获得满足所述第一条路径上的路径条件的测试用例。步骤105 :控制器向负载均衡器发送进入空闲状态的通知。本步骤105中,控制器可以监测其创建的符号执行器进程的运行状态,在监测到符号执行器进程完成本次的符号执行任务(也即获得测试用例)且结束后,向负载均衡器发送其进入空闲状态的通知(负载均衡器收到通知后标记该控制器状态为空闲)。步骤106 :负载均衡器的路径种子列表不空时,向至少一个空闲的控制器发送含有一个路径种子的第二指示指令,并将该控制器的状态改为忙碌。本步骤106中,每个空闲的控制器对应的第二指示指令中的路径种子不同。负载均衡器分发路径种子的次序可以根据设定的策略来进行,例如采用先进先出的策略,即先接收的路径种子先被分发。具体实现时,所述负载均衡器可以采用多线程的模式来实现,所述负载均衡器可以包括一个主线程、一个消费者线程、一个生产者线程和一个任务列表,所述主线程作为消费者线程和生产者线程的守护线程,对消费者线程和生产者线程进行管理,生产者线程接收来自控制器的路径种子,并将接收到的路径种子存放至任务列表,消费者线程从任务列表中取出路径种子,并向至少一个空闲的控制器分别发送含有该路径种子的第二指示指令。步骤107 :接收到第二指示指令的控制器确定所述第二指示指令中的路径种子所表不的第一段路径。本步骤107中,可由控制器创建的符号执行器来确定所述第二指示指令中的路径种子所表示的第一段路径。由于构成每一路径种子中的各元素表示了程序路径中依次遇到的每个分支指令的取向,因此,每一路径种子均惟一表示一段路径。步骤108 :控制器在该第一段路径的基础上按照设定的执行策略确定能与第一段路径结合构成第N条路径的第二段路径。具体的,控制器可利用其创建的符号执行器进程确定能与第一段路径结合构成第N条路径的第二段路径,具体过程为符号执行器进程调用约束求解器进程确定在执行完第一段路径之后遇到的分支指令的取向,并结合设定的执行策略,逐步来确定第二段路径。步骤109 :控制器在确定第二段路径的过程中在每一条最终引起路径分叉的分支指令处生成相应的路径种子,将生成的路径种子发送至负载均衡器。步骤110 :控制器收集该第N条路径上的路径条件,获得满足所述第N条路径上的路径条件的测试用例,向负载均衡器发送进入空闲状态的通知。具体地,在将待测试程序中的多路分支指令均转换为多条二路分支指令后,可以通过以下方法在确定第二段路径过程中在每一条最终引起路径分叉的分支指令处生成相应的路径种子第一步确定所述第N条路径中起始分支指令到该第二段路径中的每一条最终引起路径分叉的分支指令前的路径对应的路径种子;第二步在确定的该路径种子后添加一个表示与第N条路径在该最终引起路径分叉的分支指令的取向相反的元素,得到一个新的路径种子,将该新的路径种子作为生成的路径种子。下面通过图2所示的符号执行树对本步骤110进行说明。在图2中,A-M表示具有指令的节点,其中A、B、C、D、E、J、M代表具有分支指令的节点,从父节点到左边的子节点上的路径上标1,表明该父节点包含的分支指令为真,执行左边的子节点;从父节点到右边的子节点上的路径上标0,表明该父节点包含的分支指令为假,执行右边的子节点。假设符号执行器进程在步骤107中获得的路径种子为1-0,则执行路径A-B-E,同时对第二段路径E-J-L中遇到的包含可能引起路径分叉的分支指令的节点E和J生成路径种子1-O-O和1-O-1-O,此时该路径种子所表不的路径即为A-B-E-K和A-B-E-J-M。上述路径种子的生成过程与路径的确定过程是同步进行的,也即在根据设定的策略一边确定路径,一边生成路径种子。仍以上述假设,假设符号执行器进程在步骤107中获得的路径种子为1-0为例,保证符号执行器进程执行路径A-B-E。随后,符号执行器进程调用约束求解器进程确定分支指令E最终会引起路径分叉,利用设定的执行策略,确定下一步执行的路径为E-J,并在最终引起路径分叉的分支指令E处生成路径种子1-0-0。再随后,符号执行器进程调用约束求解器进程确定分支指令J最终会引起路径分叉,利用设定的执行策略,确定下一步执行的路径为E-J-L,并在最终引起路径分叉的分支指令J处生成路径种子1-0-1-0。由于本步骤110中,控制器创建的符号执行器在执行完本次符号执行任务后会自动消亡,因此该符号执行器进程占用的资源会全部释放。由于每一符号执行器进程在执行完自身的符号执行任务时均消亡(也即退出),而在符号执行器进程退出时,占用的资源会全部释放,因此,使用多个符号执行器进程有效解决了单个符号执行器进程完成整个任务时资源耗尽的问题。步骤111 :负载均衡器判断路径种子列表是否为空,若是,则执行步骤112 ;若否,则执行步骤113 ;步骤112 :负载均衡器判断是否还有控制器忙碌,若是,则执行步骤114 ;若否,则结束。步骤113 :负载均衡器判断是否还有控制器空闲,若是,则执行步骤114 ;若否,则执行步骤115 ;步骤114 :负载均衡器判断是否路径种子列表是否为空,若是,则执行步骤115,若否,则执行步骤116。步骤115 :负载均衡器等待设定时长跳转至步骤111。步骤116 :负载均衡器向空闲的控制器分发包含路径种子第二指示指令,并跳转至步骤107。在本发明实施例的方案中,为了提高对待测试程序进行符号执行分析的效率,较佳的,所述控制器和负载均衡器运行在不同的主机内,同时,本发明实施例的方案中,使用分离的控制器和符号执行器进程,而非将它们集成在一起的目的是尽可能减少符号执行器进程与其他进程的交互操作,提高本发明的方案的健壮性。本发明实施例一的方案中,一方面由于采用了分布式并行方式对待测试程序进行符号执行分析(也即多个控制器同时对待测是程序进行符号执行分析),使得每一控制器执行的路径的数量均在自己可负荷的范围内,有效解决了基于生成的符号执行中遇到的路径爆炸问题;另一方面,负载均衡器仅需保存路径种子,占用的内存资源较少,且每个分布式控制器在执行完本次的符号执行任务后就释放了占用的内存资源,因此也有效地解决了资源耗尽问题。为了更具体地第说明本发明实施例一的方案,下面通过本发明实施例二的具体例子对本发明实施例一的方案进行说明。实施例二下述示例4和图3所示,分别为 本发明实施例二中用于说明实施例一方案的待测试程序和该待测试程序的符号执行树的示意图;下面结合示例4和图3对本发明实施例一的方案的具体实现过程进行说明。
00char ch[8] = {0}; %构建包含8个char型元素的数组ch;
01if(a < 100) { %判断a是否小于100;
02if(b < 100) %在a小于100时,判断b是否小于100;
03printf("a<100&&b<100");%在 a 小于 100 且b 小于 100 时,输出;
04else
05strcpy(ch., "a< 100&&b>= 100"); %在 a 小于 100 且 b 不小于!00 时,拷贝;
06} else {
07if(b < 100) %在a不小于100时,判断b是否小于100;
08primfifa〉= 100&&b<100”) %在 b 小于 100 时,输出;
09else
10strcpy(ch. "ablOOUA在 b 不小于 100 时,辑贝;
115
12end:示例4这里以一个负载均衡器和两个控制器(控制器I和控制器2)为例进行说明。第一步负载均衡器向选择的控制器I发送第一指示指令;第二步控制器I个创建符号执行器进程1,该符号执行器进程I按照设置的先分析符号执行树中左边的节点的执行策略,确定待测试程序的第一条路径“00-01-02-03-12”。第三步符号执行器进程I在第一条路径“00-01-02-03-12”的分支指令01和02处分别生成路径种子“0”和“ 1-0”,第四步符号执行器进程将生成的路径种子发送至给负载均衡器,收集该第一条路径上的路径条件得到“a〈100 ;b〈100”,并调用约束求解器进程获得满足所述第一条路径上的路径条件的测试用a=0,b=0。第五步控制器I向负载均衡器发送进入空闲状态的通知。
第六步负载均衡器接收路径种子“0”和“1-0”,并将包含路径种子“0”的第二指示指令发送给控制器2 ;第七步控制器2创建一个符号执行器进程2,并将路径种子“0”交给符号执行器进程2。在上述第七步中,也可以称符号执行器进程2是以带路径种子的方式创建的符号执行器进程,此时,称上述第二步中控制器I创建符号执行器进程I的方式为不带路径种子的方式创建。第八步符号执行器进程2在遇到分支指令01时,根据路径种子“0”的指示,直接转向07 (此时,路径种子已经用完,下面的分支指令需要自己调用约束求解器判定走向,即转向正常的符号执行过程),符号执行器进程2按照设置的先分析符号执行树中左边的节点的执行策略,确定出待测试程序中的第二条路径“00-01-07-08-12”,收集该第二条路径上的路径条件a>=100; b〈100,调用约束求解器进程生成满足该第二条路径上的路径条件的测试用例 a= 100, b=0。第九步符号执行器进程2在第二段路径07-08-12中的分支指令07生成路径种子“0-0”,并上传给负载均衡器。第十步控制器I检测到符号执行器进程I完成符号执行任务并结束后,向负载均衡器汇报工作完成情况并进入空闲状态;第十一步负载均衡器向控制器I分发路径种子“1-0”,使得控制器I以带种子方式创建符号执行器进程3。该符号执行器进程3确定待测试的程序的第三条路径“00-01-02-05-12”,没有生成任何路径种子,但在05行成功地检测到一处缓冲区溢出漏洞(ch的空间是8个字节,最多可容纳8个char字符,而字符串“a〈100&&b>=100”包含13个char字符),调用约束求解器进程获得测试用例a=0,b=100。第十二步空闲的控制器2收到负载均衡器分发的路径种子“0-0”,以带种子方式创建符号执行器进程4。符号执行器进程4确定第四条路径“00-01-07-10-12”,没有生成任何路径种子,调用约束求解器进程生成测试用例a=100,b=100。第十三步负载均衡器判断出其内无路径种子剩余,且所有的控制器空闲,负载均衡器向每个控制器发送停止工作命令。第十四步收到停止工作命令的控制器退出。实施例三如图4所示,为本发明是实施例三的符号执行系统的结构示意图,包括负载均衡器11和至少两个控制器12 ;负载均衡器11,用于向选择的一控制器发送第一指示指令,接收来自控制器的路径种子和进入空闲状态通知,向至少一个空闲的控制器分别发送含有路径种子的第二指示指令,且每个空闲的控制器对应的第二指示指令中的路径种子不同;所述控制器12,用于在接收到第一指示指令时,按照设定的执行策略确定待测试程序中的第一条路径,且在确定第一条路径过程中在每一条最终引起路径分叉的分支指令处生成相应的路径种子,收集该第一条路径上的路径条件,获得满足所述第一条路径上的路径条件的测试用例,其中,所述路径种子是由设定个数的元素组成的顺序字节流,所述元素是表示程序路径中依次遇到的每个分支指令的取向;在接收到第二指示指令时,确定所述第二指示指令中的路径种子所表示的第一段路径,在该第一段路径的基础上按照设定的执行策略确定能与第一段路径结合构成第N条路径的第二段路径,并在确定第二段路径过程中在每一条最终引起路径分叉的分支指令处生成相应的路径种子,收集该第N条路径上的路径条件,获得满足所述第N条路径上的路径条件的测试用例,所述N为大于I的正整数。较佳的,所述控制器12在接收到第一指示指令和含有路径种子的第二指示指令时,创建符号执行器进程,该创建的符号执行器进程来执行第一指示指令和第二指示指令。较佳地,所述控制器12,具体用于在待测试程序中存在多路分支指令时,在所述按照设定的执行策略确定待测试程序中的第一条路径之前,将多路分支指令转换为多条二路分支指令。较佳地,所述控制器12具体用于在接收到第一指示指令时,确定该第一条路径中起始分支指令到该第一条路径中的每一条最终引起路径分叉的分支指令前的路径对应的路径种子,在确定的该路径种子后添加一个表示与第一条路径在该最终引起路径分叉的分支指令的取向相反的元素,得到一个新的路径种子,将该新的路径种子作为生成的路径种子;在接收到第二指示指令时,确定所述第N条路径中起始分支指令到该第二段路径中的每一条最终引起路径分叉的分支指令前的路径对应的路径种子,在确定的该路径种子后添加一个表示与第N条路径在该最终引起路径分叉的分支指令的取向相反的元素,得到一个新的路径种子,将该新的路径种子作为生成的路径种子。较佳地,所述负载均衡器11,包括一个主线程、一个消费者线程、一个生产者线程和一个任务列表,所述主线程作为消费者线程和生产者线程的守护线程,对消费者线程和生产者线程进行管理;所述消费者线程,用于向选择的一控制器发送第一指示指令,从任务列表中取出路径种子,并向至少一个空闲的控制器分别发送含有路径种子的第二指示指令,且每个空闲的控制器对应的第二指示指令中的路径种子不同;所述生产者线程,用于接收来自控制器的路径种子和进入空闲状态通知,并将接收到的路径种子存放至任务列表。实施例四如图5所示,为本发明实施例四中的符号执行方法流程图,包括以下步骤步骤201 :符号执行装置向选择的一控制器发送第一指示指令。所述第一指示指令用于指示控制器按照设定的执行策略确定待测试程序中的第一条路径,且在确定第一条路径过程中在每一条最终引起路径分叉的分支指令处生成相应的路径种子,并收集该第一条路径上的路径条件,获得满足所述第一条路径上的路径条件的测试用例,其中,所述路径种子是由设定个数的元素组成的顺序字节流,所述元素是表示程序路径中依次遇到的每个分支指令的取向;步骤202 :符号执行装置接收来自控制器的路径种子和进入空闲状态通知。步骤203 :符号执行装置向至少一个空闲的控制器分别发送含有路径种子的第二指示指令,直至路径种子分发完毕。在本步骤203中,每个空闲的控制器对应的第二指示指令中的路径种子不同,该第二指示指令用于指示控制器确定所述第二指示指令中的路径种子所表示的第一段路径,在该第一段路径的基础上按照设定的执行策略确定能与第一段路径结合构成第N条路径的第二段路径,并在确定第二段路径过程中在每一条最终引起路径分叉的分支指令处生成相应的路径种子,收集该第N条路径上的路径条件,获得满足所述第N条路径上的路径条件的测试用例,所述N为大于I的正整数。实施例五如图6所示,为本发明实施例五中的符号执行方法流程图,包括以下步骤步骤301 :符号执行装置接收负载均衡器发送的第一指示指令;步骤302 :符号执行装置按照设定的执行策略确定待测试程序中的第一条路径,且在确定第一条路径过程中在每一条最终引起路径分叉的分支指令处生成相应的路径种子,并收集该第一条路径上的路径条件,获得满足所述第一条路径上的路径条件的测试用例,其中,所述路径种子是由设定个数的元素组成的顺序字节流,所述元素是表示程序路径中依次遇到的每个分支指令的取向;较佳的,在本步骤302之前,在待测试程序中存在多路分支指令时,在所述按照设定的执行策略确定待测试程序中的第一条路径之前,将多路分支指令转换为多条二路分支指令。较佳的,在本步骤302中,符号执行装置具体通过以下方法在确定第一条路径过程中在每一条最终引起路径分叉的分支指令处生成相应的路径种子第一步确定该第一条路径中起始分支指令到该第一条路径中的每一条最终引起路径分叉的分支指令前的路径对应的路径种子;第二步并在确定的该路径种子后添加一个表示与第一条路径在该最终引起路径分叉的分支指令的取向相反的元素,得到一个新的路径种子,将该新的路径种子作为生成的路径种子。步骤303 :符号执行装置将生成的路径种子发送给负载均衡器。步骤304 :符号执行装置接收负载均衡器发送的含有路径种子的第二指示指令;步骤305 :符号执行装置确定所述第二指示指令中的路径种子所表示的第一段路径,在该第一段路径的基础上按照设定的执行策略确定能与第一段路径结合构成第N条路径的第二段路径,并在确定第二段路径过程中在每一条最终引起路径分叉的分支指令处生成相应的路径种子,收集该第N条路径上的路径条件,获得满足所述第N条路径上的路径条件的测试用例,所述N为大于I的正整数;较佳的,在本步骤305中,符号执行装置具体通过以下方法在确定第一条路径过程中在每一条最终引起路径分叉的分支指令处生成相应的路径种子第一步确定所述第N条路径中起始分支指令到该第二段路径中的每一条最终引起路径分叉的分支指令前的路径对应的路径种子;第二步在确定的该路径种子后添加一个表示与第N条路径在该最终引起路径分叉的分支指令的取向相反的元素,得到一个新的路径种子,将该新的路径种子作为生成的路径种子。步骤306 :符号执行装置将生成的路径种子发送给负载均衡器。在本发明实施例五中,只要符号执行装置接收到负载均衡器发送的含有路径种子的第二指示指令,则均执行步骤306。
实施例六基于与实施例四的同一构思,为本发明实施例六中提供一种符号执行装置20,其结构示意图如图7所示,包括所述符号执行装置包括第一发送模块21、接收模块22和第二发送模块23 ;第一发送模块21,用于向选择的一控制器发送第一指示指令,该第一指示指令用于指示控制器按照设定的执行策略确定待测试程序中的第一条路径,且在确定第一条路径过程中在每一条最终引起路径分叉的分支指令处生成相应的路径种子,并收集该第一条路径上的路径条件,获得满足所述第一条路径上的路径条件的测试用例,其中,所述路径种子是由设定个数的元素组成的顺序字节流,所述元素是表示程序路径中依次遇到的每个分支指令的取向;接收模块22,用于接收来自控制器的路径种子和进入空闲状态通知;第二发送模块23,用于向至少一个空闲的控制器分别发送含有路径种子的第二指示指令,且每个空闲的控制器对应的第二指示指令中的路径种子不同,该第二指示指令用于指示控制器确定所述第二指示指令中的路径种子所表示的第一段路径,在该第一段路径的基础上按照设定的执行策略确定能与第一段路径结合构成第N条路径的第二段路径,并在确定第二段路径过程中在每一条最终引起路径分叉的分支指令处生成相应的路径种子,收集该第N条路径上的路径条件,获得满足所述第N条路径上的路径条件的测试用例,所述N为大于I的正整数。实施例七基于与实施例五的同一构思,为本发明实施例七中提供一种符号执行装置,其结构示意图如图8所示,包括接收模块31、第一执行模块32、第二执行模块33和发送模块34;接收模块31,用于接收负载均衡器发送的第一指示指令和含有路径种子的第二指示指令;第一执行模块32,用于在接收模块接收到第一指示指令时,按照设定的执行策略确定待测试程序中的第一条路径,且在确定第一条路径过程中在每一条最终引起路径分叉的分支指令处生成相应的路径种子,并收集该第一条路径上的路径条件,获得满足所述第一条路径上的路径条件的测试用例,其中,所述路径种子是由设定个数的元素组成的顺序字节流,所述元素是表示程序路径中依次遇到的每个分支指令的取向;第二执行模块33,用于在接收模块接收到第一指示指令时,确定所述第二指示指令中的路径种子所表示的第一段路径,在该第一段路径的基础上按照设定的执行策略确定能与第一段路径结合构成第N条路径的第二段路径,并在确定第二段路径过程中在每一条最终引起路径分叉的分支指令处生成相应的路径种子,收集该第N条路径上的路径条件,获得满足所述第N条路径上的路径条件的测试用例,所述N为大于I的正整数;发送模块34,用于将第一执行模块和第二执行模块生成的路径种子发送给负载均衡器,并在第一执行模块或第二执行模块获得测试用例后向负载均衡器发送进入空闲状态通知。显然,本领域的技术人员可以对本发明进行各种改动和变型而不脱离本发明的精神和范围。这样,倘若本发明的这些修改和变型属于本发明权利要求及其等同技术的范围之内,则本发明也意图包含这些改动和变型在内。
权利要求
1.一种符号执行方法,其特征在于,应用于包含负载均衡器和至少两个控制器的系统中,所述方法包括 负载均衡器向选择的一控制器发送第一指示指令; 接收到第一指示指令的控制器,按照设定的执行策略确定待测试程序中的第一条路径,且在确定第一条路径的过程中在每一条最终引起路径分叉的分支指令处生成相应的路径种子;将生成的路径种子发送至负载均衡器,并收集该第一条路径上的路径条件,获得满足所述第一条路径上的路径条件的测试用例,向负载均衡器发送进入空闲状态的通知,其中,所述路径种子是由设定个数的元素组成的顺序字节流,所述元素是表示程序路径中依次遇到的每个分支指令的取向; 负载均衡器接收路径种子后,向至少一个空闲的控制器分别发送含有路径种子的第二指示指令,且每个空闲的控制器对应的第二指示指令中的路径种子不同; 收到第二指示指令的控制器,确定所述第二指示指令中的路径种子所表示的第一段路径,在该第一段路径的基础上按照设定的执行策略确定能与第一段路径结合构成第N条路径的第二段路径,并在确定第二段路径过程中在每一条最终引起路径分叉的分支指令处生成相应的路径种子,将生成的路径种子发送至负载均衡器,收集该第N条路径上的路径条件,获得满足所述第N条路径上的路径条件的测试用例,向负载均衡器发送进入空闲状态的通知,所述N为大于I的正整数。
2.如权利要求1所述的方法,其特征在于,在待测试程序中存在多路分支指令时,在所述按照设定的执行策略确定待测试程序中的第一条路径之前,所述方法还包括 将多路分支指令转换为多条二路分支指令。
3.如权利要求2所述的方法,其特征在于,所述在确定第一条路径过程中在每一条最终引起路径分叉的分支指令处生成相应的路径种子具体包括 确定该第一条路径中起始分支指令到该第一条路径中的每一条最终引起路径分叉的分支指令前的路径对应的路径种子; 在确定的该路径种子后添加一个表示与第一条路径在该最终引起路径分叉的分支指令的取向相反的元素,得到一个新的路径种子,将该新的路径种子作为生成的路径种子; 所述在确定第二段路径过程中在每一条最终引起路径分叉的分支指令处生成相应的路径种子,具体包括 确定所述第N条路径中起始分支指令到该第二段路径中的每一条最终引起路径分叉的分支指令前的路径对应的路径种子; 在确定的该路径种子后添加一个表示与第N条路径在该最终引起路径分叉的分支指令的取向相反的元素,得到一个新的路径种子,将该新的路径种子作为生成的路径种子。
4.如权利要求1所述的方法,其特征在于,所述负载均衡器包括一个主线程、一个消费者线程、一个生产者线程和一个任务列表,所述主线程作为消费者线程和生产者线程的守护线程,对消费者线程和生产者线程进行管理; 所述将生成的路径种子发送至负载均衡器具体为 将生成的路径种子发送至生产者线程,该路径种子被生产者线程存放至任务列表; 所述负载均衡器接收路径种子后,向至少一个空闲的控制器分别发送含有路径种子的第二指示指令具体为消费者线程从任务列表中取出路径种子,并向至少一个空闲的控制器分别发送含有该路径种子的第二指示指令。
5.如权利要求1所述的方法,其特征在于,所述负载均衡器和至少两个控制器运行在不同的主机内。
6.—种符号执行系统,其特征在于,所述符号执行系统包括负载均衡器和至少两个控制器; 所述负载均衡器,用于向选择的一控制器发送第一指示指令,接收来自控制器的路径种子和进入空闲状态通知,向至少一个空闲的控制器分别发送含有路径种子的第二指示指令,且每个空闲的控制器对应的第二指示指令中的路径种子不同; 所述控制器,用于在接收到第一指示指令时,按照设定的执行策略确定待测试程序中的第一条路径,且在确定第一条路径过程中在每一条最终引起路径分叉的分支指令处生成相应的路径种子,收集该第一条路径上的路径条件,获得满足所述第一条路径上的路径条件的测试用例,其中,所述路径种子是由设定个数的元素组成的顺序字节流,所述元素是表示程序路径中依次遇到的每个分支指令的取向;在接收到第二指示指令时,确定所述第二指示指令中的路径种子所表示的第一段路径,在该第一段路径的基础上按照设定的执行策略确定能与第一段路径结合构成第N条路径的第二段路径,并在确定第二段路径过程中在每一条最终引起路径分叉的分支指令处生成相应的路径种子,收集该第N条路径上的路径条件,获得满足所述第N条路径上的路径条件的测试用例,所述N为大于I的正整数。
7.如权利要求6所述的符号执行系统,其特征在于, 所述控制器,具体用于在待测试程序中存在多路分支指令时,在所述按照设定的执行策略确定待测试程序中的第一条路径之前,将多路分支指令转换为多条二路分支指令。
8.如权利要求7所述的符号执行系统,其特征在于, 所述控制器,具体用于在接收到第一指示指令时,确定该第一条路径中起始分支指令到该第一条路径中的每一条最终引起路径分叉的分支指令前的路径对应的路径种子,在确定的该路径种子后添加一个表示与第一条路径在该最终引起路径分叉的分支指令的取向相反的元素,得到一个新的路径种子,将该新的路径种子作为生成的路径种子;在接收到第二指示指令时,确定所述第N条路径中起始分支指令到该第二段路径中的每一条最终引起路径分叉的分支指令前的路径对应的路径种子,在确定的该路径种子后添加一个表示与第N条路径在该最终引起路径分叉的分支指令的取向相反的元素,得到一个新的路径种子,将该新的路径种子作为生成的路径种子。
9.如权利要求6所述的符号执行系统,其特征在于, 所述负载均衡器包括一个主线程、一个消费者线程、一个生产者线程和一个任务列表,所述主线程作为消费者线程和生产者线程的守护线程,对消费者线程和生产者线程进行管理; 所述消费者线程,用于向选择的一控制器发送第一指示指令,从任务列表中取出路径种子,并向至少一个空闲的控制器分别发送含有路径种子的第二指示指令,且,每个空闲的控制器对应的第二指示指令中的路径种子不同; 所述生产者线程,用于接收来自控制器的路径种子和进入空闲状态通知,并将接收到的路径种子存放至任务列表。
10.一种符号执行装置,其特征在于,所述符号执行装置包括第一发送模块、接收模块和第二发送模块; 第一发送模块,用于向选择的一控制器发送第一指示指令,该第一指示指令用于指示控制器按照设定的执行策略确定待测试程序中的第一条路径,且在确定第一条路径过程中在每一条最终引起路径分叉的分支指令处生成相应的路径种子,并收集该第一条路径上的路径条件,获得满足所述第一条路径上的路径条件的测试用例,其中,所述路径种子是由设定个数的元素组成的顺序字节流,所述元素是表示程序路径中依次遇到的每个分支指令的取向; 接收模块,用于接收来自控制器的路径种子和进入空闲状态通知; 第二发送模块,用于向至少一个空闲的控制器分别发送含有路径种子的第二指示指令,且每个空闲的控制器对应的第二指示指令中的路径种子不同,该第二指示指令用于指示控制器确定所述第二指示指令中的路径种子所表示的第一段路径,在该第一段路径的基础上按照设定的执行策略确定能与第一段路径结合构成第N条路径的第二段路径,并在确定第二段路径过程中在每一条最终引起路径分叉的分支指令处生成相应的路径种子,收集该第N条路径上的路径条件,获得满足所述第N条路径上的路径条件的测试用例,所述N为大于I的正整数。
11.一种符号执行装置,其特征在于,所述符号执行装置包括接收模块,用于接收负载均衡器发送的第一指示指令和含有路径种子的第二指示指令; 第一执行模块,用于在接收模块接收到第一指示指令时,按照设定的执行策略确定待测试程序中的第一条路径,且在确定第一条路径过程中在每一条最终引起路径分叉的分支指令处生成相应的路径种子,并收集该第一条路径上的路径条件,获得满足所述第一条路径上的路径条件的测试用例,其中,所述路径种子是由设定个数的元素组成的顺序字节流,所述元素是表示程序路径中依次遇到的每个分支指令的取向; 第二执行模块,用于在接收模块接收到第一指示指令时,确定所述第二指示指令中的路径种子所表示的第一段路径,在该第一段路径的基础上按照设定的执行策略确定能与第一段路径结合构成第N条路径的第二段路径,并在确定第二段路径过程中在每一条最终引起路径分叉的分支指令处生成相应的路径种子,收集该第N条路径上的路径条件,获得满足所述第N条路径上的路径条件的测试用例,所述N为大于I的正整数; 发送模块,用于将第一执行模块和第二执行模块生成的路径种子发送给负载均衡器,并在第一执行模块或第二执行模块获得测试用例后向负载均衡器发送进入空闲状态通知。
12.如权利要求11所述的符号执行装置,其特征在于, 所述第一执行模块,具体用于在待测试程序中存在多路分支指令时,在所述按照设定的执行策略确定待测试程序中的第一条路径之前,将多路分支指令转换为多条二路分支指令。
13.如权利要求12所述的符号执行装置,其特征在于, 所述第一执行模块,具体用于确定该第一条路径中起始分支指令到该第一条路径中的每一条最终引起路径分叉的分支指令前的路径对应的路径种子,并在确定的该路径种子后添加一个表示与第一条路径在该最终引起路径分叉的分支指令的取向相反的元素,得到一个新的路径种子,将该新的路径种子作为生成的路径种子;所述第二执行模块,具体用于确定所述第N条路径中起始分支指令到该第二段路径中的每一条最终引起路径分叉的分支指令前的路径对应的路径种子,并在确定的该路径种子后添加一个 表示与第N条路径在该最终引起路径分叉的分支指令的取向相反的元素,得到一个新的路径种子,将该新的路径种子作为生成的路径种子。
全文摘要
本发明公开了一种符号执行方法、装置及系统,主要内容包括应用于包含负载均衡器和至少两个控制器的系统中,控制器执行待测试程序中的某条路径的同时将待测试程序中与该路径相关的路径进行分解,生成路径种子,并将生成的路径种子发送至负载均衡器,由负载均衡器将路径种子分发给多个空闲的控制器。通过本发明实施例的方案,一方面由于采用了分布式并行方式对待测试程序进行符号执行分析,有效解决了基于生成的符号执行中遇到的路径爆炸问题;另一方面,负载均衡器仅需保存路径种子,占用的内存资源较少,且每个分布式控制器在执行完本次的符号执行任务后就释放了占用的内存资源,因此有效地解决了资源耗尽问题。
文档编号G06F21/56GK103019862SQ20121054002
公开日2013年4月3日 申请日期2012年12月13日 优先权日2012年12月13日
发明者忽朝俭, 曲富平, 左磊, 赵粮, 薛一波 申请人:北京神州绿盟信息安全科技股份有限公司, 北京神州绿盟科技有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1