面向C程序缺陷检测的靶向式并行符号执行方法与流程

文档序号:18642298发布日期:2019-09-11 23:36阅读:403来源:国知局
面向C程序缺陷检测的靶向式并行符号执行方法与流程

本发明涉及信息技术领域,尤其涉及一种面向c程序缺陷检测的靶向式并行符号执行方法。



背景技术:

符号执行是一种精确度较高的程序分析技术。该技术使用符号化输入代替实际输入来模拟执行目标程序,使用符号表达式刻画执行路径上程序指令的语义。在遇到条件语句时,分支条件被加入到当前路径的路径条件中,通过调用smt求解器对路径条件的可满足性进行求解来判断路径是否实际可行,通过对路径条件约束子集变异后得到的新约束集合,通过使用smt求解器对新约束集合求解,循环以上过程以穷举分析目标程序的路径空间。计算资源开销过大和路径空间爆炸问题导致符号执行技术难以高效分析大规模代码,是该技术目前存在的主要问题。



技术实现要素:

针对现有技术的不足,本发明提供一种面向c程序缺陷检测的靶向式并行符号执行方法,有机结合静态分析“快”和符号执行“准”的优点,在利用静态分析的优势保证高效率的同时,利用符号执行的精度优势,实现对源代码缺陷分析目标的快速精准定位和验证。

本发明解决其技术问题所采用的技术方案是:

所述面向c程序缺陷检测的靶向式并行符号执行方法包括分布式计算系统,所述分布式计算系统包括一个主控节点和多个计算节点,所述主控节点负责任务的预处理和任务的分派,所述计算节点负责任务处理;

所述主控节点任务预处理和任务分派包括以下步骤:

步骤s1、源代码编译到中间代码:主控节点利用c代码编译前端将源代码编译到中间代码;

步骤s2、静态分析出疑似漏洞点:主控节点对源代码做静态分析,给出疑似漏洞点p1,p2,…pn,各漏洞点分别对应中间代码中的一条指令;

步骤s3、建立程序依赖图:主控节点分析中间代码,依次建立程序依赖图g<entry>,其中entry为程序依赖图g的入口;

步骤s4、图算法遍历程序依赖图g:主控节点使用图算法遍历程序依赖图g,分别针对p1,p2,…pn,得到子图g1、g2、…gn,对于gi,i∈[1,2,3…,n],入口为entry,出口为pi;

步骤s5、将子图置入队列:主控节点将子图g1、g2、…gn置入队列listtask;

步骤s6、记录计算节点的状态:主控节点使用状态向量statevecter记录各计算节点的状态,状态向量statevecter的每个单元为一个元组ns<id,ip,port,idlecorenumber,workstate>;

步骤s7、初始化计算节点:分布式计算系统启动时,主控节点进入初始状态,完成步骤s1~s5后,根据预先设定的计算节点相关信息,分别为每个计算节点i设置对应的元组nsi进行初始化,并进入等待状态,接收各计算节点的注册请求;

步骤s8、中间代码的分配:各计算节点向主控节点注册,提交其id、ip地址、端口port、空闲cpu核心数idlecorenumber,主控节点填充状态向量statevecter中相应信息,并将编译后的中间代码分发至各计算节点;

步骤s9、遍历队列listtask:主控节点遍历队列listtask,取出第一个子图g0,遍历状态向量statevecter各元素statei(i∈[1,2,3…,n]),对于statei,若其idlecorenumber>0,则将g0分配给statei标识的计算节点;若listtask为空,且状态向量statevecter中各state的workstate均为idle,表示全部任务处理完毕,执行步骤s12;

步骤s10、各计算节点开始计算任务;

步骤s11、更新元组ns:计算节点i处理计算任务结束后,向主控节点发起通知,主控节点收到通知后,将状态向量statevecter中该节点对应状态的元组ns更新,设置idlecorenumber+1,执行步骤s9;

步骤s12、主控节点通知各计算节点结束,收取并汇总各计算节点所提交的处理结果;

步骤s13、结束。

在本发明提供的面向c程序缺陷检测的靶向式并行符号执行方法的一种较佳实施例中,所述步骤s10中,计算节点计算任务的处理过程具体包括以下步骤:

步骤s101、将中间代码逐一放至fifo队列instructionlist,当遇到分支指令时,分支指令入队,执行步骤102;

步骤s102、taski利用动态符号执行引擎e从队列instructionlist中取出第一条指令i:

a、若预先给定时间等指标达到阈值,或队列instructionlist为空,执行步骤s105,否则执行步骤s102.b;

b、若当前指令i为靶标指令pi,则符号化执行pi,并执行步骤103,否则执行步骤s102.c;

c、对于当前指令i,若igi,则略过i,执行步骤s102.a,否则执行步骤s102.d;

d、若指令i不是分支指令,则符号化执行指令i,执行步骤s102,否则转至步骤s102.e;

e、对于分支指令,将左右分支跳转目标指令放至instructionlist队尾,执行步骤s102.a;

步骤s103、在靶标指令pi处根据其对应的符号状态检验程序安全约束,若安全约束被破坏,执行步骤s104,否则转至步骤s105;

步骤s104、利用smt求解器对路径约束进行求解,若求解成功,则求解结果即为验证缺陷的执行用例;

步骤s105、通知主控节点计算任务处理完毕,及任务处理结果;

步骤s106、结束。

在本发明提供的面向c程序缺陷检测的靶向式并行符号执行方法的一种较佳实施例中,所述步骤s3具体为:主控节点分析中间代码,依次建立其分析过程间的控制依赖图、数据依赖图,合并建立程序依赖图g<entry>,其中entry为程序依赖图g的入口。

在本发明提供的面向c程序缺陷检测的靶向式并行符号执行方法的一种较佳实施例中,所述步骤s6中的所述元组ns<id,ip,port,idlecorenumber,workstate>分别表示:id、ip地址,端口port,空闲cpu核心数idlecorenumber,workstate表示该节点工作状态是否空闲,取值为busy/idle。

与现有技术相比,本发明提供的面向c程序缺陷检测的靶向式并行符号执行方法的有益效果是:本发明利用静态分析手段获取疑似目标缺陷点和相关信息,建立分析靶标;分析目标源代码的数据依赖和控制依赖关系,建立程序依赖图,以各分析靶标为目标,从程序依赖图中分别抽取各靶标对应的依赖关系子图;利用以上信息,在符号执行过程中,指导路径选择算法,使符号执行引擎遍历各个子图的路径空间,并在靶标指令处检验程序安全约束,产生验证缺陷的执行用例,通过在每条路径的可疑位置添加性质约束,并使用smt求解器对约束表达式进行求解,推断在该位置是否存在可能的程序缺陷。有机结合静态分析“快”和符号执行“准”的优点,在利用静态分析的优势保证高效率的同时,利用符号执行的精度优势,实现对源代码缺陷分析目标的快速精准定位和验证。

附图说明

为了更清楚地说明本发明实施例中的技术方案,下面将对实施例描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其它的附图,其中:

图1是本发明提供的面向c程序缺陷检测的靶向式并行符号执行方法的所述主控节点任务预处理和任务分派的流程图;

图2是本发明提供的面向c程序缺陷检测的靶向式并行符号执行方法的所述计算节点计算任务的处理流程图。

具体实施方式

下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅是本发明的一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其它实施例,都属于本发明保护的范围。

请参阅图1,所述面向c程序缺陷检测的靶向式并行符号执行方法包括分布式计算系统,所述分布式计算系统包括一个主控节点和多个计算节点,所述主控节点负责任务的预处理和任务的分派,所述计算节点负责任务处理;

所述主控节点任务预处理和任务分派包括以下步骤:

步骤s1、源代码编译到中间代码:主控节点利用c代码编译前端将源代码编译到中间代码;

步骤s2、静态分析出疑似漏洞点:主控节点对源代码做静态分析,给出疑似漏洞点p1,p2,…pn,各漏洞点分别对应中间代码中的一条指令;

步骤s3、建立程序依赖图:主控节点分析中间代码,依次建立其分析过程间的控制依赖图、数据依赖图,合并建立程序依赖图g<entry>,其中entry为程序依赖图g的入口;

步骤s4、图算法遍历程序依赖图g:主控节点使用图算法遍历程序依赖图g,分别针对p1,p2,…pn,得到子图g1、g2、…gn,对于gi,i∈[1,2,3…,n],入口为entry,出口为pi;

步骤s5、将子图置入队列:主控节点将子图g1、g2、…gn置入队列listtask;

步骤s6、记录计算节点的状态:主控节点使用状态向量statevecter记录各计算节点的状态,状态向量statevecter的每个单元为一个元组ns<id,ip,port,idlecorenumber,workstate>,分别表示:id、ip地址,端口port,空闲cpu核心数idlecorenumber,workstate表示该节点工作状态是否空闲,取值为busy/idle;

步骤s7、初始化计算节点:分布式计算系统启动时,主控节点进入初始状态,完成步骤s1~s5后,根据预先设定的计算节点相关信息,分别为每个计算节点i设置对应的元组nsi进行初始化,并进入等待状态,接收各计算节点的注册请求;

步骤s8、中间代码的分配:各计算节点向主控节点注册,提交其id、ip地址、端口port、空闲cpu核心数idlecorenumber,主控节点填充状态向量statevecter中相应信息,并将编译后的中间代码分发至各计算节点;

步骤s9、遍历队列listtask:主控节点遍历队列listtask,取出第一个子图g0,遍历状态向量statevecter各元素statei(i∈[1,2,3…,n]),对于statei,若其idlecorenumber>0,则将g0分配给statei标识的计算节点;若listtask为空,且状态向量statevecter中各state的workstate均为idle,表示全部任务处理完毕,执行步骤s12;

步骤s10、各计算节点开始计算任务;

请参阅图2,所述计算节点计算任务的处理过程具体包括以下步骤:

步骤s101、将中间代码逐一放至fifo队列instructionlist,当遇到分支指令时,分支指令入队,执行步骤102;

步骤s102、taski利用动态符号执行引擎e从队列instructionlist中取出第一条指令i:

a、若预先给定时间等指标达到阈值,或队列instructionlist为空,执行步骤s105,否则执行步骤s102.b;

b、若当前指令i为靶标指令pi,则符号化执行pi,并执行步骤103,否则执行步骤s102.c;

c、对于当前指令i,若igi,则略过i,执行步骤s102.a,否则执行步骤s102.d;

d、若指令i不是分支指令,则符号化执行指令i,执行步骤s102,否则转至步骤s102.e;

e、对于分支指令,将左右分支跳转目标指令放至instructionlist队尾,执行步骤s102.a;

步骤s103、在靶标指令pi处根据其对应的符号状态检验程序安全约束,若安全约束被破坏,执行步骤s104,否则转至步骤s105;

步骤s104、利用smt求解器对路径约束进行求解,若求解成功,则求解结果即为验证缺陷的执行用例;

步骤s105、通知主控节点计算任务处理完毕,及任务处理结果;

步骤s106、结束。

步骤s11、更新元组ns:计算节点i处理计算任务结束后,向主控节点发起通知,主控节点收到通知后,将状态向量statevecter中该节点对应状态的元组ns更新,设置idlecorenumber+1,执行步骤s9;

步骤s12、主控节点通知各计算节点结束,收取并汇总各计算节点所提交的处理结果;

步骤s13、结束。

以上所述仅为本发明的实施例,并非因此限制本发明的专利范围,凡是利用本发明说明书内容所作的等效结构或等效流程变换,或直接或间接运用在其它相关的技术领域,均同理包括在本发明的专利保护范围之内。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1