一种基于共享不可行路径池的代码并行验证方法和装置与流程

文档序号:21592567发布日期:2020-07-24 16:40阅读:165来源:国知局
一种基于共享不可行路径池的代码并行验证方法和装置与流程

本发明涉及软件安全领域,特别涉及通过模型验证软件代码安全性的技术。



背景技术:

随着计算机技术的不断发展,计算机软件在人们的日常生活中扮演着越来越重要的角色。在此情况下,软件的安全性和正确性保障已经成为当前至关重要的问题。

模型检验方法是新近所提出的用于检验软件安全性的方法。该方法利用现代编译器将代码转化为中间代码,在中间代码的基础上建模进行约束抽取,并对约束求解得到验证结果。模型检验方法由于易于自动化和提供反例而成为软件安全领域的热门。

在最初的模型检验方法中,将程序代码作为一个整体,通过对整体代码行为进行编码求解以判断代码的安全性。但在实际应用的环境中,由于现实所使用的软件规模通常都非常庞大,程序代码作为一个整体进行建模,抽取约束,再进行约束求解验证所需要耗费的资源非常庞大,耗时也非常长,因此很难实际应用。

为降低模型检验方法的复杂度,现有技术提出了面向路径进行模型检验的方法,也就是每次模型检验单独验证一条执行路径而非程序代码整体。但这种面向路径进行模型检验存在程序路径数过于庞大的问题,也就是若程序路径数目非常大,需要验证的路径也非常多,该方法进行约束求解验证所需要耗费的资源同样非常庞大,耗时非常长。



技术实现要素:

本发明所要解决的问题:提高面向路径进行模型检验的效率。

为解决上述问题,本发明采用的方案如下:

根据本发明的一种基于共享不可行路径池的代码并行验证方法,包括如下步骤:

s1:获取用户输入的源代码和验证目标,所述验证目标为用户所输入的源代码中指定位置在所指定的步数内是否可达;

s2:将用户输入的源代码转换成流程控制状态图,并初始化并行任务池t为空,共享不可行路径池i为空以及所述并行任务池t的最大路径数k;

s3:根据流程控制状态图和验证目标构建sat约束编码g;

s4:将所述共享不可行路径池i中的各个路径片段取反编码后与所述sat约束编码g输入至sat求解器进行求解;若sat求解器有解,则将sat求解器所求的解对应至程序路径生成相应的潜在程序路径加入至所述并行任务池t,并将该组解取反加入所述sat约束编码g以避免重复路径;若sat求解器无解,则说明用户所输入的源代码指定位置在所指定的步数内不可达,结束代码验证;

s5:持续步骤s4直到所述并行任务池t中的潜在程序路径数达到最大路径数k;

s6:根据并行任务池t的最大路径数k构建包含k个线程的线程组,然后将所述并行任务池t中的每个潜在程序路径分别输入至线程组的各个线程中,由对应的线程进行smt求解;所述smt求解包括如下步骤:

s61:根据所输入的潜在程序路径和所述流程控制状态图构建smt约束编码w;

s62:将所构建的smt约束编码w输入至smt约束求解器;若smt约束求解器不可解,则抽取其中不可满足的最小集合x,根据最小集合x生成对应的不可行程序路径片段,将该不可行程序路径片段放入所述共享不可行路径池i中;若smt约束求解器可解,则说明该潜在程序路径为能够到达用户所输入代码指定位置的可达路径,结束代码验证;

s7:转步骤s4进行迭代。

如权利要求1所述的基于共享不可行路径池的代码并行验证方法,其特征在于,所述步骤s6还包括不可行路径剪枝步骤;

所述不可行路径剪枝步骤,用于:检测共享不可行路径池i中的不可行程序路径片段是否得到更新,若存在更新,则判断当前潜在程序路径是否包含新增的不可行程序路径片段;若当前潜在程序路径包含新增的不可行程序路径片段,则结束该潜在程序路径所对应的smt求解线程。

进一步,根据本发明的基于共享不可行路径池的代码并行验证方法,检测共享不可行路径池i中的不可行程序路径片段是否得到更新采用版本号的方法,具体如下:共享不可行路径池i设有版本号,每个潜在程序路径也设有版本号;共享不可行路径池i的版本号在步骤s2中初始化为0;步骤s4中,每次将潜在程序路径加入至所述并行任务池t时,该潜在程序路径的版本号为所述共享不可行路径池i的版本号;步骤s62中,将不可行程序路径片段放入共享不可行路径池i时,递增共享不可行路径池i的版本号;检测共享不可行路径池i中的不可行程序路径片段是否得到更新则判断当前潜在程序路径的版本号是否与当前共享不可行路径池i的版本号是否相同即可。

进一步,根据本发明的基于共享不可行路径池的代码并行验证方法,判断当前潜在程序路径是否包含新增的不可行程序路径片段采用如下方法:获取所述共享不可行路径池i中新增的不可行程序路径片段,将其取反编码后与当前潜在程序路径对应的sat编码输入sat求解器,若此时sat求解器无解,则表示当前潜在程序路径包含新增的不可行程序路径片段。

进一步,根据本发明的基于共享不可行路径池的代码并行验证方法,所述不可行路径剪枝步骤被配置于独立的线程中。

根据本发明的一种基于共享不可行路径池的代码并行验证装置,包括如下模块:

m1,用于:获取用户输入的源代码和验证目标,所述验证目标为用户所输入的源代码中指定位置在所指定的步数内是否可达;

m2,用于:将用户输入的源代码转换成流程控制状态图,并初始化并行任务池t为空,共享不可行路径池i为空以及所述并行任务池t的最大路径数k;

m3,用于:根据流程控制状态图和验证目标构建sat约束编码g;

m4,用于:将所述共享不可行路径池i中的各个路径片段取反编码后与所述sat约束编码g输入至sat求解器进行求解;若sat求解器有解,则将sat求解器所求的解对应至程序路径生成相应的潜在程序路径加入至所述并行任务池t,并将该组解取反加入所述sat约束编码g以避免重复路径;若sat求解器无解,则说明用户所输入的源代码指定位置在所指定的步数内不可达,结束代码验证;

m5,用于:持续调用模块m4直到所述并行任务池t中的潜在程序路径数达到最大路径数k;

m6,用于:根据并行任务池t的最大路径数k构建包含k个线程的线程组,然后将所述并行任务池t中的每个潜在程序路径分别输入至线程组的各个线程中,由对应的线程进行smt求解;所述smt求解包括如下模块:

m61,用于:根据所输入的潜在程序路径和所述流程控制状态图构建smt约束编码w;

m62,用于:将所构建的smt约束编码w输入至smt约束求解器;若smt约束求解器不可解,则抽取其中不可满足的最小集合x,根据最小集合x生成对应的不可行程序路径片段,将该不可行程序路径片段放入所述共享不可行路径池i中;若smt约束求解器可解,则说明该潜在程序路径为能够到达用户所输入代码指定位置的可达路径,结束代码验证;

m7,用于:返回模块m4进行迭代。

如权利要求5所述的基于共享不可行路径池的代码并行验证装置,其特征在于,所述模块m6中还包括不可行路径剪枝模块;

所述不可行路径剪枝模块,用于:检测共享不可行路径池i中的不可行程序路径片段是否得到更新,若存在更新,则判断当前潜在程序路径是否包含新增的不可行程序路径片段;若当前潜在程序路径包含新增的不可行程序路径片段,则结束该潜在程序路径所对应的smt求解线程。

进一步,根据本发明的基于共享不可行路径池的代码并行验证装置,所述检测共享不可行路径池i中的不可行程序路径片段是否得到更新采用版本号的方法,具体如下:共享不可行路径池i设有版本号,每个潜在程序路径也设有版本号;共享不可行路径池i的版本号在模块m2中初始化为0;模块m4中,每次将潜在程序路径加入至所述并行任务池t时,该潜在程序路径的版本号为所述共享不可行路径池i的版本号;模块m62中,将不可行程序路径片段放入共享不可行路径池i时,递增共享不可行路径池i的版本号;所述检测共享不可行路径池i中的不可行程序路径片段是否得到更新则判断当前潜在程序路径的版本号是否与当前共享不可行路径池i的版本号是否相同即可。

进一步,根据本发明的基于共享不可行路径池的代码并行验证装置,判断当前潜在程序路径是否包含新增的不可行程序路径片段采用如下方法:获取所述共享不可行路径池i中新增的不可行程序路径片段,将其取反编码后与当前潜在程序路径对应的sat编码输入sat求解器,若此时sat求解器无解,则表示当前潜在程序路径包含新增的不可行程序路径片段。

进一步,根据本发明的基于共享不可行路径池的代码并行验证装置,所述不可行路径剪枝模块被配置于独立的线程中。

本发明的技术效果如下:

(1)本发明整体过程大体分成两个步骤:第一个是sat求解找出潜在路径的步骤,第二个是通过smt约束求解对潜在路径进行验证输出不可行路径的步骤。smt约束求解由多线程并行化处理,以充分利用多核处理器的核资源。由于smt约束求解过程耗时比sat求解所需要的耗时多很多,因此此种安排可以大大提高代码整体验证的效率。

(2)本发明smt约束求解得到的不可行路径输出至共享不可行路径池中,当共享不可行路径池中的不可行路径更新时,正在进行smt约束求解的线程中断smt约束求解过程,先进行路径sat求解,以判断当前正在验证的潜在路径是否被更新的不可行路径剪枝,如果被剪枝则终止当前的smt约束求解,否则继续该潜在路径的smt约束求解。由此大大提高并行验证过程的路径遍历效率。

附图说明

图1是本发明方法的流程图。

图2是本发明实施例中的示例程序代码。

图3是图2示例程序代码转化得到的流程控制状态图。

具体实施方式

下面结合附图对本发明做进一步详细说明。

参照图1,本发明的一种共享不可行路径池的并行化代码验证方法大体可分为四个过程:第一是初始化过程,第二是找出潜在路径过程,第三是对潜在路径分析过程。其中,找出潜在路径过程和对潜在路径分析过程是迭代过程中的过程。

初始化过程也就是初始化sat约束编码g、并行任务池t和共享不可行路径池i,也就是前述的步骤s1至s3。sat约束编码g由用户输入的源代码和验证目标所构建。用户输入的源代码首先转换成cfg状态模型,然后再以cfg状态模型和验证目标为输入构建sat约束编码g。验证目标为用户所输入的源代码中指定位置在所指定的步数内是否可达。以图2为例,图2是本发明实施例的示例代码,是c语言的源代码,在代码第17行调用了函数__verifier_error函数,可作为默认的验证目标,也可根据用户需要指定其他目标。为便于说明,本实施例的示例以图2示例代码的第17行和有界验证步长50作为验证目标进行验证。

步骤s2中,cfg状态模型即为前述的流程控制状态图。将用户所输入的源代码转换成流程控制状态图本实施例中通过前端编译器实现。本领域技术人员理解,编译器一般由三部分组成分别为前端编译器、优化模块和后端编译器。前端编译器用于将不同语言的源代码转换为格式相同的中间指令集,之后优化模块在中间指令集的基础上进行各种优化处理,最后后端编译器根据优化后的中间指令集生成不同平台或不同架构的机器指令集。目前现有的前端编译器比如clang编译器。clang编译器是由llvm编译器框架系统衍生而出处理c语言的编译器。图2示例代码经clang编译器后可以得到如图3所示的流程控制状态图。本实施例的示例中,以图2示例代码的第17行和有界验证步长50作为验证目标,也就是,以图3中的s0为起点,q0为终点。

步骤s3,根据流程控制状态图和验证目标构建sat约束编码g具体可以参考专利文献cn105808429a《一种面向线性约束代码的有界模型验证方法》、cn107180193a《一种将程序代码转换成数据约束的方法和装置》以及cn108694285a《一种分析组合线性混成自动机全局可达的方法和装置》中的sat约束编码方法,本说明书不再赘述。

并行任务池t用于存储潜在路径,步骤s2中初始化为空。在对潜在路径分析过程中,所分析的潜在路径来自于并行任务池t,而并行任务池t中的潜在路径来自于找出潜在路径过程的输出。对潜在路径分析过程采用线程对潜在路径进行分析,相当于并行任务池t中的每条潜在路径对应一线程任务,因而称为并行任务池。并行任务池t中能够存储的潜在路径数与线程数相关,该线程数通常对应于当前计算机处理器的核心数。也就是,前述步骤s2中,并行任务池t的最大路径数k可以根据计算机处理器的核心数配置,显而易见地,本领域技术人员理解,并行任务池t的最大路径数k也可以根据用户自身的客观情况自定义。本实施例的示例中,并行任务池t的最大路径数k设为4。

共享不可行路径池i用于存储不可行路径,所存储的是不可行路径的集合,步骤s2中初始化为空。共享不可行路径池i中的不可行路径来自于对潜在路径分析过程的输出。

需要指出的是,初始化过程中,所初始化的sat约束编码g、并行任务池t和共享不可行路径池i是三个独立对象,由此,本领域技术人员理解,对sat约束编码g、并行任务池t和共享不可行路径池i的初始化可以不分先后。

找出潜在路径过程,即为前述步骤s4和s5。步骤s4,将共享不可行路径池i中的各个路径片段取反编码后与sat约束编码g输入至sat求解器进行求解;若sat求解器有解,则将sat求解器所求的解对应至程序路径生成相应的潜在程序路径加入至并行任务池t,并将该组解取反加入sat约束编码g以避免重复路径;若sat求解器无解,则说明用户所输入的源代码指定位置在所指定的步数内不可达,结束代码验证。步骤s5,持续步骤s4直到并行任务池t中的潜在程序路径数达到最大路径数k。潜在程序路径本发明简称为潜在路径。简单来说找出潜在路径过程也就是根据输入计算出不可重复的潜在路径至并行任务池t直到并行任务池t填满。该过程的输入是共享不可行路径池i和sat约束编码g。共享不可行路径池i具体来说是共享不可行路径池i中的不可行路径。共享不可行路径池i初始状态下为空,随着迭代过程的进行,共享不可行路径池i将会存储由对潜在路径分析过程输出的不可行路径。找出潜在路径过程的输出为潜在路径和更新后的sat约束编码g。需要指出的是找出潜在路径过程存在迭代过程结束条件,也就是,若sat求解器无解,则说明用户所输入的源代码指定位置在所指定的步数内不可达,结束代码验证。

sat约束编码g输入至sat求解器进行求解,得到的解可以对应至程序路径,该所对应的程序为潜在路径。将该组解取反加入sat约束编码g意味着下一次的sat求解器对sat约束编码g进行求解时,可以避开该组解,也就是避免该组解对应的潜在路径的重复生成。由此,步骤s4每次得到的潜在路径不可能与之前得到潜在路径重复,实现潜在路径的遍历。将共享不可行路径池i中的各个路径片段取反编码与前述类似,共享不可行路径池i中的各个路径片段取反编码后与sat约束编码g输入至sat求解器进行求解使得sat求解器所求的解所对应的潜在程序路径避开共享不可行路径池i中的各个路径片段。以前述图2代码示例为例,某一时刻sat求解器求解得到的路径:s0^s1^s2^s3^s4^s5^s9^s1^s3^s10^s12^q0,该路径对应的解取反,加入到sat约束编码g中继续求解。由于sat约束编码g中已包含取反后的编码,因此继续求解只会得到不同的解而不可能得到上述重复的路径。sat求解器将继续求解,得到s0^s1^s2^s3^s10^s12^q0、s0^s1^s2^s3^s10^s11^s12^q0、s0^s1^s2^s3^s4^s5^s9^s1^s2^s3^s10^s12^q0三条路径,使得任务池中的路径总计四条路径。

对潜在路径分析过程也就是前述步骤s6中的smt求解,也就是步骤s61和s62:根据所输入的潜在程序路径和流程控制状态图构建smt约束编码w;然后将所构建的smt约束编码w输入至smt约束求解器;若smt约束求解器不可解,则抽取其中不可满足的最小集合x,根据最小集合x生成对应的不可行程序路径片段,将该不可行程序路径片段放入共享不可行路径池i中;若smt约束求解器可解,则说明该潜在程序路径为能够到达用户所输入代码指定位置的可达路径,结束代码验证。

对潜在路径分析过程的输入是找出潜在路径过程所输出的并存储于并行任务池t中的潜在程序路径和流程控制状态图。输出是得到的不可行程序路径片段。不可行程序路径本说明书简称为不可行路径,表示不可能达到验证目标的程序路径片段。输出得到的不可行程序路径片段存储于共享不可行路径池i中。

对潜在路径分析过程本发明中是由线程处理的过程。每个线程所处理的对潜在路径分析过程对应并行任务池t中的一条潜在程序路径。并行任务池t中k条潜在程序路径对应k个线程,也就是,根据并行任务池t的最大路径数k构建包含k个线程的线程组,然后将并行任务池t中的每个潜在程序路径分别输入至线程组的各个线程中,由对应的线程进行smt求解。每个对潜在路径分析过程创建相应的线程后,多核心处理器将这些线程分别分配至处理器核心进行并行处理。本实施例的示例中,并行任务池t的最大路径数k为4,也就是,构建4个线程分别执行对潜在路径分析的过程提交由4个处理器核心并行执行。为便于说明,本说明书中,对潜在路径进行分析的线程简称为smt求解线程。smt求解线程包括两个步骤,第一个步骤即为前述的步骤s61,第二个步骤即为前述的步骤s62。

步骤s61中,根据所输入的潜在程序路径和流程控制状态图构建smt约束编码w具体可参照专利文献cn105808429a《一种面向线性约束代码的有界模型验证方法》、cn107180193a《一种将程序代码转换成数据约束的方法和装置》以及cn108694285a《一种分析组合线性混成自动机全局可达的方法和装置》。其实现的细节,本说明书不再赘述。

以前述并行任务池t中四条潜在路径为例,其中,第一条潜在程序路径为:s0^s1^s2^s3^s4^s5^s9^s1^s3^s10^s12^q0,其对应路径上的smt约束编码w如下所示:

x=0;

y=0;

nondet_int!=0;

y<10000;

x>5;

x’=x+1;

y’=y+1;

nondet_int’=0;

x’<0||y’>2;

同理,其他三条潜在程序路径s0^s1^s2^s3^s10^s12^q0、s0^s1^s2^s3^s10^s11^s12^q0、s0^s1^s2^s3^s4^s5^s9^s1^s2^s3^s10^s12^q0也可以分别得到其相应的smt约束编码w,本说明书不再详述。

上述四条潜在路径得到对应的smt约束编码w,输入至smt约束求解器进行smt约束求解。第一条潜在程序路径对应的smt约束编码w求解后,可以得到不可解的结论。当smt约束求解器不可解时,则使用smt求解器自带的功能获取不可解约束中的不可满足的最小集合x,由此第一条潜在程序路径可以得到的不可满足的最小集合x={x=0,x>5}。然后再根据该不可满足的最小集合x={x=0,x>5}生成对应的不可行程序路径片段为s0^s1^s2^s3^s4。该不可行程序路径片段被加入至共享不可行路径池i中。由此完成一个对潜在路径分析过程。

上述示例中,第一条潜在程序路径对应的smt约束编码w求解后,得到的是不可解的结论,由此可以输出不可行程序路径片段。若潜在程序路径对应的smt约束编码w求解后,得到的是可解的结论,这意味着验证目标可达,可达的路径即为当前线程所处理的潜在程序路径,由此完成程序代码验证。

上述四条潜在路径经对应的smt约束编码w求解后,都可以得到不可解的结论。由此,将输出四条相应的不可行程序路径片段至共享不可行路径池i中。结束后,再回到前述的找出潜在路径过程进行下一次迭代的过程,也就是前述步骤s7。通过上述迭代的过程,本发明最终可以得到验证目标是否可达的结论。若验证目标可达,则该结论最终会在对潜在路径分析过程可以判断得出,并结束迭代过程;若验证目标不可达,则该结论最终会在在找出潜在路径过程可以判断得出,并结束迭代过程。本实施例的示例中,最终得到的验证目标不可达,也就是,不存在路径能够在有界步数50以内到达第17行的__verifier_error函数,这也说明了图2的示例代码是安全的。

上述三个过程是本发明最基本的三个过程。为进一步提高代码验证效率,本实施例还增加了一个不可行路径剪枝过程。以前述四条潜在路径为例,假设其中第一条最先得出不可解的结论,由此得到不可行程序路径片段s0^s1^s2^s3^s4加入至共享不可行路径池i中。考虑第四条潜在路径s0^s1^s2^s3^s4^s5^s9^s1^s2^s3^s10^s12^q0,该潜在路径包含了前述第一条潜在路径得出的不可行程序路径片段s0^s1^s2^s3^s4。显而易见地,该潜在路径最后的结果肯定将得出不可解的结论,此时虽然第四条潜在路径还在其相应的线程进行着smt求解的过程,但该过程其实没有必要再进行下去,由此可以将该smt求解过程直接结束掉。这个过程本发明称之为不可行路径剪枝。不可行路径剪枝过程也就是前述的不可行路径剪枝步骤,用于:检测共享不可行路径池i中的不可行程序路径片段是否得到更新,若存在更新,则判断当前潜在程序路径是否包含新增的不可行程序路径片段;若当前潜在程序路径包含新增的不可行程序路径片段,则结束该潜在程序路径所对应的smt求解线程。

不可行路径剪枝过程可以在smt求解线程中实现,也可以通过独立的线程实现,或者还可以为每个smt求解线程配置不可行路径剪枝线程实现。

通过独立的线程实现不可行路径剪枝过程,也就是当前述对潜在路径分析过程后,启动该独立的线程以执行不可行路径剪枝过程。该线程中,实时检测共享不可行路径池i中的不可行程序路径片段是否得到更新;若存在更新,则将当前各个正在对潜在程序路径执行smt求解的线程挂起,然后判断当前各个对潜在程序路径执行smt求解的线程所对应的各个潜在程序路径是否包含新增的不可行程序路径片段,若其相应的潜在程序路径包含新增的不可行程序路径片段,则直接将该潜在程序路径所对应的smt求解线程结束,否则继续该smt求解线程的对潜在路径分析过程。

为每个smt求解线程配置不可行路径剪枝线程。也就是,每个不可行路径剪枝线程对应一个smt求解线程,并对应并行任务池t中一条潜在程序路径。在该不可行路径剪枝线程中,实时检测共享不可行路径池i中的不可行程序路径片段是否得到更新;若存在更新,则将其对应的smt求解线程挂起,然后判断其对应的潜在程序路径是否包含新增的不可行程序路径片段,若包含新增的不可行程序路径片段,则直接将其对应的smt求解线程结束,否则继续该smt求解线程的对潜在路径分析过程。

不可行路径剪枝过程在smt求解线程中实现,一般为通过smt求解器执行求解过程中回调函数执行其对应的不可行路径剪枝过程。

为简化“实时检测共享不可行路径池i中的不可行程序路径片段是否得到更新”的判断,本实施例中,共享不可行路径池i设有版本号,每个潜在程序路径也设有版本号。共享不可行路径池i的版本号在前述步骤s2中初始化为0。前述步骤s4中,每次将潜在程序路径加入至并行任务池t时,该潜在程序路径的版本号设为共享不可行路径池i的版本号。在前述步骤s62中,将不可行程序路径片段放入共享不可行路径池i时,递增共享不可行路径池i的版本号。由此,“检测共享不可行路径池i中的不可行程序路径片段是否得到更新”简化为判断当前潜在程序路径的版本号是否与当前共享不可行路径池i的版本号是否相同,若两者不相同,则表示共享不可行路径池i中的不可行程序路径片段存在更新。

“判断潜在程序路径是否包含新增的不可行程序路径片段”,本实施例中采用如下方法进行判断:获取共享不可行路径池i中新增的不可行程序路径片段,将其取反编码后与当前潜在程序路径对应的sat编码输入sat求解器,若此时sat求解器无解,则表示当前潜在程序路径包含新增的不可行程序路径片段。

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