一种二进制漏洞代码克隆检测方法及系统转让专利

申请号 : CN201810267094.7

文献号 : CN108491228B

文献日 :

基本信息:

PDF:

法律信息:

相似专利:

发明人 : 姜宇杨鑫高健顾明孙家广

申请人 : 清华大学

摘要 :

本发明提供一种二进制漏洞代码克隆检测方法及系统,其中方法包括:提取待检测二进制代码中的第一函数的函数特征和二进制漏洞代码中的第二函数的函数特征,函数特征包括基本块信息、控制流信息和函数调用信息;将第一函数的函数特征和第二函数的函数特征分别输入预设神经网络,利用预设神经网络计算第一函数和第二函数的相似度;当相似度达到预设阈值时,确定待检测二进制代码中存在二进制漏洞代码的克隆代码。该方法及系统解决了现有代码克隆检测方法所存在的克隆类型检测不全面、准确度低、复杂度高且不易于实现等问题,确保了克隆类型检测的全面性和检测结果的准确性,同时有效提升了检测效率。

权利要求 :

1.一种二进制漏洞代码克隆检测方法,其特征在于,包括:

提取待检测二进制代码中的第一函数的函数特征和二进制漏洞代码中的第二函数的函数特征,所述函数特征包括基本块信息、控制流信息和函数调用信息;所述第一函数和所述第二函数的控制流信息分别包括所述第一函数和所述第二函数中每两个基本块之间的依赖关系;

将所述第一函数的函数特征和所述第二函数的函数特征分别输入预设神经网络,利用所述预设神经网络计算所述第一函数和所述第二函数的相似度;

当所述相似度达到预设阈值时,确定所述待检测二进制代码中存在所述二进制漏洞代码的克隆代码;

所述方法还包括:

获取带有表征克隆/非克隆的标记的第一样本函数和第二样本函数,并提取所述第一样本函数的函数特征和所述第二样本函数的函数特征;

构建所述预设神经网络,并设置所述预设神经网络的目标误差;

将所述第一样本函数的函数特征和所述第二样本函数的函数特征分别输入所述预设神经网络,对所述预设神经网络进行训练;

当所述预设神经网络的实际输出结果和期望输出结果的差值不大于所述目标误差时,所述预设神经网络训练结束;

所述获取带有表征克隆/非克隆的标记的第一样本函数和第二样本函数,具体包括:获取多个样本函数,将每个所述样本函数进行不同配置的交叉编译,获得多个同名函数和多个非同名函数;

将每两个所述同名函数组成带有表征克隆的标记的第一样本函数和第二样本函数,将每两个所述非同名函数组成带有表征非克隆的标记的第一样本函数和第二样本函数。

2.根据权利要求1所述的方法,其特征在于,根据所述待检测二进制代码中所有第一函数与所述第二函数的相似度均小于所述预设阈值,确定所述待检测二进制代码中不存在所述二进制漏洞代码的克隆代码。

3.根据权利要求1所述的方法,其特征在于,所述利用所述预设神经网络计算所述第一函数和所述第二函数的相似度,具体包括:利用所述预设神经网络根据所述第一函数的基本块信息和所述第二函数的基本块信息分别获得所述第一函数中每个基本块对应的第一子特征向量和所述第二函数中每个基本块对应的第二子特征向量;

根据所述第一函数的控制流信息和函数调用信息对所有所述第一子特征向量进行处理,获得第一特征向量;根据所述第二函数的控制流信息和函数调用信息对所有所述第二子特征向量进行处理,获得第二特征向量;

计算所述第一特征向量和所述第二特征向量的夹角余弦值,将所述夹角余弦值确定为所述第一函数和所述第二函数的相似度。

4.根据权利要求1或3所述的方法,其特征在于,所述第一函数和所述第二函数的基本块信息分别包括所述第一函数和所述第二函数中每个基本块的起始地址和每个基本块对应的数值常量的数量、字符常量的数量、转移指令的数量、函数调用的数量、算术指令的数量、逻辑指令的数量、介数中心性和子节点数量。

5.根据权利要求1或3所述的方法,其特征在于,所述第一函数的函数调用信息包括被所述第一函数调用的函数起始地址和调用所述第一函数的函数起始地址;所述第二函数的函数调用信息包括被所述第二函数调用的函数起始地址和调用所述第二函数的函数起始地址。

6.一种二进制漏洞代码克隆检测系统,其特征在于,包括:

特征提取模块,用于提取待检测二进制代码中的第一函数的函数特征和二进制漏洞代码中的第二函数的函数特征,所述函数特征包括基本块特征、控制流信息和函数调用信息;

所述第一函数和所述第二函数的控制流信息分别包括所述第一函数和所述第二函数中每两个基本块之间的依赖关系;

相似度计算模块,用于将所述第一函数的函数特征和所述第二函数的函数特征分别输入预设神经网络,利用所述预设神经网络计算所述第一函数和所述第二函数的相似度;

克隆检测模块,用于当所述相似度达到预设阈值时,确定所述待检测二进制代码中存在所述二进制漏洞代码的克隆代码;

样本函数获取模块,用于获取带有表征克隆/非克隆的标记的第一样本函数和第二样本函数,并提取所述第一样本函数的函数特征和所述第二样本函数的函数特征;

神经网络构建模块,用于构建所述预设神经网络,并设置所述预设神经网络的目标误差;

神经网络训练模块,用于将所述第一样本函数的函数特征和所述第二样本函数的函数特征分别输入所述预设神经网络,对所述预设神经网络进行训练;

所述获取带有表征克隆/非克隆的标记的第一样本函数和第二样本函数,具体包括:获取多个样本函数,将每个所述样本函数进行不同配置的交叉编译,获得多个同名函数和多个非同名函数;

将每两个所述同名函数组成带有表征克隆的标记的第一样本函数和第二样本函数,将每两个所述非同名函数组成带有表征非克隆的标记的第一样本函数和第二样本函数。

7.一种二进制漏洞代码克隆检测方法的设备,其特征在于,包括:至少一个处理器;以及

与所述处理器通信连接的至少一个存储器,其中:

所述存储器存储有可被所述处理器执行的程序指令,所述处理器调用所述程序指令能够执行如权利要求1至5任一所述的方法。

说明书 :

一种二进制漏洞代码克隆检测方法及系统

技术领域

[0001] 本发明涉及计算机程序检测技术领域,更具体地,涉及一种二进制漏洞代码克隆检测方法及系统。

背景技术

[0002] 从软件产业的诞生到现在,随着计算机用户数量快速增加,软件产业发展迅猛,已渗透到人们工作与生活的方方面面。许多软件源代码开放在互联网上,开发人员在互联网查询所需要的相关代码已成为一种快速有效的生产方式。复制一段代码,经过简单修改或者直接的复制粘贴,再运用到新的场景中,是现在软件开发过程中的常见现象。这种代码重用的方式称为代码克隆。大型软件开发中存在大量克隆代码段。像X Windows System等计算机领域公认的高质量系统仍有19%的代码克隆;Linux的核心部分有15%~25%的代码克隆;在开源软件项目中,有超过50%的代码被复用过。大型软件开发中存在大量克隆代码段,例如:Linux内核源代码22.3%被称为重复使用的代码,甚至一小部分代码段被复制了至少8次;在Debian包的Linux内核(2.6.6版)确认使用了145个未打补丁的漏洞代码。如果克隆代码是易受攻击的,则可能导致相关的安全问题大面积爆发,因为已发布的漏洞可能存在于其他软件中,但不能完全修补。利用公布漏洞的信息,攻击者可以利用未打补丁的克隆代码,对软件系统造成严重的影响。因此,迫切需要一种准确有效的方法来检测克隆的易受攻击代码。
[0003] 目前业内普遍依据源代码的文本相似性与功能相似性将克隆代码分成四类:1)除了空格与注释外都相同的代码段;2)除了标志符、类型、空格和注释外句法上都相同的代码段;3)对语句做了增/删/改的复制代码段;4)功能上相同但句法上不同的代码段。其中,一些研究者将第1类称为完全克隆,将第2、3类称为近似克隆,将第4类称为语义克隆。
[0004] 国内外学者已提出许多克隆检测方法及技术并开发出相应的克隆检测工具。这些方法可大致地分成基于文本、基于词法(token)、基于语法(syntax)、基于语义等。
[0005] 1)基于文本的检测方法。该方法是在软件系统的源代码上直接进行比较处理(只过滤源代码的注释和布局上的不同点),而不将源代码转换成某种中间表示形式。Johnson首次提出基于文本的克隆检测技术:首先将固定行数的代码段哈希,然后利用增量哈希函数来识别出具有相同哈希值的代码段即克隆代码,同时结合使用滑动窗口技术来查找不同长度的克隆代码。
[0006] 2)基于词法的检测方法。该方法(也称为基于token的方法)首先使用词法分析工具(如lex)将所有源代码的每一行转换成一个token序列,并将所有序列连接成一个token串;接着扫描这个token以查找相似的token子序列,然后报告这些相似子串所对应的源代码为克隆。
[0007] 3)基于语法的检测方法。该方法是根据相似的代码段应该也有相似的句法结构而设计的。程序被解析成一棵语法树,其中相似的子树所对应的源代码段就是克隆代码。Baxter等人首次将抽象语法树(AST)技术应用在克隆代码检测上,首先将源代码解析成带有标注的语法树,接着将子树哈希到N个桶(bucket)中,然后对同一个桶中的子树比较相似性,进而获得克隆代码。
[0008] 4)基于语义的检测方法。该技术主要以程序依赖图(PDG)方法为代表,即给定一个程序,根据程序语句之间的数据流和控制依赖关系建立一个PDG的集合,在此集合中的同构子图所对应的代码段为克隆代码。近年来,也有学者使用动态分析的方法去检测语义上相似的代码段,如加州大学的Jiang等人通过对代码段给定一组输入数据,比较它们的输出结果,进而得到语义上相似的克隆代码。Marcus等人使用信息检索技术(潜在的语义索引)去静态地分析软件系统的源代码进而检测出语义克隆。
[0009] 基于token的方法能有效地检测第1、2类克隆,时空复杂度较低,也不需考虑程序句法的正确性,且独立于源代码,但在处理第3类的克隆时会有许多误检。基于语法的方法能有效地检测第1-3类克隆,但由于需将代码解析成AST后再查找相似子树,所以时空复杂度偏高。与基于语法的比较方法相比,基于PDG的技术从一个更高层面去分析源代码,以获得程序的语义信息,所以该技术能检测到一些被打乱顺序、但语义相同的代码段。但建立PDG和寻找同构子图花费的代价亦非常高,难以应用于大规模软件。
[0010] 由此可见,现有的代码克隆的检测方法存在克隆类型检测不全面、准确度低、复杂度高不易于实现等问题。

发明内容

[0011] 本发明为了克服现有的代码克隆的检测方法所存在的克隆类型检测不全面、准确度低、复杂度高不易于实现等问题,提供一种二进制漏洞代码克隆检测方法及系统。
[0012] 一方面,本发明提供一种二进制漏洞代码克隆检测方法,包括:
[0013] 提取待检测二进制代码中的第一函数的函数特征和二进制漏洞代码中的第二函数的函数特征,所述函数特征包括基本块信息、控制流信息和函数调用信息;
[0014] 将所述第一函数的函数特征和所述第二函数的函数特征分别输入预设神经网络,利用所述预设神经网络计算所述第一函数和所述第二函数的相似度;
[0015] 当所述相似度达到预设阈值时,确定所述待检测二进制代码中存在所述二进制漏洞代码的克隆代码。
[0016] 优选地,根据所述待检测二进制代码中所有第一函数与所述第二函数的相似度均小于所述预设阈值,确定所述待检测二进制代码中不存在所述二进制漏洞代码的克隆代码。
[0017] 优选地,所述利用所述预设神经网络计算所述第一函数和所述第二函数的相似度,具体包括:
[0018] 利用所述预设神经网络根据所述第一函数的基本块信息和所述第二函数的基本块信息分别获得所述第一函数中每个基本块对应的第一子特征向量和所述第二函数中每个基本块对应的第二子特征向量;
[0019] 根据所述第一函数的控制流信息和函数调用信息对所有所述第一子特征向量进行处理,获得第一特征向量;根据所述第二函数的控制流信息和函数调用信息对所有所述第二子特征向量进行处理,获得第二特征向量;
[0020] 计算所述第一特征向量和所述第二特征向量的夹角余弦值,将所述夹角余弦值确定为所述第一函数和所述第二函数的相似度。
[0021] 优选地,所述第一函数和所述第二函数的基本块信息分别包括所述第一函数和所述第二函数中每个基本块的起始地址和每个基本块对应的数值常量的数量、字符常量的数量、转移指令的数量、函数调用的数量、指令的数量、算术指令的数量、逻辑指令的数量、介数中心性和子节点数量。
[0022] 优选地,所述第一函数和所述第二函数的控制流信息分别包括所述第一函数和所述第二函数中每两个基本块之间的依赖关系。
[0023] 优选地,所述第一函数的函数调用信息包括被所述第一函数调用的函数起始地址和调用所述第一函数的函数起始地址;所述第二函数的函数调用信息包括被所述第二函数调用的函数起始地址和调用所述第二函数的函数起始地址。
[0024] 优选地,所述方法还包括:
[0025] 获取带有表征克隆/非克隆的标记的第一样本函数和第二样本函数,并提取所述第一样本函数的函数特征和所述第二样本函数的函数特征;
[0026] 构建所述预设神经网络,并设置所述预设神经网络的目标误差;
[0027] 将所述第一样本函数的函数特征和所述第二样本函数的函数特征分别输入所述预设神经网络,对所述预设神经网络进行训练;
[0028] 当所述预设神经网络的实际输出结果和期望输出结果的差值不大于所述目标误差时,所述预设神经网络训练结束。
[0029] 优选地,所述获取带有表征克隆/非克隆的标记的第一样本函数和第二样本函数,具体包括:
[0030] 获取多个样本函数,将每个所述样本函数进行不同配置的交叉编译,获得多个同名函数和多个非同名函数;
[0031] 将每两个所述同名函数组成带有表征克隆的标记的第一样本函数和第二样本函数,将每两个所述非同名函数组成带有表征非克隆的标记的第一样本函数和第二样本函数。
[0032] 一方面,本发明提供一种二进制漏洞代码克隆检测系统,包括:
[0033] 特征提取模块,用于提取待检测二进制代码中的第一函数的函数特征和二进制漏洞代码中的第二函数的函数特征,所述函数特征包括基本块特征、控制流信息和函数调用信息;
[0034] 相似度计算模块,用于将所述第一函数的函数特征和所述第二函数的函数特征分别输入预设神经网络,利用所述预设神经网络计算所述第一函数和所述第二函数的相似度;
[0035] 克隆检测模块,用于当所述相似度达到预设阈值时,确定所述待检测二进制代码中存在所述二进制漏洞代码的克隆代码。
[0036] 一方面,本发明提供一种二进制漏洞代码克隆检测方法的设备,包括:
[0037] 至少一个处理器;以及
[0038] 与所述处理器通信连接的至少一个存储器,其中:
[0039] 所述存储器存储有可被所述处理器执行的程序指令,所述处理器调用所述程序指令能够执行上述任一所述的方法。
[0040] 本发明提供的一种二进制漏洞代码克隆检测方法及系统,通过提取待检测二进制代码中的第一函数的函数特征和二进制漏洞代码中的第二函数的函数特征;再将第一函数的函数特征和第二函数的函数特征分别输入预设神经网络,利用预设神经网络计算第一函数和第二函数的相似度;当所述相似度达到预设阈值时,则可确定待检测二进制代码中存在二进制漏洞代码的克隆代码。该方法及系统能够在二进制的基础上准确实现漏洞代码的克隆检测,无需获得源代码,具有普遍适用性;同时针对代码以基本块为细粒度输入神经网络进行深度学习,进而实现了代码的克隆检测,解决了现有代码克隆检测方法所存在的克隆类型检测不全面、准确度低、复杂度高且不易于实现等问题,确保了克隆类型检测的全面性和检测结果的准确性,同时有效提升了检测效率。

附图说明

[0041] 图1为本发明实施例的一种二进制漏洞代码克隆检测方法的整体流程示意图;
[0042] 图2为本发明实施例的函数相似度计算方法的整体流程示意图;
[0043] 图3为本发明实施例的预设神经网络中函数特征向量计算过程的结构示意图;
[0044] 图4为本发明实施例的预设神经网络的训练过程的整体流程示意图;
[0045] 图5为本发明实施例的一种二进制漏洞代码克隆检测系统的整体结构示意图;
[0046] 图6为本发明实施例的一种二进制漏洞代码克隆检测方法的设备的结构框架示意图。

具体实施方式

[0047] 下面结合附图和实施例,对本发明的具体实施方式作进一步详细描述。以下实施例用于说明本发明,但不用来限制本发明的范围。
[0048] 需要说明的是,在现有克隆代码分析技术研究中,大部分是基于源代码进行的,基于二进制代码的研究较少。但某些情况下,我们无法得到源代码,如大部分商业软件不会发布源代码,这时使用二进制文件进行相似性检测就显得尤为重要。有鉴于此,本发明提供一种二进制漏洞代码克隆检测方法,包括:提取待检测二进制代码中的第一函数的函数特征和二进制漏洞代码中的第二函数的函数特征,函数特征包括基本块信息、控制流信息和函数调用信息;将第一函数的函数特征和第二函数的函数特征分别输入预设神经网络,利用预设神经网络计算第一函数和第二函数的相似度;当相似度达到预设阈值时,确定待检测二进制代码中存在二进制漏洞代码的克隆代码。
[0049] 请参阅图1,图1为本发明实施例的一种二进制漏洞代码克隆检测方法的整体流程示意图,如图1所示,该二进制漏洞代码克隆检测方法,包括:
[0050] S101,提取待检测二进制代码中的第一函数的函数特征和二进制漏洞代码中的第二函数的函数特征,函数特征包括基本块信息、控制流信息和函数调用信息;
[0051] 需要说明的是,本实施例中的检测方法是基于二进制代码的形式进行检测的,当待检测代码为源代码时,需先将源代码转换为二进制码。另外,现有的漏洞代码一般为单函数,即现有的漏洞代码中一般只有一个函数。因此,当待检测代码中包括多个函数时,应先将待检测代码中的函数进行拆分,再依次对每个函数进行检测。同时由于现有公开的漏洞代库中存在多种漏洞代码,因而当需要在待检测代码中对现有公开的漏洞代库中所有漏洞代码进行检测时,应分别对每个漏洞代码进行检测,现以待检测代码中的一个函数的检测过程为例进行说明:
[0052] 通过编译器首先获得待检测二进制代码和二进制漏洞代码,利用二进制码反汇编工具提取待检测二进制码中的函数,将该函数作为第一函数;同时利用二进制码反汇编工具提取二进制漏洞代码中的函数,将该函数作为第二函数。与此同时,利用二进制码反汇编工具提取第一函数的函数特征和第二函数的函数特征。函数特征包括基本块信息、控制流信息和函数调用信息,其中基本块信息为一个函数中所包含的基本块的相关信息,控制流信息为一个函数中各基本块之间的依赖关系,函数调用信息为一个函数调用其他函数和该函数被其他函数调用的情况。可以看出,通过基本块信息、控制流信息和函数调用信息可以对一个函数进行全面描述。
[0053] S102,将第一函数的函数特征和第二函数的函数特征分别输入预设神经网络,利用预设神经网络计算第一函数和第二函数的相似度;
[0054] 具体地,在上述获得第一函数的函数特征和第二函数的函数特征的基础上,将第一函数的函数特征和第二函数的函数特征分别输入预设神经网络,其中预设神经网络是预先训练好的,预设神经网络根据第一函数的函数特征和第二函数的函数特征计算第一函数和第二函数的相似度,并通过预设神经网络的输出层输出相似度的计算结果。
[0055] S103,当相似度达到预设阈值时,确定待检测二进制代码中存在二进制漏洞代码的克隆代码。
[0056] 具体地,在上述计算获得第一函数和第二函数的相似度的基础上,将计算获得的相似度和预设阈值进行比较,预设阈值是预先设置的相似度的临界值。当计算获得的相似度达到预设阈值时,则可以确定待检测二进制代码中存在二进制漏洞代码的克隆代码。
[0057] 本发明提供的一种二进制漏洞代码克隆检测方法,通过提取待检测二进制代码中的第一函数的函数特征和二进制漏洞代码中的第二函数的函数特征;再将第一函数的函数特征和第二函数的函数特征分别输入预设神经网络,利用预设神经网络计算第一函数和第二函数的相似度;当所述相似度达到预设阈值时,则可确定待检测二进制代码中存在二进制漏洞代码的克隆代码。该方法能够在二进制的基础上准确实现漏洞代码的克隆检测,无需获得源代码,具有普遍适用性;同时针对代码以基本块为细粒度输入神经网络进行深度学习,进而实现了代码的克隆检测,解决了现有代码克隆检测方法所存在的克隆类型检测不全面、准确度低、复杂度高且不易于实现等问题,确保了克隆类型检测的全面性和检测结果的准确性,同时有效提升了检测效率。
[0058] 基于上述任一实施例,提供一种二进制漏洞代码克隆检测方法,根据待检测二进制代码中所有第一函数与第二函数的相似度均小于预设阈值,确定待检测二进制代码中不存在二进制漏洞代码的克隆代码。
[0059] 具体地,当待检测二进制代码中包括多个第一函数时,应采用上述实施例中的方法计算待检测二进制代码中的每个第一函数和二进制代码漏洞代码中第二函数的相似度。当待检测二进制代码中的所有第一函数与二进制漏洞代码中第二函数的相似度均小于预设阈值时,则可确定待检测二进制代码中不存在二进制漏洞代码的克隆代码。
[0060] 本发明提供的一种二进制漏洞代码克隆检测方法,根据待检测二进制代码中所有第一函数与第二函数的相似度均小于预设阈值,确定待检测二进制代码中不存在二进制漏洞代码的克隆代码。该方法能够在二进制的基础上准确实现漏洞代码的克隆检测,无需获得源代码,具有普遍适用性;同时针对代码以基本块为细粒度输入神经网络进行深度学习,进而实现了代码的克隆检测,解决了现有代码克隆检测方法所存在的克隆类型检测不全面、准确度低、复杂度高且不易于实现等问题,确保了克隆类型检测的全面性和检测结果的准确性,同时有效提升了检测效率。
[0061] 基于上述任一实施例,提供一种二进制漏洞代码克隆检测方法,请参见图2,上述步骤S102中利用预设神经网络计算第一函数和第二函数的相似度,具体包括:
[0062] S1021,利用预设神经网络根据第一函数的基本块信息和第二函数的基本块信息分别获得第一函数中每个基本块对应的第一子特征向量和第二函数中每个基本块对应的第二子特征向量;
[0063] 具体地,将第一函数的函数特征和第二函数的函数特征通过预设神经网络的输入层输入预设神经网络,其中函数特征包括基本块信息、控制流信息和函数调用信息。在此基础上,预设神经网络接收第一函数的基本块信息,第一函数的基本块信息包括第一函数中每个基本块的起始地址,用于对每个基本块进行标识,以及每个基本块的非结构化特征和结构化特征。预设神经网络根据第一函数的基本块信息获得第一函数中每个基本块对应的第一子特征向量。同理,预设神经网络接收第二函数的基本块信息,第二函数的基本块信息包括第二函数中每个基本块的起始地址,用于对每个基本块进行标识,以及每个基本块的非结构化特征和结构化特征。预设神经网络根据第二函数的基本块信息获得第二函数中每个基本块对应的第二子特征向量。
[0064] S1022,根据第一函数的控制流信息和函数调用信息对所有第一子特征向量进行处理,获得第一特征向量;根据第二函数的控制流信息和函数调用信息对所有第二子特征向量进行处理,获得第二特征向量;
[0065] 具体地,将上述获得第一函数中每个基本块对应的第一子特征向量和第二函数中每个基本块对应的第二子特征向量输入预设神经网络的隐含层和全连接层,隐含层和全连接层根据输入的第一函数的控制流信息和函数调用信息分别对所有第一子特征向量进行处理,获得第一特征向量;隐含层和全连接层根据输入的第二函数的控制流信息和函数调用信息分别对所有第二子特征向量进行处理,获得第二特征向量。
[0066] 隐含层的神经元在对所有第一子特征向量进行处理时,根据第一函数的控制流信息确定所有第一子特征向量之间的依赖关系,若不存在其他子特征向量依赖于某个神经元对应的子特征向量,则该神经元对其对应的子特征向量进行处理时只需将上一隐含层对应神经元的值与预设的第一系数矩阵相乘即可;若存在其他子特征向量依赖于某个神经元对应的子特征向量,则该神经元对其对应的子特征向量进行处理时在将上一隐含层对应神经元的值与预设的第一系数矩阵相乘的基础上还需加上依赖于该子特征向量的其他子特征向量在上一隐含层中对应神经元的值与预设的第二系数矩阵的乘积。
[0067] 基于上述原理,隐含层对所有第一子特征向量处理后,将处理后的所有第一子特征向量进行整合后输入全连接层,全连接层根据第一函数的函数调用信息确定对应的函数调用子特征向量,最终将整合后的所有第一子特征向量和对应的函数调用子特征向量进行拼接后获得第一函数对应的第一特征向量。同样地,隐含层对所有第二子特征向量处理后,将处理后的所有第二子特征向量进行整合后输入全连接层,全连接层根据第二函数的函数调用信息确定对应的函数调用子特征向量,最终将整合后的所有第二子特征向量和对应的函数调用子特征向量进行拼接后获得第二函数对应的第二特征向量。
[0068] S1023,计算第一特征向量和第二特征向量的夹角余弦值,将夹角余弦值确定为第一函数和第二函数的相似度。
[0069] 具体地,在上述获得第一函数对应的第一特征向量和第二函数对应的第二特征向量之后,预设神经网络的全连接层还需计算第一特征向量和第二特征向量的夹角余弦值,并最终将计算获得的夹角余弦值通过预设神经网络的输出层进行输出,输出的夹角余弦值即可确定为第一函数和所述第二函数的相似度。其中,相似度的取值范围为(-1,1),当第一函数和第二函数的相似度接近于1时,则可确定第一函数和第二函数互为克隆函数,当第一函数和第二函数的相似度接近于-1时,则可确定第一函数和第二函数互为非克隆函数。
[0070] 本发明提供的一种二进制漏洞代码克隆检测方法,利用预设神经网络根据第一函数的基本块信息和第二函数的基本块信息分别获得第一函数中每个基本块对应的第一子特征向量和第二函数中每个基本块对应的第二子特征向量;根据第一函数的控制流信息和函数调用信息对所有第一子特征向量进行处理,获得第一特征向量;根据第二函数的控制流信息和函数调用信息对所有第二子特征向量进行处理,获得第二特征向量;计算第一特征向量和第二特征向量的夹角余弦值,将夹角余弦值确定为第一函数和所述第二函数的相似度。该方法针对代码以基本块为细粒度输入神经网络进行深度学习,进而实现了代码的克隆检测,解决了现有代码克隆检测方法所存在的克隆类型检测不全面、准确度低、复杂度高且不易于实现等问题,确保了克隆类型检测的全面性和检测结果的准确性,同时有效提升了检测效率。
[0071] 为了便于理解任一实施例中的方法,现以下述示例进行说明:
[0072] 如图3所示,图3为本发明实施例的预设神经网络中函数特征向量计算过程的结构示意图,图中以单个函数特征向量的计算过程为例进行说明。图中的函数共有3个基本块(X1、X2、X3),图中共包括7个隐含层,首先对第一层隐含层中的三个神经元u10、u20、u30进行初始化,分别初始值为64维全0向量。神经元的下标与基本块下标一一对应,即基本块X1对应的第一层隐含层神经元为 随后按照如下所示的公式继续计算下一层隐含层各个神经元的值。
[0073]
[0074]
[0075] 上式中, 表示依赖于基本块Xi的其他基本块的下标,节点, 表示与基本块Xi相对应的第t层隐含单元,P(i)表示调用该函数的节点,S(i)表示被该函数调用的节点,W1,W2,W3,P1,P2为预设神经网络的参数矩阵,xi表示基本块Xi的子特征向量,σ(·)为激活函数。
[0076] 由上可知,图3中, 第二层隐含层的神经元:依次类推进行
计算,最终计算得到的μ即为该函数对应的特征向量,本实施例中,μ为64维特征向量。
[0077] 同理,根据上述计算方法计算另一函数的特征向量,最终通过计算两个函数的特征向量的夹角余弦值,则可确定两个函数的相似度,进而可确定两个函数是否互为克隆函数。
[0078] 基于上述任一实施例提供一种二进制漏洞代码克隆检测方法,第一函数和第二函数的基本块信息分别包括第一函数和第二函数中每个基本块的起始地址和每个基本块对应的数值常量的数量、字符常量的数量、转移指令的数量、函数调用的数量、指令的数量、算术指令的数量、逻辑指令的数量、介数中心性和子节点数量。
[0079] 具体地,第一函数的基本块信息包括第一函数中每个基本块的起始地址,每个基本块的起始地址为该基本块的标识,用于唯一确定该基本块。此外,第一函数的基本块信息还包括每个基本块对应的数值常量的数量、字符常量的数量、转移指令的数量、函数调用的数量、指令的数量、算术指令的数量和逻辑指令的数量共7个非结构化特征和每个基本块对应的介数中心性和子节点数量共2个结构化特征。7个非结构化特征和2个结构化特征组合形成每个基本块对应的9维向量。
[0080] 同理,第二函数的基本块信息包括第二函数中每个基本块的起始地址,每个基本块的起始地址为该基本块的标识,用于唯一确定该基本块。此外,第二函数的基本块信息还包括每个基本块对应的数值常量的数量、字符常量的数量、转移指令的数量、函数调用的数量、指令的数量、算术指令的数量和逻辑指令的数量共7个非结构化特征和每个基本块对应的介数中心性和子节点数量共2个结构化特征。7个非结构化特征和2个结构化特征组合形成每个基本块对应的9维向量。
[0081] 由上可知,预设神经网络根据第一函数的基本块信息和第二函数的基本块信息即可获得第一函数中每个基本块对应的第一子特征向量和第二函数中每个基本块对应的第二子特征向量,第一子特征向量和第二子特征向量即为上述9维向量。
[0082] 本发明提供的一种二进制漏洞代码克隆检测方法,通过获取第一函数的基本块信息和第二函数的基本块信息,以基本块为细粒度输入神经网络进行深度学习,进而实现了代码的克隆检测,解决了现有代码克隆检测方法所存在的克隆类型检测不全面、准确度低、复杂度高且不易于实现等问题,确保了克隆类型检测的全面性和检测结果的准确性,同时有效提升了检测效率。
[0083] 基于上述任一实施例提供一种二进制漏洞代码克隆检测方法,第一函数和第二函数的控制流信息分别包括第一函数和第二函数中每两个基本块之间的依赖关系。
[0084] 具体地,第一函数的控制流信息包括第一函数中每两个基本块之间的依赖关系,第二函数的控制流信息包括第二函数中每两个基本块之间的依赖关系。其中,依赖关系决定了预设神经网络中参数计算、调整过程的走向,预设神经网络根据第一函数的控制流信息和第二函数的控制流信息分别进行计算处理,最终输出第一函数对应的第一特征向量和第二函数对应的第二特征向量。此外,依赖关系可以通过依赖拓扑图或数组的形式进行表示,可以根据实际需求进行设置,此处不做具体限定。
[0085] 本发明提供的一种二进制漏洞代码克隆检测方法,通过获取第一函数的控制流信息和第二函数的控制流信息,有利于预设神经网络根据第一函数的控制流信息和第二函数的控制流信息分别进行计算处理,最终输出第一函数对应的第一特征向量和第二函数对应的第二特征向量,进而实现了代码的克隆检测,解决了现有代码克隆检测方法所存在的克隆类型检测不全面、准确度低、复杂度高且不易于实现等问题,确保了克隆类型检测的全面性和检测结果的准确性,同时有效提升了检测效率。
[0086] 基于上述任一实施例提供一种二进制漏洞代码克隆检测方法,第一函数的函数调用信息包括被第一函数调用的函数起始地址和调用第一函数的函数起始地址;第二函数的函数调用信息包括被第二函数调用的函数起始地址和调用第二函数的函数起始地址。
[0087] 具体地,第一函数的函数调用信息包括第一函数调用的函数起始地址和调用第一函数的函数起始地址,即可确定第一函数和其他函数的调用和被调用关系。第二函数的函数调用信息包括第二函数调用的函数起始地址和调用第二函数的函数起始地址,即可确定第二函数和其他函数的调用和被调用关系。其中,函数的起始地址为函数的唯一标识,用于唯一确定某一函数。预设神经网络根据第一函数的函数调用信息和第二函数的函数调用信息分别进行计算处理,最终输出第一函数对应的第一特征向量和第二函数对应的第二特征向量。
[0088] 本发明提供的一种二进制漏洞代码克隆检测方法,通过获取第一函数的函数调用信息和第二函数的函数调用信息,有利于预设神经网络根据第一函数的函数调用信息和第二函数的函数调用信息分别进行计算处理,最终输出第一函数对应的第一特征向量和第二函数对应的第二特征向量,进而实现了代码的克隆检测,解决了现有代码克隆检测方法所存在的克隆类型检测不全面、准确度低、复杂度高且不易于实现等问题,确保了克隆类型检测的全面性和检测结果的准确性,同时有效提升了检测效率。
[0089] 基于上述任一实施例提供一种二进制漏洞代码克隆检测方法,参见图4,该方法还包括对预设神经网络进行训练的步骤,具体过程如下:
[0090] S401,获取带有表征克隆/非克隆的标记的第一样本函数和第二样本函数,并提取所第一样本函数的函数特征和第二样本函数的函数特征;
[0091] 具体地,获取带有表征克隆/非克隆的标记的第一样本函数和第二样本函数,包括获取表征克隆标记的第一样本函数和第二样本函数以及表征非克隆的标记的第一样本函数和第二样本函数。其中,带有表征克隆标记的第一样本函数和第二样本函数意指第一样本函数和第二样本函数互为克隆函数;带有表征非克隆标记的第一样本函数和第二样本函数意指第一样本函数和第二样本函数互为非克隆函数。本实施例中,可以获取多组带有表征克隆/非克隆的标记的第一样本函数和第二样本函数,以形成多个训练样本对预设神经网络进行训练,可以根据实际需求进行设置,此处不做具体限定。
[0092] 利用二进制码反汇编工具提取第一样本函数的函数特征和第二样本函数的函数特征。函数特征包括基本块信息、控制流信息和函数调用信息,其中基本块信息为一个函数中所包含的基本块的相关信息,控制流信息为一个函数中各基本块之间的依赖关系,函数调用信息为一个函数调用其他函数和该函数被其他函数调用的情况。可以看出,通过基本块信息、控制流信息和函数调用信息可以对一个函数进行全面描述。
[0093] S402,构建预设神经网络,并设置预设神经网络的目标误差;
[0094] 具体地,构建神经网络的模型,本实施例中,神经网络的模型包括输入层、隐含层、全连接层和输出层。在其他实施例中,预设神经网络的模型可以根据实际需求进行构建,此处不做具体限定。在构建预设神经网络的基础上,设置预设神经网络的目标误差,该目标误差为预设神经网络的实际输出值和期望输出值之间的误差的目标值。目标误差值可以根据实际需求进行设置,此处不做具体限定。
[0095] S403,将第一样本函数的函数特征和第二样本函数的函数特征分别输入预设神经网络,对预设神经网络进行训练;
[0096] 具体地,在上述获得第一样本函数的函数特征和第二样本函数的函数特征的基础上,将第一样本函数的函数特征和第二样本函数的函数特征分别输入上述构建预设神经网络中,对预设神经网络进行训练。
[0097] S404,当预设神经网络的实际输出结果和期望输出结果的差值不大于目标误差时,预设神经网络训练结束。
[0098] 具体地,在利用第一样本函数和第二样本函数对预设神经网络进行训练的过程中,当预设神经网络的实际输出结果和期望输出结果的差值不大于目标误差时,预设神经网络训练结束。
[0099] 本发明提供的一种二进制漏洞代码克隆检测方法,通过获取带有表征克隆/非克隆的标记的第一样本函数和第二样本函数,并提取第一样本函数的函数特征和第二样本函数的函数特征;构建预设神经网络,并设置预设神经网络的目标误差;将第一样本函数的函数特征和第二样本函数的函数特征分别输入预设神经网络,对预设神经网络进行训练;当预设神经网络的实际输出结果和期望输出结果的差值不大于目标误差时,预设神经网络训练结束。该方法通过对预设神经网络进行训练,从而有利于利用训练好的预设神经网络实现代码的克隆检测,解决了现有代码克隆检测方法所存在的克隆类型检测不全面、准确度低、复杂度高且不易于实现等问题,确保了克隆类型检测的全面性和检测结果的准确性,同时有效提升了检测效率。
[0100] 基于上述任一实施例提供一种二进制漏洞代码克隆检测方法,获取带有表征克隆/非克隆的标记的第一样本函数和第二样本函数,具体包括:
[0101] 获取多个样本函数,将每个样本函数进行不同配置的交叉编译,获得多个同名函数和多个非同名函数;
[0102] 将每两个同名函数组成带有表征克隆的标记的第一样本函数和第二样本函数,将每两个非同名函数组成带有表征非克隆的标记的第一样本函数和第二样本函数。
[0103] 需要说明的是,由于相同的函数在不同编译器的编译下获得的二进制代码在形式上可能不同,因此为了确保预设神经网络的准确性,需选取合适的训练样本。本实施例通过以下方式获取带有表征克隆/非克隆的标记的第一样本函数和第二样本函数:
[0104] 具体地,在获取带有表征克隆/非克隆的标记的第一样本函数和第二样本函数的过程中,首先获取多个样本函数,样本函数的数量可以根据实际需求进行设置,此处不做具体限定。再将每个样本函数进行不同配置的交叉编译,获得多个同名函数和多个非同名函数。虽然相同的函数在不同编译器的编译下获得的二进制代码在形式上可能不同,但其对应的函数名相同。即当两个函数的函数名相同时,则可以确定该两个函数为克隆函数;当两个函数的函数名不相同时,则可以确定该两个函数为非克隆函数。
[0105] 进一步地,在上述获得多个同名函数和多个非同名函数的基础上,将每两个同名函数组成带有表征克隆的标记的第一样本函数和第二样本函数,将每两个非同名函数组成带有表征非克隆的标记的第一样本函数和第二样本函数。
[0106] 采用上述获得的带有表征克隆/非克隆的标记的第一样本函数和第二样本函数对预设神经网络进行训练后,即便存在两段二进制代码为相同的函数在不同编译器的编译下获得的不同形式的二进制代码,预设神经网络也可以识别出该两段二进制代码为克隆代码。
[0107] 本发明提供的一种二进制漏洞代码克隆检测方法,通过获取合适的带有表征克隆/非克隆的标记的第一样本函数和第二样本函数对预设神经网络进行训练,使得预设神经网络能够识别相同的函数在不同编译器的编译下获得的不同形式的二进制代码,有利于确保预设神经网络的准确性,从而有利于利用训练好的预设神经网络实现代码的克隆检测,解决了现有代码克隆检测方法所存在的克隆类型检测不全面、准确度低、复杂度高且不易于实现等问题,确保了克隆类型检测的全面性和检测结果的准确性,同时有效提升了检测效率。
[0108] 图5为本发明实施例的一种二进制漏洞代码克隆检测系统的整体结构示意图,如图5所示,本发明提供一种二进制漏洞代码克隆检测系统,包括特征提取模块1、相似度计算模块2和克隆检测模块3,通过各模块的配合实现上述任一实施例中的二进制漏洞代码克隆检测方法,具体实现如下:
[0109] 特征提取模块1,用于提取待检测二进制代码中的第一函数的函数特征和二进制漏洞代码中的第二函数的函数特征,函数特征包括基本块特征、控制流信息和函数调用信息;
[0110] 具体地,通过编译器首先获得待检测二进制代码和二进制漏洞代码,利用特征提取模块1采用二进制码反汇编工具提取待检测二进制码中的函数,将该函数作为第一函数;同时利用特征提取模块1采用二进制码反汇编工具提取二进制漏洞代码中的函数,将该函数作为第二函数。与此同时,利用特征提取模块1采用二进制码反汇编工具提取第一函数的函数特征和第二函数的函数特征。函数特征包括基本块信息、控制流信息和函数调用信息,其中基本块信息为一个函数中所包含的基本块的相关信息,控制流信息为一个函数中各基本块之间的依赖关系,函数调用信息为一个函数调用其他函数和该函数被其他函数调用的情况。可以看出,通过基本块信息、控制流信息和函数调用信息可以对一个函数进行全面描述。
[0111] 相似度计算模块2,用于将第一函数的函数特征和第二函数的函数特征分别输入预设神经网络,利用预设神经网络计算第一函数和第二函数的相似度;
[0112] 具体地,在上述获得第一函数的函数特征和第二函数的函数特征的基础上,利用相似度计算模块2将第一函数的函数特征和第二函数的函数特征分别输入预设神经网络,其中预设神经网络是预先训练好的,预设神经网络根据第一函数的函数特征和第二函数的函数特征计算第一函数和第二函数的相似度,并通过预设神经网络的输出层输出相似度的计算结果。
[0113] 克隆检测模块3,用于当相似度达到预设阈值时,确定待检测二进制代码中存在二进制漏洞代码的克隆代码。
[0114] 具体地,在上述计算获得第一函数和第二函数的相似度的基础上,利用克隆检测模块3将计算获得的相似度和预设阈值进行比较,预设阈值是预先设置的相似度的临界值。当计算获得的相似度达到预设阈值时,则可以确定待检测二进制代码中存在二进制漏洞代码的克隆代码。
[0115] 需要说明的是,当待检测二进制代码中包括多个第一函数时,应采用上述实施例中的方法计算待检测二进制代码中的每个第一函数和二进制代码漏洞代码中第二函数的相似度。当待检测二进制代码中的所有第一函数与二进制漏洞代码中第二函数的相似度均小于预设阈值时,则可确定待检测二进制代码中不存在二进制漏洞代码的克隆代码。
[0116] 本发明提供的一种二进制漏洞代码克隆检测系统,通过提取待检测二进制代码中的第一函数的函数特征和二进制漏洞代码中的第二函数的函数特征;再将第一函数的函数特征和第二函数的函数特征分别输入预设神经网络,利用预设神经网络计算第一函数和第二函数的相似度;当所述相似度达到预设阈值时,则可确定待检测二进制代码中存在二进制漏洞代码的克隆代码。该系统能够在二进制的基础上准确实现漏洞代码的克隆检测,无需获得源代码,具有普遍适用性;同时针对代码以基本块为细粒度输入神经网络进行深度学习,进而实现了代码的克隆检测,解决了现有代码克隆检测方法所存在的克隆类型检测不全面、准确度低、复杂度高且不易于实现等问题,确保了克隆类型检测的全面性和检测结果的准确性,同时有效提升了检测效率。
[0117] 图6示出本发明实施例的一种二进制漏洞代码克隆检测方法的设备的结构框图。参照图6,所述二进制漏洞代码克隆检测方法的设备,包括:处理器(processor)61、存储器(memory)62和总线63;其中,所述处理器61和存储器62通过所述总线63完成相互间的通信;
所述处理器61用于调用所述存储器62中的程序指令,以执行上述各方法实施例所提供的方法,例如包括:提取待检测二进制代码中的第一函数的函数特征和二进制漏洞代码中的第二函数的函数特征,函数特征包括基本块信息、控制流信息和函数调用信息;将第一函数的函数特征和第二函数的函数特征分别输入预设神经网络,利用预设神经网络计算第一函数和第二函数的相似度;当相似度达到预设阈值时,确定待检测二进制代码中存在二进制漏洞代码的克隆代码。
[0118] 本实施例公开一种计算机程序产品,所述计算机程序产品包括存储在非暂态计算机可读存储介质上的计算机程序,所述计算机程序包括程序指令,当所述程序指令被计算机执行时,计算机能够执行上述各方法实施例所提供的方法,例如包括:提取待检测二进制代码中的第一函数的函数特征和二进制漏洞代码中的第二函数的函数特征,函数特征包括基本块信息、控制流信息和函数调用信息;将第一函数的函数特征和第二函数的函数特征分别输入预设神经网络,利用预设神经网络计算第一函数和第二函数的相似度;当相似度达到预设阈值时,确定待检测二进制代码中存在二进制漏洞代码的克隆代码。
[0119] 本实施例提供一种非暂态计算机可读存储介质,所述非暂态计算机可读存储介质存储计算机指令,所述计算机指令使所述计算机执行上述各方法实施例所提供的方法,例如包括:提取待检测二进制代码中的第一函数的函数特征和二进制漏洞代码中的第二函数的函数特征,函数特征包括基本块信息、控制流信息和函数调用信息;将第一函数的函数特征和第二函数的函数特征分别输入预设神经网络,利用预设神经网络计算第一函数和第二函数的相似度;当相似度达到预设阈值时,确定待检测二进制代码中存在二进制漏洞代码的克隆代码。
[0120] 本领域普通技术人员可以理解:实现上述方法实施例的全部或部分步骤可以通过程序指令相关的硬件来完成,前述的程序可以存储于一计算机可读取存储介质中,该程序在执行时,执行包括上述方法实施例的步骤;而前述的存储介质包括:ROM、RAM、磁碟或者光盘等各种可以存储程序代码的介质。
[0121] 以上所描述的二进制漏洞代码克隆检测方法的设备等实施例仅仅是示意性的,其中所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部模块来实现本实施例方案的目的。本领域普通技术人员在不付出创造性的劳动的情况下,即可以理解并实施。
[0122] 通过以上的实施方式的描述,本领域的技术人员可以清楚地了解到各实施方式可借助软件加必需的通用硬件平台的方式来实现,当然也可以通过硬件。基于这样的理解,上述技术方案本质上或者说对现有技术做出贡献的部分可以以软件产品的形式体现出来,该计算机软件产品可以存储在计算机可读存储介质中,如ROM/RAM、磁碟、光盘等,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行各个实施例或者实施例的某些部分所述的方法。
[0123] 最后,本申请的方法仅为较佳的实施方案,并非用于限定本发明的保护范围。凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。