一种漏洞检测方法及装置与流程

文档序号:17443455发布日期:2019-04-17 05:08阅读:168来源:国知局
一种漏洞检测方法及装置与流程

本发明属于计算机安全技术领域,尤其涉及一种漏洞检测方法及装置。



背景技术:

随着计算机技术的发展,计算机系统软件数量剧增,而在测试阶段无法对每个系统软件充分进行安全性测试以检测到系统漏洞,导致计算机系统存在安全隐患。同时,攻击者正尝试利用计算机系统程序代码的漏洞执行恶意操作,对计算机系统造成危害。

为了维护互联网及计算机系统的安全,需要对计算机系统进行漏洞检测。

现有技术提供的漏洞检测方法为采用字符串表征待检测程序源码,并与规则库中存储的漏洞片段进行字符串匹配,通过字符串匹配确定待检测程序源码中存在与漏洞片段相似度达到阈值的程序片段,则确定待检测程序源码中存在漏洞片段。但是,通过字符串匹配确定待检测程序源码中是否存在漏洞片段的检测结果准确性低。



技术实现要素:

有鉴于此,本发明的目的在于提供一种漏洞检测方法及装置,以解决现有通过字符串匹配的方法检测待检测程序源码中是否存在漏洞的检测结果准确性低的问题。

技术方案如下:

本发明提供一种漏洞检测方法,包括:

构建待检测程序源码的抽象语法树以及预置规则库中存储的每个漏洞片段的抽象语法树;

针对预置规则库中存储的每个漏洞片段,确定待检测程序源码的抽象语法树与该漏洞片段的抽象语法树之间的相似度;

判断待检测程序源码的抽象语法树与该漏洞片段的抽象语法树之间的相似度是否大于阈值;

若待检测程序源码的抽象语法树与该漏洞片段的抽象语法树之间的相似度大于阈值,则确定待检测程序源码中存在漏洞。

优选地,所述确定待检测程序源码的抽象语法树与该漏洞片段的抽象语法树之间的相似度包括:

获取待检测程序源码的抽象语法树的节点数量以及该漏洞片段的抽象语法树的节点数量;

判断待检测程序源码的抽象语法树的节点数量与该漏洞片段的抽象语法树的节点数量之差是否大于预设个数;

若判断待检测程序源码的抽象语法树的节点数量与该漏洞片段的抽象语法树的节点数量之差大于预设个数,则获取该漏洞片段的抽象语法树中的根节点;

针对该漏洞片段的抽象语法树中的每个根节点,分别在待检测程序源码的抽象语法树中查找与该漏洞片段的抽象语法树中该根节点匹配的根节点;

在待检测程序源码的抽象语法树中查找到匹配根节点后,逐级比较该匹配根节点下的每个子节点与该漏洞片段的抽象语法树中对应的根节点下的子节点,得到比较结果;

根据比较结果,确定待检测程序源码的抽象语法树与该漏洞片段的抽象语法树之间的相似度。

优选地,还包括:

若判断待检测程序源码的抽象语法树的节点数量与该漏洞片段的抽象语法树的节点数量之差大于预设个数,则分解待检测程序源码的抽象语法树以及该漏洞片段的抽象语法树,分别得到每个抽象语法树中包括的路径;

针对每个抽象语法树中分解得到的每条路径,分别根据每条路径上节点的语法信息计算该路径的哈希值;

根据每个抽象语法树中分解得到的所有路径的哈希值,计算待检测程序源码的抽象语法树与该漏洞片段的抽象语法树之间的相似度。

优选地,采用如下方法构建抽象语法树:

获取待构建程序中包括的文件;其中,所述待构建程序为待检测程序源码或预置规则库中存储的漏洞片段;

分别解析每个所述文件;

从每个所述文件的解析结果中获取函数信息;

根据函数信息提取函数片段,并将函数片段存储至函数文件中;

对所述函数文件进行解析后,根据对所述函数文件的解析结果构建该函数文件的抽象语法树,直至完成对所述待构建程序中包括的所有函数文件的抽象语法树的构建,得到所述待构建程序的抽象语法树。

优选地,还包括:

对得到的所述待构建程序的抽象语法树进行裁剪。

本发明还提供了一种漏洞检测装置,包括:

构建单元,用于构建待检测程序源码的抽象语法树以及预置规则库中存储的每个漏洞片段的抽象语法树;

相似度确定单元,用于针对预置规则库中存储的每个漏洞片段,确定待检测程序源码的抽象语法树与该漏洞片段的抽象语法树之间的相似度;

判断单元,用于判断待检测程序源码的抽象语法树与该漏洞片段的抽象语法树之间的相似度是否大于阈值;

漏洞确定单元,用于在所述判断单元确定待检测程序源码的抽象语法树与该漏洞片段的抽象语法树之间的相似度大于阈值,则确定待检测程序源码中存在漏洞。

优选地,所述相似度确定单元包括:

第一获取子单元,用于获取待检测程序源码的抽象语法树的节点数量以及该漏洞片段的抽象语法树的节点数量;

判断子单元,用于判断待检测程序源码的抽象语法树的节点数量与该漏洞片段的抽象语法树的节点数量之差是否大于预设个数;

第二获取子单元,用于若判断待检测程序源码的抽象语法树的节点数量与该漏洞片段的抽象语法树的节点数量之差大于预设个数,则获取该漏洞片段的抽象语法树中的根节点;

查找子单元,用于针对该漏洞片段的抽象语法树中的每个根节点,分别在待检测程序源码的抽象语法树中查找与该漏洞片段的抽象语法树中该根节点匹配的根节点;

比较子单元,用于在待检测程序源码的抽象语法树中查找到匹配根节点后,逐级比较该匹配根节点下的每个子节点与该漏洞片段的抽象语法树中对应的根节点下的子节点,得到比较结果;

确定子单元,用于根据比较结果,确定待检测程序源码的抽象语法树与该漏洞片段的抽象语法树之间的相似度。

优选地,所述相似度确定单元还包括:

分解子单元,用于若判断待检测程序源码的抽象语法树的节点数量与该漏洞片段的抽象语法树的节点数量之差大于预设个数,则分解待检测程序源码的抽象语法树以及该漏洞片段的抽象语法树,分别得到每个抽象语法树中包括的路径;

计算子单元,用于针对每个抽象语法树中分解得到的每条路径,分别根据每条路径上节点的语法信息计算该路径的哈希值;并根据每个抽象语法树中分解得到的所有路径的哈希值,计算待检测程序源码的抽象语法树与该漏洞片段的抽象语法树之间的相似度。

优选地,所述构建单元包括:

第三获取子单元,用于获取待构建程序中包括的文件;其中,所述待构建程序为待检测程序源码或预置规则库中存储的漏洞片段;

解析子单元,用于分别解析每个所述文件;

第四获取子单元,用于从每个所述文件的解析结果中获取函数信息;

存储子单元,用于根据函数信息提取函数片段,并将函数片段存储至函数文件中;

构建子单元,用于对所述函数文件进行解析后,根据对所述函数文件的解析结果构建该函数文件的抽象语法树,直至完成对所述待构建程序中包括的所有函数文件的抽象语法树的构建,得到所述待构建程序的抽象语法树。

优选地,还包括:

裁剪子单元,用于对得到的所述待构建程序的抽象语法树进行裁剪

与现有技术相比,本发明提供的上述技术方案具有如下优点:

从上述技术方案可知,本申请中分别构建待检测程序源码以及漏洞片段的抽象语法树,确定两个抽象语法树之间的相似度以确定待检测程序源码中是否存在漏洞。由于抽象语法树能够表征程序代码的细节以及结构信息,如变量、函数、关键词、操作之间的语法结构关系,因此利用抽象语法树表征待检测程序源码以及漏洞片段能够完整的表征待检测程序源码的语法结构关系以及漏洞片段的语法结构关系,避免了由于字符串仅能表征语法序列而不能表征语法结构关系导致语法信息缺失,进而导致相似度计算的结果准确性低,漏洞检测结果准确性低的问题产生。

附图说明

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

图1是本发明实施例提供的一种漏洞检测方法的流程图;

图2是本发明实施例提供的待构建程序的示意图;

图3是本发明实施例构建出的抽象语法树的示意图;

图4是本发明实施例提供的另一种漏洞检测方法的流程图;

图5是本发明实施例提供的一种漏洞检测装置的结构示意图。

具体实施方式

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

现有技术提供的漏洞检测方法为采用字符串表征待检测程序源码,并采用字符串表征规则库中存储的漏洞片段,采用字符串匹配方法确定表征待检测程序源码的字符串中是否存在与表征漏洞片段的字符串相匹配的字符串,若确定表征待检测程序源码的字符串中存在与表征漏洞片段的字符串相匹配的字符串,则确定待检测程序源码中存在漏洞片段。

由于待检测程序源码、漏洞片段中不仅包括程序代码序列,而且包括变量、函数、关键词、操作之间的语法关系。但是用字符串分别表征待检测程序源码以及漏洞片段,仅能够表征待检测程序源码中的程序代码序列以及漏洞片段中的程序代码序列,而不能表征出变量、函数、关键词、操作之间的语法关系。导致待检测程序源码以及漏洞片段的语法信息缺失,进而后续字符串匹配时的匹配结果不能准确反映出待检测程序源码以及漏洞片段之间的匹配度,从而存在漏洞检测的检测结果准确性低的问题。

针对此,本发明提供了一种漏洞检测方法,采用静态检测技术实现对程序源码中是否存在漏洞的检测。静态检测技术指的是将预先研究得到的漏洞片段存储至规则库中,并将待检测程序源码与规则库中漏洞片段依次匹配,若待检测程序源码中存在与规则库中漏洞片段匹配的可疑程序片段、过程或函数,则确定待检测程序源码中存在漏洞;否则,确定待检测程序源码中不存在漏洞。其中,静态检测技术具有良好的易用性和高可扩展性。

本实施例公开了一种漏洞检测方法,参见图1,该实施例包括以下步骤:

s101、构建待检测程序源码的抽象语法树以及预置规则库中存储的每个漏洞片段的抽象语法树;

漏洞片段包括程序片段、过程或函数;通过研究发现漏洞后,将漏洞片段存储至预置规则库中,并且可以更新预置规则库中的存储的内容,使得不断完善发现的漏洞片段。进一步完善对待检测程序源码的漏洞检测。

确定待检测程序源码后,构建待检测程序源码的抽象语法树。并构建预置规则库中存储的各个漏洞片段的抽象语法树。

s102、针对预置规则库中存储的每个漏洞片段,确定待检测程序源码的抽象语法树与该漏洞片段的抽象语法树之间的相似度;

待检测程序源码包括大量的程序代码片段,每个程序代码片段的抽象语法树为待检测程序源码的抽象语法树的子树。通过比对待检测程序源码的抽象语法树的子树与该漏洞片段的抽象语法树是否匹配,以确定待检测程序源码的抽象语法树与该漏洞片段的抽象语法树之间的相似度。

s103、判断待检测程序源码的抽象语法树与该漏洞片段的抽象语法树之间的相似度是否大于阈值;

若待检测程序源码的抽象语法树与该漏洞片段的抽象语法树之间的相似度大于阈值,则执行步骤s104;

若待检测程序源码的抽象语法树与该漏洞片段的抽象语法树之间的相似度小于或等于阈值,则确定待检测程序源码中不存在漏洞。

若待检测程序源码的抽象语法树与该漏洞片段的抽象语法树之间的相似度大于阈值,则确定待检测程序源码的抽象语法树中存在与该漏洞片段的抽象语法树相匹配的子树,子树对应的程序代码片段即为漏洞片段。

若待检测程序源码的抽象语法树与该漏洞片段的抽象语法树之间的相似度小于或等于阈值,则确定待检测程序源码的抽象语法树中不存在与该漏洞片段的抽象语法树相匹配的子树,待检测程序源码中不存在与该漏洞片段相匹配的程序代码片段,即待检测程序源码中不存在该漏洞片段。

无论确定待检测程序源码中是否存在该漏洞片段,进而确定待检测程序源码中是否存在漏洞,只要完成对待检测程序源码中是否存在该漏洞片段的检测后,继续执行对待检测程序源码中是否存在下一个漏洞片段的检测。直至依据预置规则库中存储的所有漏洞片段完成对待检测程序源码的漏洞检测。

s104、确定待检测程序源码中存在漏洞。

本实施例中通过判断待检测程序源码的抽象语法树与该漏洞片段的抽象语法树之间的相似度是否大于阈值,确定待检测程序源码中是否存在漏洞。不仅可以确定待检测程序源码中是否存在漏洞,而且根据待检测程序源码的抽象语法树中与漏洞片段的抽象语法树相似度大于阈值的子树,可以定位在程序代码数量巨大的待检测程序源码中漏洞的位置。

从上述技术方案可知,本实施例中分别构建待检测程序源码以及漏洞片段的抽象语法树,确定两个抽象语法树之间的相似度以确定待检测程序源码中是否存在漏洞。由于抽象语法树能够表征程序代码的细节以及结构信息,如变量、函数、关键词、操作之间的语法结构关系,因此利用抽象语法树表征待检测程序源码以及漏洞片段能够完整的表征待检测程序源码的语法结构关系以及漏洞片段的语法结构关系,避免了由于字符串仅能表征语法序列而不能表征语法结构关系导致语法信息缺失,进而导致相似度计算的结果准确性低,漏洞检测结果准确性低的问题产生。

下面详细介绍本发明中构建抽象语法树的方法,包括以下步骤:

步骤一、获取待构建程序中包括的文件;

所述待构建程序为待检测程序源码或预置规则库中存储的漏洞片段;分别构建待检测程序源码的抽象语法树以及漏洞片段的抽象语法树。其中,构建待检测程序源码的抽象语法树的方法与构建漏洞片段的抽象语法树的方法相同。

步骤二、分别解析每个所述文件;

对获取到的每个文件,利用clangastdump工具对该文件进行解析。

步骤三、从每个所述文件的解析结果中获取函数信息;

利用正则表达式从解析后的文件中提取函数信息,其中,函数信息包括函数名、函数起始行号和结束行号。

步骤四、根据函数信息提取函数片段,并将函数片段存储至函数文件中;

函数信息中,每个函数名分别对应一组函数起始行号和函数结束行号,表示该函数名对应的函数的程序代码的起始行号和结束行号。

针对每个函数名,根据对应的函数起始行号和函数结束行号,从文件的程序代码中提取函数程序片段,将提取到的该函数名的程序片段独立存储至该函数的函数文件中。

步骤五、对所述函数文件进行解析后,根据对所述函数文件的解析结果构建该函数文件的抽象语法树,直至完成对所述待构建程序中包括的所有函数文件的抽象语法树的构建,得到所述待构建程序的抽象语法树。

对每个函数文件,利用clangastdump工具进行解析,并利用libclang工具构建抽象语法树,直至完成对待构建程序中包括的所有函数文件的抽象语法树的构建,得到该待构建程序的抽象语法树。其中,待构建程序中可能包括多个文件,每个文件中可能包括多个函数,每个函数对应一个函数文件,通过对每个函数对应的函数文件构建抽象语法树,完成构建待构建程序的抽象语法树。

参见图2所示,为本发明中的待构建程序,如待检测程序源码;参见图3所示,为采用本发明的构建抽象语法树的方法构建出的抽象语法树的示意图。

采用抽象语法树表征待检测程序源码,相较于采用字符串表征待检测程序源码而言,抽象语法树能够表征该待检测程序源码的代码细节以及结构信息,如变量、函数、关键词、操作之间的语法关系。如图3所示,针对图2所示的几行程序代码构建的抽象语法树中节点数量多达50多个,导致对两个抽象语法树进行相似度计算时,存在计算量大的问题。

针对此,本发明中在构建出待检测程序源码的抽象语法树后,对得到的待构建程序的抽象语法树进行裁剪。具体为对抽象语法树中表示无用信息的节点进行裁剪,从而在不损失待检测程序源码的变量、函数、关键词、操作之间的语法关系的前提下,减小待检测程序源码的抽象语法树的节点数量。

表示无用信息的节点通常有以下几种类型:

(1)声明节点及子节点,如图2中的intn,intb的变量声明信息对应的节点;

(2)返回节点及子节点,如图2中的return0对应的节点;

(3)控制块退出节点及子节点,如break对应的节点;

(4)程序跳转相关的节点及子节点,如goto对应的节点;

(5)程序容错相关的节点及子节点,如try,catch等对应的节点。

通过对抽象语法树中存在的上述几种类型的节点进行裁剪,不仅减小了抽象语法树中节点的数量,提高了对两个抽象语法树之间相似度计算的工作效率,且对抽象语法树中表征的待检测程序源码的信息并无影响,不影响对漏洞检测的检测结果的准确性。

采用上述构建抽象语法树的方法,本实施例中还提供了另一种漏洞检测方法,相较于图1所示的漏洞检测方法,本实施例中详细描述了确定待检测程序源码的抽象语法树与漏洞片段的抽象语法树之间的相似度的方法。

参见图4所示,该实施例包括以下步骤:

s401、构建待检测程序源码的抽象语法树以及预置规则库中存储的每个漏洞片段的抽象语法树;

本实施例中步骤s401的实现方式与上一实施例中步骤s101的实现方式类似,此处不再赘述。

下面详细描述确定待检测程序源码的抽象语法树与漏洞片段的抽象语法树之间的相似度的方法。

s402、针对预置规则库中存储的每个漏洞片段,获取待检测程序源码的抽象语法树的节点数量以及该漏洞片段的抽象语法树的节点数量;

抽象语法树是由节点以及节点之间的路径构成的,分别获取待检测程序源码的抽象语法树中包括的节点数量以及漏洞片段的抽象语法树中包括的节点数量。如图3所示的抽象语法树,获取到抽象语法树中包括的节点数量为47个。

s403、判断待检测程序源码的抽象语法树的节点数量与该漏洞片段的抽象语法树的节点数量之差是否大于预设个数;

若判断待检测程序源码的抽象语法树的节点数量与该漏洞片段的抽象语法树的节点数量之差大于预设个数,则执行步骤s404;

若判断待检测程序源码的抽象语法树的节点数量与该漏洞片段的抽象语法树的节点数量之差大于预设个数,则执行步骤s408;

计算待检测程序源码的抽象语法树的节点数量以及漏洞片段的抽象语法树的节点数量之间的差值,通常情况下,待检测程序源码的抽象语法树中的节点数量大于漏洞片段的抽象语法树中的节点数量。

计算得到两个抽象语法树中的节点数量的差值后,判断两个抽象语法树中的节点数量的差值是否大于预设个数。

若判断待检测程序源码的抽象语法树的节点数量与该漏洞片段的抽象语法树的节点数量之差大于预设个数,表示待检测程序源码的抽象语法树的节点数量与该漏洞片段的抽象语法树的节点数量差别较大,通过执行步骤s404-s407实现利用子树匹配的方法确定两个抽象语法树之间的相似度。

若判断待检测程序源码的抽象语法树的节点数量与该漏洞片段的抽象语法树的节点数量之差小于或等于预设个数,表示待检测程序源码的抽象语法树的节点数量与该漏洞片段的抽象语法树的节点数量差别不大,通过执行步骤s408-s410实现利用基于哈希值的模糊相似度计算方法确定两个抽象语法树之间的相似度。

s404、获取该漏洞片段的抽象语法树中的根节点;

抽象语法树中包括根节点,根节点包括下级子节点,下级子节点又可以包括下级子节点。通过节点之间的级联关系形成了抽象语法树。

s405、针对该漏洞片段的抽象语法树中的每个根节点,分别在待检测程序源码的抽象语法树中查找与该漏洞片段的抽象语法树中该根节点匹配的根节点;

在待检测程序源码的抽象语法树中查找与漏洞片段的抽象语法树中的根节点相匹配的根节点。

s406、在待检测程序源码的抽象语法树中查找到匹配根节点后,逐级比较该匹配根节点下的每个子节点与该漏洞片段的抽象语法树中对应的根节点下的子节点,得到比较结果;

在待检测程序源码的抽象语法树中查找到与漏洞片段的抽象语法树中根节点相匹配的根节点后,针对待检测程序源码的抽象语法树中匹配的根节点,逐级比较该匹配的根节点下的每个子节点是否分别与漏洞片段的抽象语法树中该匹配的根节点下的每个子节点相同。得到两个抽象语法树中子节点相同的个数。

s407、根据比较结果,确定待检测程序源码的抽象语法树与该漏洞片段的抽象语法树之间的相似度,并跳转执行步骤s411;

根据两个抽象语法树中子节点相同的个数,确定待检测程序源码的抽象语法树与漏洞片段的抽象语法树之间的相似度。如,两个抽象语法树中相匹配的根节点下的所有子节点分别都相同,则认为在待检测程序源码的抽象语法树中,该相匹配的根节点以及该相匹配的根节点包括的全部子节点构成的子树与漏洞片段的抽象语法树相匹配。确定待检测程序源码的抽象语法树与该漏洞片段的抽象语法树之间的相似度为1。

如两个抽象语法树中相匹配的根节点下的所有子节点中只有一半相同,则确定待检测程序源码的抽象语法树与该漏洞片段的抽象语法树之间的相似度为0.5;

如两个抽象语法树中相匹配的根节点下的所有子节点全部不同,则确定待检测程序源码的抽象语法树与该漏洞片段的抽象语法树之间的相似度为0。

实际应用中,在待检测程序源码的抽象语法树中与漏洞片段的抽象语法树的根节点相匹配的根节点下,不存在与漏洞片段的抽象语法树的根节点下子节点相同的子节点,则继续在待检测程序源码的抽象语法树中其他节点中继续比较,确定是否存在与漏洞片段的抽象语法树的根节点下子节点相同的节点,直至遍历完待检测程序源码的抽象语法树,得到比较结果。比较结果为两个抽象语法树中子节点相同的个数。

s408、分解待检测程序源码的抽象语法树以及该漏洞片段的抽象语法树,分别得到每个抽象语法树中包括的路径;

抽象语法树由多条节点之间的路径构成。其中,路径指的是从根节点开始能够确定目标子节点的路径。针对待检测程序源码的抽象语法树以及漏洞片段的抽象语法树,分别按照路径分解为多条路径。

s409、针对每个抽象语法树中分解得到的每条路径,分别根据每条路径上节点的语法信息计算该路径的哈希值;

对分解得到的每条路径,依据路径上节点的语法信息计算该路径的哈希值。将每个抽象语法树被分解成的多条路径的哈希值组合在一起,构成哈希值集合,以利用哈希值集合表征该抽象语法树。

s410、根据每个抽象语法树中分解得到的所有路径的哈希值,计算待检测程序源码的抽象语法树与该漏洞片段的抽象语法树之间的相似度;

计算两个抽象语法树的哈希值集合之间的相似度,以计算得到待检测程序源码的抽象语法树与该漏洞片段的抽象语法树之间的相似度。

一种实现方式为采用公式(1)计算两个抽象语法树的哈希值集合之间的相似度。

其中,ta表示待检测程序源码的抽象语法树的哈希值集合;tv表示漏洞片段的抽象语法树的哈希值集合;|ta∩tv|表示ta与tv这两个集合交集的模,即ta表征的抽象语法树与tv表征的抽象语法树中相同节点的数量。s表示待检测程序源码的抽象语法树的哈希值集合与漏洞片段的抽象语法树的哈希值集合之间的相似度。

s411、判断待检测程序源码的抽象语法树与该漏洞片段的抽象语法树之间的相似度是否大于阈值;

若待检测程序源码的抽象语法树与该漏洞片段的抽象语法树之间的相似度大于阈值,则执行步骤s412;

若待检测程序源码的抽象语法树与该漏洞片段的抽象语法树之间的相似度小于或等于阈值,则确定待检测程序源码中不存在漏洞。

通过上述步骤s404-s407或s408-s410确定的两个抽象语法树之间的相似度为0-1之间的自然数。

假设设置的阈值为0.6,那么,若待检测程序源码的抽象语法树与该漏洞片段的抽象语法树之间的相似度为0.7,则确定待检测程序源码中存在漏洞;若待检测程序源码的抽象语法树与该漏洞片段的抽象语法树之间的相似度为0.5,则确定待检测程序源码中不存在漏洞。

s412、确定待检测程序源码中存在漏洞。

在本实施例中,在确定待检测程序源码中存在漏洞,定位待检测程序源码中漏洞的位置,并通知管理员,以进行后续操作。

从上述技术方案可知,本实施例中分别构建待检测程序源码以及漏洞片段的抽象语法树,确定两个抽象语法树之间的相似度以确定待检测程序源码中是否存在漏洞。由于抽象语法树能够表征程序代码的细节以及结构信息,如变量、函数、关键词、操作之间的语法结构关系,因此利用抽象语法树表征待检测程序源码以及漏洞片段能够完整的表征待检测程序源码的语法结构关系以及漏洞片段的语法结构关系,避免了由于字符串仅能表征语法序列而不能表征语法结构关系导致语法信息缺失,进而导致相似度计算的结果准确性低,漏洞检测结果准确性低的问题产生。

同时,相较于现有技术中采用字符串匹配的方式确定待检测程序源码与漏洞片段之间的相似度时,若采用精确匹配机制导致将与漏洞片段大体相同但仅存在稍微差异的待检测程序源码认为不存在漏洞片段,进而不能检测出待检测程序源码中存在的漏洞;若采用模糊匹配机制导致将与漏洞片段存在一些相同之处的待检测程序源码误认为是存在漏洞片段,进而存在较高的误检测率。本实施例中在待检测程序源码的抽象语法树的节点数量与该漏洞片段的抽象语法树的节点数量差别较大的情况下,利用子树匹配的方法确定两个抽象语法树之间的相似度,进而实现漏洞检测;在待检测程序源码的抽象语法树的节点数量与该漏洞片段的抽象语法树的节点数量差别不大的情况下,利用基于哈希值的模糊相似度计算方法确定两个抽象语法树之间的相似度,进而实现漏洞检测;避免了字符串匹配的方法确定待检测程序源码与漏洞片段之间的相似度,进而实现漏洞检测时存在的检测结果准确性低的问题。

对应上述实施例公开的漏洞检测方法,本实施例公开了一种漏洞检测装置,该漏洞检测装置结构示意图请参阅图5所示,本实施例中漏洞检测装置包括:

构建单元501、相似度确定单元502、判断单元503和漏洞确定单元504;

构建单元501,用于构建待检测程序源码的抽象语法树以及预置规则库中存储的每个漏洞片段的抽象语法树;

相似度确定单元502,用于针对预置规则库中存储的每个漏洞片段,确定待检测程序源码的抽象语法树与该漏洞片段的抽象语法树之间的相似度;

判断单元503,用于判断待检测程序源码的抽象语法树与该漏洞片段的抽象语法树之间的相似度是否大于阈值;

漏洞确定单元504,用于在所述判断单元确定待检测程序源码的抽象语法树与该漏洞片段的抽象语法树之间的相似度大于阈值,则确定待检测程序源码中存在漏洞。

从上述技术方案可知,本实施例中分别构建待检测程序源码以及漏洞片段的抽象语法树,确定两个抽象语法树之间的相似度以确定待检测程序源码中是否存在漏洞。由于抽象语法树能够表征程序代码的细节以及结构信息,如变量、函数、关键词、操作之间的语法结构关系,因此利用抽象语法树表征待检测程序源码以及漏洞片段能够完整的表征待检测程序源码的语法结构关系以及漏洞片段的语法结构关系,避免了由于字符串仅能表征语法序列而不能表征语法结构关系导致语法信息缺失,进而导致相似度计算的结果准确性低,漏洞检测结果准确性低的问题产生。

可选地,在本实施例中,相似度确定单元502包括:

第一获取子单元、判断子单元、第二获取子单元、查找子单元、比较子单元和确定子单元;

所述第一获取子单元,用于获取待检测程序源码的抽象语法树的节点数量以及该漏洞片段的抽象语法树的节点数量;

所述判断子单元,用于判断待检测程序源码的抽象语法树的节点数量与该漏洞片段的抽象语法树的节点数量之差是否大于预设个数;

所述第二获取子单元,用于若判断待检测程序源码的抽象语法树的节点数量与该漏洞片段的抽象语法树的节点数量之差大于预设个数,则获取该漏洞片段的抽象语法树中的根节点;

所述查找子单元,用于针对该漏洞片段的抽象语法树中的每个根节点,分别在待检测程序源码的抽象语法树中查找与该漏洞片段的抽象语法树中该根节点匹配的根节点;

所述比较子单元,用于在待检测程序源码的抽象语法树中查找到匹配根节点后,逐级比较该匹配根节点下的每个子节点与该漏洞片段的抽象语法树中对应的根节点下的子节点,得到比较结果;

所述确定子单元,用于根据比较结果,确定待检测程序源码的抽象语法树与该漏洞片段的抽象语法树之间的相似度。

可选地,在其他实施例中,相似度确定单元502还包括:

分解子单元和计算子单元;

所述分解子单元,用于若判断待检测程序源码的抽象语法树的节点数量与该漏洞片段的抽象语法树的节点数量之差大于预设个数,则分解待检测程序源码的抽象语法树以及该漏洞片段的抽象语法树,分别得到每个抽象语法树中包括的路径;

所述计算子单元,用于针对每个抽象语法树中分解得到的每条路径,分别根据每条路径上节点的语法信息计算该路径的哈希值;并根据每个抽象语法树中分解得到的所有路径的哈希值,计算待检测程序源码的抽象语法树与该漏洞片段的抽象语法树之间的相似度。

可选地,本实施例中构建单元包括:

第三获取子单元、解析子单元、第四获取子单元、存储子单元、构建子单元和裁剪子单元;

所述第三获取子单元,用于获取待构建程序中包括的文件;其中,所述待构建程序为待检测程序源码或预置规则库中存储的漏洞片段;

所述解析子单元,用于分别解析每个所述文件;

所述第四获取子单元,用于从每个所述文件的解析结果中获取函数信息;

所述存储子单元,用于根据函数信息提取函数片段,并将函数片段存储至函数文件中;

所述构建子单元,用于对所述函数文件进行解析后,根据对所述函数文件的解析结果构建该函数文件的抽象语法树,直至完成对所述待构建程序中包括的所有函数文件的抽象语法树的构建,得到所述待构建程序的抽象语法树;

所述裁剪子单元,用于对得到的所述待构建程序的抽象语法树进行裁剪。

本实施例中在待检测程序源码的抽象语法树的节点数量与该漏洞片段的抽象语法树的节点数量差别较大的情况下,利用子树匹配的方法确定两个抽象语法树之间的相似度,进而实现漏洞检测;在待检测程序源码的抽象语法树的节点数量与该漏洞片段的抽象语法树的节点数量差别不大的情况下,利用基于哈希值的模糊相似度计算方法确定两个抽象语法树之间的相似度,进而实现漏洞检测;避免了字符串匹配的方法确定待检测程序源码与漏洞片段之间的相似度,进而实现漏洞检测时存在的检测结果准确性低的问题。

本说明书中各个实施例采用递进的方式描述,每个实施例重点说明的都是与其他实施例的不同之处,各个实施例之间相同相似部分互相参见即可。对于实施例提供的装置而言,由于其与实施例提供的方法相对应,所以描述的比较简单,相关之处参见方法部分说明即可。

需要说明的是,在本文中,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者设备所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括所述要素的过程、方法、物品或者设备中还存在另外的相同要素。

对所公开的实施例的上述说明,使本领域技术人员能够实现或使用本发明。对这些实施例的多种修改对本领域技术人员来说将是显而易见的,本文中所定义的一般原理可以在不脱离本发明的精神或范围的情况下,在其它实施例中实现。因此,本发明将不会被限制于本文所示的这些实施例,而是要符合与本文所公开的原理和新颖特点相一致的最宽的范围。

以上所述仅是本发明的优选实施方式,应当指出,对于本技术领域的普通技术人员来说,在不脱离本发明原理的前提下,还可以做出若干改进和润饰,这些改进和润饰也应视为本发明的保护范围。

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