掌桥专利:专业的专利平台
掌桥专利
首页

基于克隆代码的漏洞检测方法、装置和计算机设备

文献发布时间:2024-04-18 19:58:26


基于克隆代码的漏洞检测方法、装置和计算机设备

技术领域

本申请涉及网络安全技术领域,特别是涉及一种基于克隆代码的漏洞检测方法、装置和计算机设备。

背景技术

软件漏洞是各种安全风险的根本原因。一旦漏洞被恶意攻击利用,将极大地危及系统的安全,并可能导致灾难性损失。随着开源软件(OSS)生态系统的规模的不断增长,基于开源软件的代码克隆——在软件系统内或之间复制和粘贴的代码片段——也在不断增加。尽管代码克隆可以加速软件开发过程,但它经常会严重影响软件的安全性,因为漏洞很容易通过代码克隆传播。随着OSS的增长,这些易受攻击的代码克隆也在增加,可能会污染许多系统。尽管研究人员几十年来一直在尝试检测代码克隆,通过检测带有漏洞的克隆代码来判断代码中可能存在的漏洞。

目前主要的方法还是针对漏洞库中给出的漏洞代码进行检测,通过匹配漏洞代码指纹这样的方法存在两个问题,一是存在代码混淆的情况导致匹配失败,二是存在代码漏洞已经被打过补丁导致误报。随后的研究者提出使用代码上下文和补丁指纹结合的方法来检测克隆的漏洞代码,但是仍然不能解决一些由旧代码分支克隆造成的漏洞继承问题,这种情况下,补丁指纹往往不能很好对齐到旧版本代码分支上的克隆代码,造成检测方法失效。

发明内容

基于此,有必要针对上述技术问题,提供一种能够提高检测准确度的基于克隆代码的漏洞检测方法、装置和计算机设备。

第一方面,本申请提供了一种基于克隆代码的漏洞检测方法。该方法包括:

获取漏洞信息及漏洞信息对应的代码片段;代码片段包括历史版本的代码片段和补丁版本的代码片段;

提取代码片段中的函数代码,并基于函数代码进行对比特征提取;

根据对比特征生成代码指纹,并将代码指纹保存在漏洞代码指纹库中;

获取目标软件代码,基于漏洞代码指纹库进行目标软件代码匹配,根据匹配结果生成检测结果。

在其中一个实施例中,提取代码片段中的函数代码包括:

检索代码片段,并分别提取历史版本代码漏洞函数、补丁版本代码漏洞函数、补丁后对应函数的代码片段。

在其中一个实施例中,基于函数代码进行对比特征提取包括:

从代码片段中提取在补丁版本的代码片段中被删除,并在历史版本代码漏洞函数和补丁版本代码漏洞函数中都存在的代码行,获取漏洞代码行;

从代码片段中提取在补丁版本的代码片段中被添加,并在历史版本代码漏洞函数和补丁版本代码漏洞函数中都不存在的代码行,获取补丁代码行;

从代码片段中提取与历史版本代码漏洞函数和补丁版本代码漏洞函数具有直接控制与数据依赖关系,并在历史版本代码漏洞函数和补丁版本代码漏洞函数中都存在的代码行,获取漏洞依赖的代码行;

从补丁后对应函数的代码片段中提取与补丁后对应函数的代码片段具有直接控制与数据依赖关系的代码行,获取补丁依赖的代码行;

从代码片段中提取从函数入口到漏洞代码行的控制流直接相关的条件语句,获取控制流路径代码行。

在其中一个实施例中,根据对比特征生成代码指纹,并将代码指纹保存在漏洞代码指纹库中包括:

对对比特征进行标准化;

根据标准化后的漏洞代码行、漏洞依赖的代码行和控制流路径代码行,获取漏洞指纹,根据标准化后的补丁代码行和补丁依赖的代码行获取补丁指纹;漏洞指纹和补丁指纹均由字符串长度和哈希值表示;将漏洞指纹、补丁指纹和对比特征均保存在漏洞代码指纹库中。

在其中一个实施例中,获取目标软件代码,基于漏洞代码指纹库进行目标软件代码匹配包括:

检索目标软件代码,并提取目标软件代码中的每一个函数代码片段,获取目标函数代码;目标代码指纹由字符串长度和哈希值表示;

对目标函数代码进行标准化;

根据标准化后的目标函数代码生成目标代码指纹;

从漏洞代码指纹库中提取与目标软件代码同种语言的漏洞指纹和补丁指纹;

将目标代码指纹与提取的漏洞指纹和补丁指纹进行匹配,获取匹配结果。

在其中一个实施例中,将目标代码指纹与提取的漏洞指纹和补丁指纹进行匹配,获取匹配结果包括:

基于字符串长度进行匹配,根据与目标代码指纹具有相同字符串长度的漏洞指纹和补丁指纹,获取第一指纹;

基于哈希值对目标代码指纹和第一指纹进行匹配,若目标函数代码同时满足三个预设条件,则匹配成功;三个预设条件为:目标代码指纹中的所有代码行都包含在漏洞指纹中、目标代码指纹中的任何代码行都不包含在补丁指纹中、目标函数代码的语法与历史版本代码漏洞函数或补丁版本代码漏洞函数相似度大于阈值。

第二方面,本申请还提供了一种基于克隆代码的漏洞检测装置。该装置包括:

获取模块,用于获取漏洞信息及漏洞信息对应的代码片段;代码片段包括历史版本的代码片段和补丁版本的代码片段;

对比特征提取模块,用于提取代码片段中的函数代码,并基于函数代码进行对比特征提取;

指纹库生成模块,用于根据对比特征生成代码指纹,并将代码指纹保存在漏洞代码指纹库中;

匹配检测模块,用于获取目标软件代码,基于漏洞代码指纹库进行目标软件代码匹配,根据匹配结果生成检测结果。

第三方面,本申请还提供了一种计算机设备。该计算机设备包括存储器和处理器,存储器存储有计算机程序,处理器执行计算机程序时实现以下步骤:

获取漏洞信息及漏洞信息对应的代码片段;代码片段包括历史版本的代码片段和补丁版本的代码片段;

提取代码片段中的函数代码,并基于函数代码进行对比特征提取;

根据对比特征生成代码指纹,并将代码指纹保存在漏洞代码指纹库中;

获取目标软件代码,基于漏洞代码指纹库进行目标软件代码匹配,根据匹配结果生成检测结果。

第四方面,本申请还提供了一种计算机可读存储介质。该计算机可读存储介质,其上存储有计算机程序,计算机程序被处理器执行时实现以下步骤:

获取漏洞信息及漏洞信息对应的代码片段;代码片段包括历史版本的代码片段和补丁版本的代码片段;

提取代码片段中的函数代码,并基于函数代码进行对比特征提取;

根据对比特征生成代码指纹,并将代码指纹保存在漏洞代码指纹库中;

获取目标软件代码,基于漏洞代码指纹库进行目标软件代码匹配,根据匹配结果生成检测结果。

第五方面,本申请还提供了一种计算机程序产品。计算机程序产品,包括计算机程序,该计算机程序被处理器执行时实现以下步骤:

获取漏洞信息及漏洞信息对应的代码片段;代码片段包括历史版本的代码片段和补丁版本的代码片段;

提取代码片段中的函数代码,并基于函数代码进行对比特征提取;

根据对比特征生成代码指纹,并将代码指纹保存在漏洞代码指纹库中;

获取目标软件代码,基于漏洞代码指纹库进行目标软件代码匹配,根据匹配结果生成检测结果。

上述基于克隆代码的漏洞检测方法、装置和计算机设备,获取漏洞信息及漏洞信息对应的代码片段;代码片段包括历史版本的代码片段和补丁版本的代码片段;提取代码片段中的函数代码,并基于函数代码进行对比特征提取;根据对比特征生成代码指纹,并将代码指纹保存在漏洞代码指纹库中;获取目标软件代码,基于漏洞代码指纹库进行目标软件代码匹配,根据匹配结果生成检测结果。在获取漏洞信息及漏洞信息对应的代码片段时能够捕获使用了历史版本代码的漏洞传播,即发布漏洞的代码版本与历史版本代码发生了变化,导致没有使用发布漏洞对应版本代码而使用历史版本代码克隆的软件的漏洞难以发现的问题可以被解决。此外,通过组合使用历史版本代码特征、漏洞版本代码特征和补丁特征,能够发现由于多次传播经过了一些变量名、函数名等修改的漏洞代码片段,并降低假阳性的检测结果。该方法可适用于各种语言的代码检测,具有很强的可扩展性和通用性。

附图说明

图1为一个实施例中基于克隆代码的漏洞检测方法的应用环境图;

图2为一个实施例中基于克隆代码的漏洞检测方法的流程示意图;

图3为一个实施例中基于克隆代码的漏洞检测方法的完整流程示意图;

图4为一个实施例中基于克隆代码的漏洞检测方法应用系统的结构框图;

图5为一个实施例中基于克隆代码的漏洞检测装置的结构框图;

图6为一个实施例中计算机设备的内部结构图。

具体实施方式

为了使本申请的目的、技术方案及优点更加清楚明白,以下结合附图及实施例,对本申请进行进一步详细说明。应当理解,此处描述的具体实施例仅仅用以解释本申请,并不用于限定本申请。

本申请实施例提供的基于克隆代码的漏洞检测方法,可以应用于如图1所示的应用环境中。其中,终端102通过网络与服务器104进行通信。数据存储系统可以存储服务器104需要处理的数据。数据存储系统可以集成在服务器104上,也可以放在云上或其他网络服务器上。其中,终端102可以但不限于是各种个人计算机、笔记本电脑、智能手机、平板电脑、物联网设备和便携式可穿戴设备,物联网设备可为智能音箱、智能电视、智能空调、智能车载设备等。便携式可穿戴设备可为智能手表、智能手环、头戴设备等。服务器104可以用独立的服务器或者是多个服务器组成的服务器集群来实现。

在一个实施例中,如图2所示,提供了一种基于克隆代码的漏洞检测方法,以该方法应用于图1中的终端102为例进行说明,包括以下步骤:

步骤202,获取漏洞信息及漏洞信息对应的代码片段;代码片段包括历史版本的代码片段和补丁版本的代码片段。

本实施例基于给定的开源软件列表从开源软件平台如github上周期性地检索漏洞信息和对应的代码片段,并将这些代码及其最早期版本中包含同样逻辑的代码下载到本地,获得历史版本的代码片段和补丁版本的代码片段。比如发布了CVE-xxx,那么则从发布的信息中获取对应开源软件中的漏洞和补丁。

其中,历史版本代码为最早期发布的代码。针对历史版本代码曾进行多次更新,获取最新版本的代码,即补丁版本的代码片段。补丁版本的代码片段公开存在的漏洞及针对漏洞给出补丁。

步骤204,提取代码片段中的函数代码,并基于函数代码进行对比特征提取。

代码片段通过调用一系列函数实现一定功能,从这些代码片段中提取调用的函数,基于函数提取漏洞代码与补丁代码之间的区别,从而获取对比特征。

步骤206,对比特征生成代码指纹,并将代码指纹保存在漏洞代码指纹库中。

代码指纹是通过字符串长度和哈希值来确认代码身份的标志。通过将对比特征转化为代码指纹,可以在有限时间和有限资源内确认代码身份,提高后续的代码匹配速度。

步骤208,获取目标软件代码,基于漏洞代码指纹库进行目标软件代码匹配,根据匹配结果生成检测结果。

将目标软件代码与漏洞代码指纹库进行匹配,判断目标软件代码为补丁代码还是漏洞代码,进而判断出该目标软件代码是否存在漏洞。

本实施例在传统的克隆代码检测基础上引入历史版本的代码片段与针对漏洞的补丁版本的代码片段,并对历史版本的代码片段和补丁版本的代码片段进行对比特征提取,聚焦不同版本代码片段之间的差别,基于该差别与目标软件代码进行匹配,从而有效避免了引入的克隆代码已经被打过补丁却被误报为漏洞的假阳性情况,以及追溯更早期带有漏洞的源代码分支版本,大大提高提高漏洞检测准确度。

在获取漏洞信息及漏洞信息对应的代码片段时能够捕获使用了历史版本代码的漏洞传播,即发布漏洞的新版本代码与历史版本代码发生了变化,导致没有使用新版本代码而使用历史版本代码克隆的漏洞难以被发现的问题可以被解决。此外,通过组合使用历史版本代码特征、新版本代码特征和补丁特征,能够发现由于多次传播经过了一些变量名、函数名等修改的漏洞代码片段,并降低假阳性的检测结果。该方法可适用于各种语言的代码检测,具有很强的可扩展性和通用性。

在一个实施例中,提取代码片段中的函数代码包括:检索代码片段,并分别提取历史版本代码漏洞函数、补丁版本代码漏洞函数、补丁后对应函数的代码片段。

其中,历史版本代码漏洞函数、补丁版本代码漏洞函数、补丁后对应函数的代码片段均为代码。历史版本的代码片段就是最早版本的代码,历史版本代码漏洞函数即历史版本的代码片段中存在漏洞的函数对应代码片段;补丁版本的代码片段是指被公布存在漏洞的那个版本的代码,补丁版本代码漏洞函数即补丁版本的代码片段中公开漏洞的函数对应代码片段;补丁后对应代码是指在补丁版本的代码片段基础上公开了补丁代码,通常是在补丁版本代码基础上增加一些代码和删除一些代码。

本实施例通过语法解析引擎从代码片段中提取函数。

基于函数从代码片段中提取函数代码,以便于后续针对函数的漏洞和对应补丁进行对比特征提取,限定有效对比范围,提高对比效率。

在一个实施例中,基于函数代码进行对比特征提取包括:从代码片段中提取在补丁版本的代码片段中被删除,并在历史版本代码漏洞函数和补丁版本代码漏洞函数中都存在的代码行,获取漏洞代码行;从代码片段中提取在补丁版本的代码片段中被添加,并在历史版本代码漏洞函数和补丁版本代码漏洞函数中都不存在的代码行,获取补丁代码行;从代码片段中提取与历史版本代码漏洞函数和补丁版本代码漏洞函数具有直接控制与数据依赖关系,并在历史版本代码漏洞函数和补丁版本代码漏洞函数中都存在的代码行,获取漏洞依赖的代码行;从代码片段中提取与补丁后对应函数的代码片段具有直接控制与数据依赖关系的代码行,获取补丁依赖的代码行;从代码片段中提取从函数入口到漏洞代码行的控制流直接相关的条件语句,获取控制流路径代码行。

在一个实施例中,根据对比特征生成代码指纹,并将代码指纹保存在漏洞代码指纹库中包括:对对比特征进行标准化;根据标准化后的漏洞代码行、漏洞依赖的代码行和控制流路径代码行,获取漏洞指纹,根据标准化后的补丁代码行和补丁依赖的代码行获取补丁指纹;漏洞指纹和补丁指纹均由字符串长度和哈希值表示;将漏洞指纹、补丁指纹和对比特征均保存在漏洞代码指纹库中。

其中,代码指纹即用字符串长度和哈希值表示的代码,是代码的一种表示形式。

其中,对比特征标准化以行为单位进行标准化。具体包括将函数的入参名替换为IN_PARAM,函数中定义和使用的局部变量替换为LOCAL_VAR,常量替换为CONST,函数中使用的宏定义全局变量替换为GLOBAL_VAR,函数中数据类型替换为DTYPE,函数中的函数调用替换为CALL_FUNC,将所有字符替换为小写,去掉空格。

将对比特征分为两类,一类是包含漏洞信息的特征,另一类是包含补丁信息的特征。将两类特征分别转化为漏洞指纹和补丁指纹,以指纹形式进行后续的匹配任务,从而提高匹配效率。

在一个实施例中,获取目标软件代码,基于漏洞代码指纹库进行目标软件代码匹配包括:检索目标软件代码,并提取目标软件代码中的每一个函数代码片段,获取目标函数代码;对目标函数代码进行标准化;根据标准化后的目标函数代码生成目标代码指纹,目标代码指纹由字符串长度和哈希值表示;从漏洞代码指纹库中提取与目标软件代码同种语言的漏洞指纹和补丁指纹;将目标代码指纹与提取的漏洞指纹和补丁指纹进行匹配,获取匹配结果。

其中,提取目标函数代码与上述实施例中提取函数的操作相同,同样是通过语法解析引擎检索和提取。

对目标函数代码进行标准化与上述实施例中对对比特征进行标准化的操作相同。

生成目标代码指纹与上述实施例中获取漏洞指纹和补丁指纹的方法相同。

在进行目标代码指纹匹配前,需要先筛选出与目标软件代码相同语言的漏洞指纹和补丁指纹,缩小后续匹配范围,提高匹配效率。

将目标代码指纹与筛选出的漏洞指纹和补丁指纹进行匹配,获取匹配结果。

本实施例的目的在于将待检测的目标软件代码也转化为指纹形式,以便于与漏洞代码指纹库进行匹配,保障两者同样以指纹形式完成高效的匹配任务。

在一个实施例中,将目标代码指纹与提取的漏洞指纹和补丁指纹进行匹配,获取匹配结果包括:基于字符串长度进行匹配,根据与目标代码指纹具有相同字符串长度的漏洞指纹和补丁指纹,获取第一指纹;基于哈希值对目标代码指纹和第一指纹进行匹配,若目标函数代码同时满足三个预设条件,则匹配成功;三个预设条件为:目标代码指纹中的所有代码行都包含在漏洞指纹中、目标代码指纹中的任何代码行都不包含在补丁指纹中、目标函数代码的语法与历史版本代码漏洞函数或补丁版本代码漏洞函数相似度大于阈值。

其中,相似度计算采用Jaccard算法,设置阈值,当相似度的计算结果大于阈值时,则认为满足该预设条件。

通过字符串长度进行初步筛选,排除与目标代码指纹字符串长度不相同的漏洞指纹和补丁指纹,保留与目标代码指纹字符串长度相同的漏洞指纹和补丁指纹,进一步缩小匹配范围,获得第一指纹。第一指纹为与目标代码指纹具有相同字符串长度的漏洞指纹和补丁指纹的集合。

基于哈希值将目标函数代码和第一指纹进行匹配。一般代码不同,则哈希值是不同的。因此可以通过匹配哈希值判断第一指纹中是否存在与目标函数代码相同的代码。

通过哈希值匹配,当目标函数代码同时满足三个预设条件时,则匹配成功,即可输出包括目标函数代码所有代码行的漏洞指纹对应的漏洞信息。当目标函数代码不满足三个预设条件中的任一预设条件时,则匹配失败,输出并未检测到目标软件代码存在漏洞的检测结果。

如图3所示,为一个实施例中基于克隆代码的漏洞检测的应用系统。本发明实现了基于对比特征进行克隆代码检测的漏洞挖掘方法。该方法能够通过对比带漏洞的旧版本和补丁所对应新版本的源代码,并提取对比特征,通过对源代码标准化处理,之后分别对代码结构、代码语义进行指纹提取,构建开源软件的漏洞代码指纹库,并基于漏洞代码指纹库对目标软件的代码实现快速的漏洞挖掘。

在本实施例中,应用系统包括OSS(Object Storage Service,对象存储服务)漏洞代码指纹库、克隆代码检测模块、代码指纹计算模块、代码标准化模块、OSS漏洞代码采集模块和软件代码扫描模块。

OSS漏洞代码采集模块负责基于开源软件列表从开源软件平台获取代码片段。代码片段包括漏洞信息和对应的补丁代码,并将这些代码及其最早期版本中包含同样逻辑的代码下载到本地。

代码标准化模块负责对代码进行标准化处理,包括替换通用的函数调用、变量名、变量数据类型,统一转换为小写,去除注释和换行符等。

代码指纹计算模块负责对代码指纹进行计算,使用对比特征法将生成的代码指纹提交到OSS漏洞代码指纹库,将待检测目标软件代码生成的指纹提交到克隆代码检测模块。

OSS漏洞代码指纹库负责保存漏洞代码指纹和漏洞代码指纹对应的原始代码片段,并提供代码指纹的查询和提取接口。

软件代码扫描模块负责获取目标软件代码。

克隆代码检测模块使用待检测目标软件提交的代码指纹去OSS漏洞代码指纹库中进行指纹匹配,如果匹配到相应的指纹,则报告代码的漏洞。

在一个实施例中,如图4所示,基于克隆代码的漏洞检测方法包括以下步骤:

1.从漏洞库中获取源代码。通过从开源软件平台周期性检测软件的漏洞发布信息,获取漏洞信息和对应代码片段,该代码片段包括历史版本的代码片段和补丁版本的代码片段。将代码片段存储在漏洞库中,在需要进行漏洞检测时,直接从漏洞库获取源代码。

2.函数提取。通过语法解析引擎从给定的代码片段中检索函数,分别提取历史版本代码漏洞函数fo、补丁版本代码漏洞函数fd、补丁后对应函数的代码片段fp。

3.对比特征提取,包括:

3.1.漏洞代码行提取,提取在补丁版本的代码片段中被删除,并在fo和fd中都存在的代码行,形式化表示为

3.2.补丁代码行提取,提取补丁版本的代码片段中被添加,并在fo和fd中都不存在的代码行,形式化表示为

3.3.漏洞依赖的代码行提取,提取与fo和fd具有直接控制与数据依赖关系,并在fo和fd中都存在的代码行,形式化表示为

3.4.补丁依赖的代码行提取,提取与fp具有直接控制与数据依赖关系的代码行,形式化表示为

3.5.控制流路径代码行提取,提取从函数入口到漏洞代码行的控制流直接相关的条件语句F

4.代码标准化。按行对代码进行标准化,将函数的入参名替换为IN_PARAM,函数中定义和使用的局部变量替换为LOCAL_VAR,常量替换为CONST,函数中使用的宏定义全局变量替换为GLOBAL_VAR,函数中数据类型替换为DTYPE,函数中的函数调用替换为CALL_FUNC,将所有字符替换为小写,去掉空格。

5.代码指纹生成。分别生成漏洞指纹和补丁指纹,其中漏洞指纹为V

6.代码指纹入库。将漏洞指纹和补丁指纹保存到漏洞代码指纹库中。

7.目标软件代码获取。从目标软件中读取代码文件。

8.目标软件代码函数提取。通过语法解析引擎从给定的目标软件代码中检索函数,并将每一个函数代码片段提取出来,获取目标函数代码。

9.代码标准化。执行与步骤4相同的标准化操作。

10.代码指纹生成。根据步骤9的标准化结果,计算代码标准化后的字符串的长度和哈希值,生成键值对,以字符串长度作为key,哈希值作为value。

11.漏洞代码指纹库。从漏洞代码指纹库中取出跟目标软件同种语言的漏洞指纹和补丁指纹。

12.代码指纹匹配。先基于key进行查询,找到具有相同长度的代码字符串的代码哈希值,再基于哈希值进行匹配,按照三个预设条件判断是否成功匹配:

条件1,目标函数代码的所有代码行都包含在V

条件2,目标函数代码的任何代码行都不包含在P

条件3,目标函数代码的语法需要与fo或fd相似,这里使用Jaccard算法计算相似性,设置阈值,当相似度计算结果大于阈值则认为满足条件3。

当且仅当目标函数代码同时满足三个预设条件时,匹配成功。

13.生成匹配结果。将匹配结果返回,根据匹配结果输出检测结果。

在一个实施例中,以检测一个具体漏洞为例进行检测方法说明。该方法包括以下步骤:

1.实时监测github上发布的更新信息,检测关键字“CVE-”,检索到补丁提交对应的新、旧文件的ID,并获取这些文件,然后通过文件比对找到打补丁的代码片段。在本实施例中使用一段CVE-2016-8654漏洞的代码,该段代码存在一个Jasper堆缓冲区溢出的漏洞。

2.提取代码中的函数体,如提取的函数体为:

3.CVE-2016-8654漏洞发布出来对应的代码和补丁代码为:

4.分别提取V

5.分别提取P

6.代码标准化得到,V

7.基于标准化的字符串生成代码指纹,漏洞指纹为V

8.保存漏洞指纹和补丁指纹到漏洞代码指纹库中。

9.从软件源代码中获取到被改写过的目标软件代码片段如下:

10.从该函数的代码片段使用旧版本的代码进行了修改,在标准化并生成代码指纹后,设置阈值为0.5,使用Jaccard算法匹配待检测代码指纹和漏洞CVE-2016-8654代码指纹的相似性。

11.得到结果匹配指纹信息,则可以发现该软件代码中存在漏洞CVE-2016-8654。

应该理解的是,虽然如上所述的各实施例所涉及的流程图中的各个步骤按照箭头的指示依次显示,但是这些步骤并不是必然按照箭头指示的顺序依次执行。除非本文中有明确的说明,这些步骤的执行并没有严格的顺序限制,这些步骤可以以其它的顺序执行。而且,如上所述的各实施例所涉及的流程图中的至少一部分步骤可以包括多个步骤或者多个阶段,这些步骤或者阶段并不必然是在同一时刻执行完成,而是可以在不同的时刻执行,这些步骤或者阶段的执行顺序也不必然是依次进行,而是可以与其它步骤或者其它步骤中的步骤或者阶段的至少一部分轮流或者交替地执行。

基于同样的发明构思,本申请实施例还提供了一种用于实现上述所涉及的基于克隆代码的漏洞检测方法的基于克隆代码的漏洞检测装置。该装置所提供的解决问题的实现方案与上述方法中所记载的实现方案相似,故下面所提供的一个或多个基于克隆代码的漏洞检测装置实施例中的具体限定可以参见上文中对于基于克隆代码的漏洞检测方法的限定,在此不再赘述。

在一个实施例中,如图5所示,提供了一种基于克隆代码的漏洞检测装置,包括:获取模块502、对比特征提取模块504、指纹库生成模块506和匹配检测模块508,其中:

获取模块502,用于获取漏洞信息及漏洞信息对应的代码片段;代码片段包括历史版本的代码片段和补丁版本的代码片段。

对比特征提取模块504,用于提取代码片段中的函数代码,并基于函数代码进行对比特征提取。

指纹库生成模块506,用于根据对比特征生成代码指纹,并将代码指纹保存在漏洞代码指纹库中。

匹配检测模块508,用于获取目标软件代码,基于漏洞代码指纹库进行目标软件代码匹配,根据匹配结果生成检测结果。

其中,对比特征提取模块504还用于检索代码片段,并分别提取历史版本代码漏洞函数、补丁版本代码漏洞函数、补丁后对应函数的代码片段。

对比特征提取模块504还用于从代码片段中提取在补丁版本的代码片段中被删除,并在历史版本代码漏洞函数和补丁版本代码漏洞函数中都存在的代码行,获取漏洞代码行;从代码片段中提取在补丁版本的代码片段中被添加,并在历史版本代码漏洞函数和补丁版本代码漏洞函数中都不存在的代码行,获取补丁代码行;从代码片段中提取与历史版本代码漏洞函数和补丁版本代码漏洞函数具有直接控制与数据依赖关系,并在历史版本代码漏洞函数和补丁版本代码漏洞函数中都存在的代码行,获取漏洞依赖的代码行;从代码片段中提取与补丁后对应函数的代码片段具有直接控制与数据依赖关系的代码行,获取补丁依赖的代码行;从代码片段中提取从函数入口到漏洞代码行的控制流直接相关的条件语句,获取控制流路径代码行。

指纹库生成模块506还用于对对比特征进行标准化;根据标准化后的漏洞代码行、漏洞依赖的代码行和控制流路径代码行,获取漏洞指纹,根据标准化后的补丁代码行和补丁依赖的代码行获取补丁指纹;漏洞指纹和补丁指纹均由字符串长度和哈希值表示;将漏洞指纹、补丁指纹和对比特征均保存在漏洞代码指纹库中。

指纹库生成模块506还用于检索目标软件代码,并提取目标软件代码中的每一个函数代码片段,获取目标函数代码;对目标函数代码进行标准化;根据标准化后的目标函数代码生成目标代码指纹;目标代码指纹由字符串长度和哈希值表示;从漏洞代码指纹库中提取与目标软件代码同种语言的漏洞指纹和补丁指纹;将目标代码指纹与提取的漏洞指纹和补丁指纹进行匹配,获取匹配结果。

匹配检测模块508还用于基于字符串长度进行匹配,根据与目标代码指纹具有相同长度的漏洞指纹和补丁指纹,获取第一指纹;基于哈希值对目标代码指纹和第一指纹进行匹配,若目标函数代码同时满足三个预设条件,则匹配成功;三个预设条件为:目标代码指纹中的所有代码行都包含在漏洞指纹中、目标代码指纹中的任何代码行都不包含在补丁指纹中、目标函数代码的语法与历史版本代码漏洞函数或补丁版本代码漏洞函数相似度大于阈值。

上述基于克隆代码的漏洞检测装置中的各个模块可全部或部分通过软件、硬件及其组合来实现。上述各模块可以硬件形式内嵌于或独立于计算机设备中的处理器中,也可以以软件形式存储于计算机设备中的存储器中,以便于处理器调用执行以上各个模块对应的操作。

在一个实施例中,提供了一种计算机设备,该计算机设备可以是服务器,其内部结构图可以如图6所示。该计算机设备包括处理器、存储器、输入/输出接口(Input/Output,简称I/O)和通信接口。其中,处理器、存储器和输入/输出接口通过系统总线连接,通信接口通过输入/输出接口连接到系统总线。其中,该计算机设备的处理器用于提供计算和控制能力。该计算机设备的存储器包括非易失性存储介质和内存储器。该非易失性存储介质存储有操作系统、计算机程序和数据库。该内存储器为非易失性存储介质中的操作系统和计算机程序的运行提供环境。该计算机设备的数据库用于存储克隆代码数据。该计算机设备的输入/输出接口用于处理器与外部设备之间交换信息。该计算机设备的通信接口用于与外部的终端通过网络连接通信。该计算机程序被处理器执行时以实现一种基于克隆代码的漏洞检测方法。

本领域技术人员可以理解,图6中示出的结构,仅仅是与本申请方案相关的部分结构的框图,并不构成对本申请方案所应用于其上的计算机设备的限定,具体的计算机设备可以包括比图中所示更多或更少的部件,或者组合某些部件,或者具有不同的部件布置。

在一个实施例中,提供了一种计算机设备,包括存储器和处理器,存储器中存储有计算机程序,该处理器执行计算机程序时实现上述所有方法实施例。

在一个实施例中,提供了一种计算机可读存储介质,其上存储有计算机程序,计算机程序被处理器执行时实现上述所有方法实施例。

在一个实施例中,提供了一种计算机程序产品,包括计算机程序,该计算机程序被处理器执行时实现上述所有方法实施例。

需要说明的是,本申请所涉及的用户信息(包括但不限于用户设备信息、用户个人信息等)和数据(包括但不限于用于分析的数据、存储的数据、展示的数据等),均为经用户授权或者经过各方充分授权的信息和数据,且相关数据的收集、使用和处理需要遵守相关国家和地区的相关法律法规和标准。

本领域普通技术人员可以理解实现上述实施例方法中的全部或部分流程,是可以通过计算机程序来指令相关的硬件来完成,所述的计算机程序可存储于一非易失性计算机可读取存储介质中,该计算机程序在执行时,可包括如上述各方法的实施例的流程。其中,本申请所提供的各实施例中所使用的对存储器、数据库或其它介质的任何引用,均可包括非易失性和易失性存储器中的至少一种。非易失性存储器可包括只读存储器(Read-OnlyMemory,ROM)、磁带、软盘、闪存、光存储器、高密度嵌入式非易失性存储器、阻变存储器(ReRAM)、磁变存储器(Magnetoresistive Random Access Memory,MRAM)、铁电存储器(Ferroelectric Random Access Memory,FRAM)、相变存储器(Phase Change Memory,PCM)、石墨烯存储器等。易失性存储器可包括随机存取存储器(Random Access Memory,RAM)或外部高速缓冲存储器等。作为说明而非局限,RAM可以是多种形式,比如静态随机存取存储器(Static Random Access Memory,SRAM)或动态随机存取存储器(Dynamic RandomAccess Memory,DRAM)等。本申请所提供的各实施例中所涉及的数据库可包括关系型数据库和非关系型数据库中至少一种。非关系型数据库可包括基于区块链的分布式数据库等,不限于此。本申请所提供的各实施例中所涉及的处理器可为通用处理器、中央处理器、图形处理器、数字信号处理器、可编程逻辑器、基于量子计算的数据处理逻辑器等,不限于此。

以上实施例的各技术特征可以进行任意的组合,为使描述简洁,未对上述实施例中的各个技术特征所有可能的组合都进行描述,然而,只要这些技术特征的组合不存在矛盾,都应当认为是本说明书记载的范围。

以上所述实施例仅表达了本申请的几种实施方式,其描述较为具体和详细,但并不能因此而理解为对本申请专利范围的限制。应当指出的是,对于本领域的普通技术人员来说,在不脱离本申请构思的前提下,还可以做出若干变形和改进,这些都属于本申请的保护范围。因此,本申请的保护范围应以所附权利要求为准。

相关技术
  • 预测代码存在漏洞概率的方法、漏洞检测方法、相关装置
  • 脚本代码检测方法、装置、计算机设备及存储介质
  • 基于哈希值的代码克隆检测方法、电子设备、存储介质
  • 一种代码安全漏洞检查方法、装置、设备及存储介质
  • 基于漏洞指纹的脆弱性代码克隆检测方法及其装置
  • 基于漏洞指纹的脆弱性代码克隆检测方法及其装置
技术分类

06120116494619