基于分块的大规模代码静态分析方法和系统转让专利

申请号 : CN202210887831.X

文献号 : CN115080985B

文献日 :

基本信息:

PDF:

法律信息:

相似专利:

发明人 : 张世琨高庆李玫孙基男陈哲

申请人 : 北京北大软件工程股份有限公司

摘要 :

本发明涉及一种基于分块的大规模代码静态分析方法和系统。其中方法包括:将大规模工程程序按照工程粒度需求进行分块;针对各块,构建值依赖模型,将块对应的值依赖子图存储到数据库中作持久化保存;分析各块的值依赖子图中的程序漏洞,构建块漏洞表;遍历各块漏洞表,将漏洞表内的漏洞分类为可信漏洞和不可信漏洞;分析不可信漏洞,根据当前值依赖子图中的漏洞与数据库中其他值依赖子图之间的关联性对子图进行拓展,获得根据漏洞完整化的拓展子图;分析所有拓展子图,验证已发现漏洞并检测是否包含新漏洞,将获取的结果与可信漏洞合并后输出。本发明适用于上亿行代码的静态代码分析,可以实现准确有效的分析。

权利要求 :

1.基于分块的大规模代码静态分析方法,其特征在于,包括:将工程程序数据按照工程粒度需求进行分块;

针对各所述块,构建值依赖模型,将所述块对应的值依赖子图存储到数据库中作持久化保存;

分析各所述块的值依赖子图中的程序漏洞,构建块漏洞表;

遍历各所述块漏洞表,将漏洞表内的漏洞分类为可信漏洞和不可信漏洞;

遍历分析各不可信漏洞,根据当前值依赖子图中的漏洞与数据库中其他值依赖子图之间的关联性对值依赖子图进行拓展,获得当前漏洞完整化的拓展子图;

分析所有拓展子图,验证已发现漏洞并检测所述拓展子图是否包含新漏洞,将获取的结果与可信漏洞合并后输出;

所述遍历分析各不可信漏洞,根据当前值依赖子图中的漏洞与数据库中其他值依赖子图之间的关联性对值依赖子图进行拓展,获得当前漏洞完整化的拓展子图,包括:对于当前值依赖子图中的漏洞,从数据库中获取与其相关联的所有值依赖子图,并选取与其关联性最高的值依赖子图与其所在值依赖子图合并;

对合并后的拓展子图,继续获取数据库中与该合并后的拓展子图所有相关联的值依赖子图,并选取关联性最高的值依赖子图与当前所述合并后的拓展子图合并,依此循环,获得最终拓展子图。

2.根据权利要求1所述的基于分块的大规模代码静态分析方法,其特征在于,所述工程粒度需求包括包粒度、文件粒度和函数粒度。

3.根据权利要求1所述的基于分块的大规模代码静态分析方法,其特征在于,所述将漏洞表内的漏洞分类为可信漏洞和不可信漏洞的方法为:若当前漏洞没有涉及到连向值依赖子图外部的依赖,则将当前漏洞视为可信漏洞,直接放入最终的漏洞结果序列中;否则,将当前漏洞视为不可信漏洞。

4.根据权利要求1所述的基于分块的大规模代码静态分析方法,其特征在于,所述关联性的计算方法包括:对于当前值依赖子图中的漏洞v本身赋予最高权重w0,对于当前拓展子图中与值依赖子图直接相连的漏洞v1赋予次高权重w1,对于当前拓展子图中与值依赖子图间接关联的漏洞v2、v3…vn,根据各间接关联的漏洞与值依赖子图的最短距离取权重w2、w3…wn,依此类推;

对于数据库中的任一值依赖子图g,其关联性分数P=w0*n0+w1*n1+w2*n2+ w3*n3+…+wn*nm,其中n0、n1、n2、n3…nm为值依赖子图g与漏洞v、v1、v2、v3…vn的关联数,其中m取1、

2、3…n;

根据关联性分数P,选出数据库中分数最高的值依赖子图合并入当前拓展子图;

重复以上两步,直到满足以下任一条件即终止迭代:

目前的拓展子图在数据库中没有任何相关联的值依赖子图;

拓展次数达到了设定的上限。

5.基于分块的大规模代码静态分析系统,其特征在于,包括:逻辑分块模块,将工程程序按照工程粒度需求进行分块;

数据模型构建模块,针对各所述块,构建值依赖模型,将所述块对应的值依赖子图存储到数据库中作持久化保存;

漏洞分析检测模块,分析各所述块的值依赖子图中的程序漏洞,构建块漏洞表;

漏洞判断模块,遍历各所述块漏洞表,将漏洞表内的漏洞分类为可信漏洞和不可信漏洞;

漏洞子图拓展模块,遍历分析各不可信漏洞,根据当前值依赖子图中的漏洞与数据库中其他值依赖子图之间的关联性对值依赖子图进行拓展,获得当前漏洞完整化的拓展子图;

漏洞输出模块,分析所有拓展子图,验证已发现漏洞并检测所述拓展子图是否包含新漏洞,将获取的结果与可信漏洞合并后输出;

所述遍历分析各不可信漏洞,根据当前值依赖子图中的漏洞与数据库中其他值依赖子图之间的关联性对值依赖子图进行拓展,获得当前漏洞完整化的拓展子图,包括:对于当前值依赖子图中的漏洞,从数据库中获取与其相关联的所有值依赖子图,并选取与其关联性最高的值依赖子图与其所在值依赖子图合并;

对合并后的拓展子图,继续获取数据库中与该合并后的拓展子图所有相关联的值依赖子图,并选取关联性最高的值依赖子图与当前所述合并后的拓展子图合并,依此循环,获得最终拓展子图。

6.电子设备,其特征在于,包括处理器、存储器及存储在所述存储器上并可在所述处理器上运行的计算机程序,所述计算机程序被所述处理器执行时实现如权利要求1至4中任一项所述的基于分块的大规模代码静态分析方法。

7.计算机可读存储介质,其特征在于,所述计算机可读存储介质上存储计算机程序,所述计算机程序被处理器执行时实现如权利要求1至4中任一项所述的基于分块的大规模代码静态分析方法。

说明书 :

基于分块的大规模代码静态分析方法和系统

技术领域

[0001] 本发明涉及数据分析技术领域,具体涉及一种基于分块的大规模代码静态分析方法、系统、电子设备及计算机可读存储介质。

背景技术

[0002] 静态程序分析技术可以在不执行程序的情况下,通过词法分析、语法分析、控制流和数据流分析等程序分析方法对源代码进行扫描和检测,并通过自动化的审查方法检测工程中的问题代码和潜在漏洞。其主要优势在于在开发阶段的早期就能够检测代码的规范性、安全性、可靠性以及可维护性,减弱了问题代码所带来的负面影响,节省了大量的时间和人力成本。与人工进行测试相比,静态程序分析能够覆盖到更多的程序可行路径,检测的结果更加全面;与动态分析方法相比,静态方法无需运行代码,不会因为编译环境等其他依赖因素而产生问题,也具有较高的执行速度和效率。如今,静态代码分析是一种具有广泛应用的质量保证技术,并且有许多成熟工具并适用于各种编程语言。但是,随着项目系统的不断更新和迭代,在实际应用场景下待检测的工程的体量正在逐步扩大,甚至可以达到上亿行的规模,这对传统的工具和静态程序分析方法带来了挑战,传统的静态程序分析方法由于无法表达指针操作、无法表达数值型变量定值适用关系、无法表示数组之间的定值使用关系等原因,无法实现对大规模工程代码进行准确有效的分析,使得分析结果存在较大误差。

发明内容

[0003] 针对现有技术的不足,本发明的目的在于解决上述背景技术中的至少一个技术问题,提供一种基于分块的大规模代码静态分析方法、系统、电子设备及计算机可读存储介质。
[0004] 为实现上述目的,本发明提供一种基于分块的大规模代码静态分析方法,包括:
[0005] 将工程程序按照工程粒度需求进行分块;
[0006] 针对各所述块,构建值依赖模型,将所述块对应的值依赖子图存储到数据库中作持久化保存;
[0007] 分析各所述块的值依赖子图中的程序漏洞,构建块漏洞表;
[0008] 遍历各所述块漏洞表,将漏洞表内的漏洞分类为可信漏洞和不可信漏洞;
[0009] 遍历分析各不可信漏洞,根据当前值依赖子图中的漏洞与数据库中其他值依赖子图之间的关联性对值依赖子图进行拓展,获得根据漏洞完整化的拓展子图;
[0010] 分析所有拓展子图,验证已发现漏洞并检测所述拓展子图是否包含新漏洞,将获取的结果与可信漏洞合并后输出。
[0011] 根据本发明的一个方面,所述工程粒度需求包括包粒度、文件粒度和函数粒度。
[0012] 根据本发明的一个方面,所述将漏洞表内的漏洞分类为可信漏洞和不可信漏洞的方法为:
[0013] 若当前漏洞没有涉及到连向值依赖子图外部的依赖,则将当前漏洞视为可信漏洞,直接放入最终的漏洞结果序列中;否则,将当前漏洞视为不可信漏洞。
[0014] 根据本发明的一个方面,所述遍历分析各不可信漏洞,根据当前值依赖子图中的漏洞与数据库中其他值依赖子图之间的关联性对值依赖子图进行拓展,获得当前漏洞完整化的拓展子图,包括:
[0015] 对于当前值依赖子图中的漏洞,从数据库中获取与其相关联的所有值依赖子图,并选取与其关联性最高的值依赖子图与其所在值依赖子图合并;
[0016] 对合并后的拓展子图,继续获取数据库中与该合并后的拓展子图所有相关联的值依赖子图,并选取关联性最高的值依赖子图与当前所述合并后的拓展子图合并,依此循环,获得最终拓展子图。
[0017] 根据本发明的一个方面,所述关联性的计算方法包括:
[0018] 对于当前值依赖子图中的漏洞v本身赋予最高权重w0,对于当前拓展子图中与值依赖子图直接相连的漏洞v1赋予次高权重w1,对于当前拓展子图中与值依赖子图间接关联的漏洞v2、v3…vn,根据各间接关联的漏洞与值依赖子图的最短距离取权重w2、w3…wn,依此类推;
[0019] 对于数据库中的任一值依赖子图g,其关联性分数P=w0*n0+w1*n1+w2*n2+w3*n3+…+wn*nm,其中n0、n1、n2、n3…nm为值依赖子图g与漏洞v、v1、v2、v3…vn的关联数,其中m取1、2、3…n;
[0020] 根据关联性分数P,选出数据库中分数最高的值依赖子图合并入当前拓展子图;
[0021] 重复以上两步,直到满足以下任一条件即终止迭代:
[0022] 目前的拓展子图在数据库中没有任何相关联的值依赖子图;
[0023] 拓展次数达到了设定的上限。
[0024] 为实现上述目的,本发明还提供一种基于分块的大规模代码静态分析系统,包括:
[0025] 逻辑分块模块,将工程程序按照工程粒度需求进行分块;
[0026] 数据模型构建模块,针对各所述块,构建值依赖模型,将所述块对应的值依赖子图存储到数据库中作持久化保存;
[0027] 漏洞分析检测模块,分析各所述块的值依赖子图中的程序漏洞,构建块漏洞表;
[0028] 漏洞判断模块,遍历各所述块漏洞表,将漏洞表内的漏洞分类为可信漏洞和不可信漏洞;
[0029] 漏洞子图拓展模块,遍历分析各不可信漏洞,根据当前值依赖子图中的漏洞与数据库中其他值依赖子图之间的关联性对值依赖子图进行拓展,获得当前漏洞完整化的拓展子图;
[0030] 漏洞输出模块,分析所有拓展子图,验证已发现漏洞并检测所述拓展子图是否包含新漏洞,将获取的结果与可信漏洞合并后输出。
[0031] 为实现上述目的,本发明还提供一种电子设备,包括处理器、存储器及存储在所述存储器上并可在所述处理器上运行的计算机程序,所述计算机程序被所述处理器执行时实现如上所述的基于分块的大规模代码静态分析方法。
[0032] 为实现上述目的,本发明还提供一种计算机可读存储介质,所述计算机可读存储介质上存储计算机程序,所述计算机程序被处理器执行时实现如上所述的基于分块的大规模代码静态分析方法。
[0033] 根据本发明的方案,基于分块的大规模代码静态分析方法能够适用于上亿行代码的静态代码分析,即可以实现对大规模工程代码进行准确有效的分析,使得分析结果准确无误。而且由本发明的方案可知,本发明采用的是在传统直流模型上改进后的值依赖模型,该模型优化了传统模型上无法表达指针操作、无法表达数值型变量定值适用关系、无法表示数组之间的定值使用关系等问题。值依赖分析技术以程序源代码作为输入、采用数据流分析、指向分析、区间分析等多种分析技术给出每个变量的值的依赖关系,并以此为基础构建程序表达模型。值依赖分析方法是一种解决跨函数问题的静态分析求精技术,其改进了值流模型的不足,使得模型表达语义更加丰富,模型表达能力更加强大,从而使分析结果更加准确。

附图说明

[0034] 图1示意性表示根据本发明的一种实施方式的基于分块的大规模代码静态分析方法的流程图;
[0035] 图2示意性表示根据本发明的一种实施方式的基于分块的大规模代码静态分析系统的结构框图;
[0036] 图3表示当前值依赖子图中的漏洞直接关联其他值依赖子图的关系图;
[0037] 图4表示拓展子图与其他值依赖子图的依赖关系图;
[0038] 图5表示新拓展子图与其他值依赖子图的依赖关系图。

具体实施方式

[0039] 现在将参照示例性实施例来论述本发明的内容,应当理解,论述的实施例仅是为了使得本领域普通技术人员能够更好地理解且因此实现本发明的内容,而不是暗示对本发明的范围的任何限制。
[0040] 如本文中所使用的,术语“包括”及其变体要被解读为意味着“包括但不限于”的开放式术语。术语“基于”要被解读为“至少部分地基于”,术语“一个实施例”和“一种实施例”要被解读为“至少一个实施例”。
[0041] 图1示意性表示根据本发明的一种实施方式的基于分块的大规模代码静态分析方法的流程图。如图1所示,根据本发明的基于分块的大规模代码静态分析方法,包括以下步骤:
[0042] 将大规模工程程序按照工程粒度需求进行分块;
[0043] 针对各所述块,构建值依赖模型,将所述块对应的值依赖子图存储到数据库中作持久化保存;
[0044] 分析各所述块的值依赖子图中的程序漏洞,构建块漏洞表;
[0045] 遍历各所述块漏洞表,将漏洞表内的漏洞分类为可信漏洞和不可信漏洞;
[0046] 遍历分析各不可信漏洞,根据当前值依赖子图中的漏洞与数据库中其他值依赖子图之间的关联性对值依赖子图进行拓展,获得根据漏洞完整化的拓展子图;
[0047] 分析所有拓展子图,验证已发现漏洞并检测拓展子图是否包含新漏洞,将获取的结果与可信漏洞合并后输出。
[0048] 根据本发明的一种实施方式,上述逻辑分块方式可以根据实际工程需求分成不同的粒度:如包粒度(按照包的结构层次对项目进行逻辑分块),文件粒度(每个文件为一个独立逻辑块),函数粒度(每个函数为一个独立逻辑块)等等。
[0049] 进一步地,针对上一步中分出来的每一块,构建值依赖模型,将其对应的值依赖子图存储到数据库中作持久化保存。并对每一块作独立的程序漏洞分析,检测块内漏洞并构建块漏洞表。
[0050] 进一步地,遍历每个块的块漏洞表,对每个漏洞作可信性分析:
[0051] 对于当前漏洞,若其没有涉及到连向值依赖子图外部的依赖,则将该漏洞视为可信漏洞,直接放入最终的漏洞结果序列中;
[0052] 在漏洞涉及相关值中(在漏洞分析过程中,可以观察到当前漏洞涉及到值依赖图中哪些变量值,进一步去判断漏洞涉及到的这些值是否存在当前值依赖子图到值依赖子图外部的依赖关系),若存在至少一条从值依赖子图内到值依赖子图外部的依赖关系,则将该漏洞视为不可信的。
[0053] 进一步地,针对上一步中的不可信的漏洞,进行补充分析。根据当前值依赖子图中的漏洞与其他值依赖子图之间的关联性对子图进行扩展,获得根据漏洞完整化的子图,即拓展子图。
[0054] 拓展方式如下:
[0055] 对于当前值依赖子图,从数据库中获取其所有相关联的值依赖子图,并选取与其关联性最高(即两个子图之间的依赖边数最多)的值依赖子图与当前子图合并;
[0056] 对合并后的值依赖子图,继续获取数据库中与该合并后的拓展子图所有相关联的值依赖子图,并选取关联性最高的值依赖子图与当前拓展子图合并,为了确保选取的值依赖子图是尽量与漏洞所在值依赖子图相关联的,本发明中对关联性的计算如下:
[0057] 对于当前值依赖子图中的漏洞v本身赋予最高权重w0,对于当前拓展子图中与值依赖子图直接相连的漏洞v1赋予次高权重w1,对于当前拓展子图中与值依赖子图间接关联的漏洞v2、v3…vn,根据各间接关联的漏洞与值依赖子图的最短距离取权重w2、w3…wn,依此类推,即与值依赖子图越接近的漏洞权重越高;
[0058] 对于数据库中的任一值依赖子图g,其关联性分数P=w0*n0+w1*n1+w2*n2+w3*n3+…+wn*nm,其中n0、n1、n2、n3…nm为值依赖子图g与漏洞v、v1、v2、v3…vn的关联数,其中m取1、2、3…n;
[0059] 根据关联性分数P,选出库中分数最高的值依赖子图合并入当前扩展子图;
[0060] 重复上述两步,直到满足以下任一条件即终止迭代:
[0061] 目前的拓展子图在库中没有任何相关联的值依赖子图,即目前的拓展子图独立于库中的其他部分代码。
[0062] 拓展次数达到了设定的上限(如10次)。由于上亿行系统中某一值依赖子图涉及到的范围可能会非常广。为了防止值依赖子图过大影响检测效率,可以根据资源和时间上的需求设定最大拓展子图大小或最多拓展次数,以限制待检测部分的范围。
[0063] 根据本发明的上述方案,本发明的基于分块的大规模代码静态分析方法能够适用于上亿行代码的静态代码分析,即可以实现对大规模工程代码进行准确有效的分析,使得分析结果准确无误。而且由以上方案可知,本发明采用的是在传统直流模型上改进后的值依赖模型,该模型优化了传统模型上无法表达指针操作、无法表达数值型变量定值适用关系、无法表示数组之间的定值使用关系等问题。值依赖分析技术以程序源代码作为输入、采用数据流分析、指向分析、区间分析等多种分析技术给出每个变量的值的依赖关系,并以此为基础构建程序表达模型。值依赖分析方法是一种解决跨函数问题的静态分析求精技术,其改进了值流模型的不足,使得模型表达语义更加丰富,模型表达能力更加强大,从而使分析结果更加准确。
[0064] 为实现本发明的目的,本发明还提供一种基于分块的大规模代码静态分析系统,结构框图如图2所示,具体包括:
[0065] 逻辑分块模块,将大规模工程程序按照工程粒度需求进行分块;
[0066] 数据模型构建模块,针对上述各块,构建值依赖模型,将块对应的值依赖子图存储到数据库中作持久化保存;
[0067] 漏洞分析检测模块,分析各所述块的值依赖子图中的程序漏洞,构建块漏洞表;
[0068] 漏洞判断模块,遍历各所述块漏洞表,将漏洞表内的漏洞分类为可信漏洞和不可信漏洞;
[0069] 漏洞子图拓展模块,遍历分析各不可信漏洞,根据当前值依赖子图中的漏洞与数据库中其他值依赖子图之间的关联性对值依赖子图进行拓展,获得当前漏洞完整化的拓展子图;
[0070] 漏洞输出模块,分析所有拓展子图,验证已发现漏洞并检测拓展子图是否包含新漏洞,将获取的结果与可信漏洞合并后输出。
[0071] 根据本发明的一种实施方式,上述逻辑分块方式可以根据实际工程需求分成不同的粒度:如包粒度(按照包的结构层次对项目进行逻辑分块),文件粒度(每个文件为一个独立逻辑块),函数粒度(每个函数为一个独立逻辑块)等等。
[0072] 进一步地,针对上一步中分出来的每一块,构建值依赖模型,将其对应的值依赖子图存储到数据库中作持久化保存。并对每一块作独立的程序漏洞分析,检测块内漏洞并构建块漏洞表。
[0073] 进一步地,遍历每个块的块漏洞表,对每个漏洞作可信性分析:
[0074] 对于当前漏洞,若其没有涉及到连向值依赖子图外部的依赖,则将该漏洞视为可信漏洞,直接放入最终的漏洞结果序列中;
[0075] 在漏洞涉及相关值中,若存在至少一条从值依赖子图内到值依赖子图外部的依赖关系,则将该漏洞视为不可信的。
[0076] 进一步地,针对上一步中的不可信的漏洞,进行补充分析。根据当前值依赖子图中的漏洞与其他值依赖子图之间的关联性对值依赖子图进行扩展,获得根据漏洞完整化的子图,即拓展子图。
[0077] 拓展方式如下:
[0078] 对于当前值依赖子图,从数据库中获取其所有相关联的值依赖子图,并选取与其关联性最高(即两个值依赖子图之间的依赖边数最多)的值依赖子图与当前值依赖子图合并;
[0079] 对合并后的值依赖子图,继续获取数据库中与该合并后的拓展子图所有相关联的值依赖子图,并选取关联性最高的值依赖子图与当前拓展子图合并,为了确保选取的值依赖子图是尽量与漏洞所在值依赖子图相关联的,本发明中对关联性的计算如下:
[0080] 对于当前值依赖子图中的漏洞v本身赋予最高权重w0,对于当前拓展子图中与值依赖子图直接相连的漏洞v1赋予次高权重w1,对于当前拓展子图中与值依赖子图间接关联的漏洞v2、v3…vn,根据各间接关联的漏洞与值依赖子图的最短距离取权重w2、w3…wn,依此类推,即与值依赖子图越接近的漏洞权重越高;
[0081] 对于数据库中的任一值依赖子图g,其关联性分数P=w0*n0+w1*n1+w2*n2+w3*n3+…+wn*nm,其中n0、n1、n2、n3…nm为值依赖子图g与漏洞v、v1、v2、v3…vn的关联数,其中m取1、2、3…n;
[0082] 根据关联性分数P,选出库中分数最高的值依赖子图合并入当前扩展子图;
[0083] 重复上述两步,直到满足以下任一条件即终止迭代:
[0084] 目前的拓展子图在库中没有任何相关联的值依赖子图,即目前的拓展子图独立于库中的其他部分代码。
[0085] 拓展次数达到了设定的上限(如10次)。由于上亿行系统中某一值依赖子图涉及到的范围可能会非常广。为了防止值依赖子图过大影响检测效率,可以根据资源和时间上的需求设定最大拓展子图大小或最多拓展次数,以限制待检测部分的范围。
[0086] 根据本发明的上述方案,本发明的基于分块的大规模代码静态分析系统能够适用于上亿行代码的静态代码分析,即可以实现对大规模工程代码进行准确有效的分析,使得分析结果准确无误。而且由以上方案可知,本发明采用的是在传统直流模型上改进后的值依赖模型,该模型优化了传统模型上无法表达指针操作、无法表达数值型变量定值适用关系、无法表示数组之间的定值使用关系等问题。值依赖分析技术以程序源代码作为输入、采用数据流分析、指向分析、区间分析等多种分析技术给出每个变量的值的依赖关系,并以此为基础构建程序表达模型。值依赖分析方法是一种解决跨函数问题的静态分析求精技术,其改进了值流模型的不足,使得模型表达语义更加丰富,模型表达能力更加强大,从而使分析结果更加准确。
[0087] 为实现本发明的目的,本发明还提供一种电子设备,包括处理器、存储器及存储在存储器上并可在处理器上运行的计算机程序,计算机程序被处理器执行时实现上述基于分块的大规模代码静态分析方法。
[0088] 为实现本发明的目的,本发明还提供一种计算机可读存储介质,计算机可读存储介质上存储计算机程序,计算机程序被处理器执行时实现上述基于分块的大规模代码静态分析方法。
[0089] 根据本发明的上述方案,以下结合附图以具体实施例的方式说明本发明的上述方案,具体如下:
[0090] 假设将分块粒度设定为文件级别,所输入的大规模工程系统共有文件20个,分别定义为f1,f2,…,f20。检测过程如下:
[0091] 对每一块构建值依赖子图,并进行漏洞分析。
[0092] 通过相关工具,对文件f1 f20依次进行分析,生成值依赖子图g1 g20,并依次持久~ ~化保存于子图库G中。对于每一个值依赖子图,独立地进行漏洞分析,假设检测到的漏洞情况如表1所示。
[0093]
[0094] 表1
[0095] 对每个漏洞文件的漏洞进行可信性分析,即看当前漏洞与其他块之间是否有依赖关系;
[0096] 对每个漏洞依次进行分析,发现v1,v2,v3,v5,v8漏洞仅与值依赖子图内部相关,无外部依赖关系,则把这5个漏洞视为可信漏洞。
[0097] 剩下的漏洞被视作不可信,需要进行进一步分析。
[0098] 对于每一个不可信漏洞,根据规则和权重对值依赖子图进行扩展;
[0099] 设拓展次数上限为4,权重分别设置为:w0=8,w1=4,w2=2,w3=1。
[0100] 对于值依赖子图g3中的漏洞v4,其直接关联到的其他值依赖子图如图3所示,由于值依赖子图g2与当前漏洞关联最多,将值依赖子图g2与当前值依赖子图进行合并生成拓展子图g3*g2。
[0101] 对于拓展子图g3*g2,与其他值依赖子图的依赖关系如图4所示。通过分别计算候选值依赖子图的分数P:
[0102] P(g4)=4*8+5*4=52;P(g5)=6*8=48;
[0103] P(g11)=5*8=40;P(g15)=15*4=60;
[0104] 其中,各式中被乘数为值依赖子图与漏洞的关联数。
[0105] 因此应该选择值依赖子图g15与当前的拓展子图合并,获得新的拓展子图g3*g2*g15
[0106] 针对新的拓展子图g3*g2*g15,其与库中其他值依赖子图的关系如图5所示。边上的值表示两个值依赖子图之间的依赖关系数。通过分别计算候选值依赖子图的分数P:
[0107] P(g4)=4*8+5*4+2*2=56;P(g5)=6*8=48;
[0108] P(g11)=5*8=40;P(g17)=10*2=20;
[0109] 其中,各式中被乘数为值依赖子图与漏洞的关联数。
[0110] 因此应该选择值依赖子图g4与当前的拓展子图合并,获得新的拓展子图g3*g2*g11*g4;
[0111] 重复以上步骤,直到迭代次数达到4次,或无其他值依赖子图与当前的拓展子图相关联。得到最终的拓展子图gfinal=g3*g2*g11*g4*g5。
[0112] 对所有拓展子图进行漏洞检测和分析;
[0113] 对所有gfinal再次进行分析和检测,验证现有漏洞,并检测是否包含新漏洞。
[0114] 最后将所有验证过的漏洞和新发现的漏洞汇集,得到最终的漏洞序列。如:验证不可信漏洞v4,v6,v7,v9中,v4和v9为真实漏洞,并在拓展子图中发现新漏洞v10,v11。
[0115] 将最终漏洞结果汇集输出
[0116] 由步骤2可以获得可信漏洞{v1,v2,v3,v5,v8},存在于独立的值依赖子图内。
[0117] 由步骤4可以获得验证后的不可信漏洞{v4,v9},以及在拓展子图中发现的新漏洞{v10,v11}。
[0118] 那么最终漏洞集合为{v1,v2,v3,v4,v5,v8,v9,v10,v11}。
[0119] 本领域普通技术人员可以意识到,结合本文中所公开的实施例描述的模块及算法步骤,能够以电子硬件、或者计算机软件和电子硬件的结合来实现。这些功能究竟以硬件还是软件方式来执行,取决于技术方案的特定应用和设计约束条件。专业技术人员可以对每个特定的应用来使用不同方法来实现所描述的功能,但是这种实现不应认为超出本发明的范围。
[0120] 所属领域的技术人员可以清楚地了解到,为描述的方便和简洁,上述描述的装置和设备的具体工作过程,可以参考前述方法实施例中的对应过程,在此不再赘述。
[0121] 在本申请所提供的实施例中,应该理解到,所揭露的装置和方法,可以通过其它的方式实现。例如,以上所描述的装置实施例仅仅是示意性的,例如,所述模块的划分,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式,例如多个模块或组件可以结合或者可以集成到另一个系统,或一些特征可以忽略,或不执行。另一点,所显示或讨论的相互之间的耦合或直接耦合或通信连接可以是通过一些接口,装置或模块的间接耦合或通信连接,可以是电性,机械或其它的形式。
[0122] 所述作为分离部件说明的模块可以是或者也可以不是物理上分开的,作为模块显示的部件可以是或者也可以不是物理模块,即可以位于一个地方,或者也可以分布到多个网络模块上。可以根据实际的需要选择其中的部分或者全部模块来实现本发明实施例方案的目的。
[0123] 另外,在本发明实施例中的各功能模块可以集成在一个处理模块中,也可以是各个模块单独物理存在,也可以两个或两个以上模块集成在一个模块中。
[0124] 所述功能如果以软件功能模块的形式实现并作为独立的产品销售或使用时,可以存储在一个计算机可读取存储介质中。基于这样的理解,本发明的技术方案本质上或者说对现有技术做出贡献的部分或者该技术方案的部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行本发明各个实施例节能信号发送/接收的方法的全部或部分步骤。而前述的存储介质包括:U盘、移动硬盘、ROM、RAM、磁碟或者光盘等各种可以存储程序代码的介质。
[0125] 以上描述仅为本申请的较佳实施例以及对所运用技术原理的说明。本领域技术人员应当理解,本申请中所涉及的发明范围,并不限于上述技术特征的特定组合而成的技术方案,同时也应涵盖在不脱离所述发明构思的情况下,由上述技术特征或其等同特征进行任意组合而形成的其它技术方案。例如上述特征与本申请中公开的(但不限于)具有类似功能的技术特征进行互相替换而形成的技术方案。
[0126] 应理解,本发明的发明内容及实施例中各步骤的序号的大小并不绝对意味着执行顺序的先后,各过程的执行顺序应以其功能和内在逻辑确定,而不应对本发明实施例的实施过程构成任何限定。