CN116305158A - 一种基于切片代码依赖图语义学习的漏洞识别方法 - Google Patents

一种基于切片代码依赖图语义学习的漏洞识别方法 Download PDF

Info

Publication number
CN116305158A
CN116305158A CN202310252103.6A CN202310252103A CN116305158A CN 116305158 A CN116305158 A CN 116305158A CN 202310252103 A CN202310252103 A CN 202310252103A CN 116305158 A CN116305158 A CN 116305158A
Authority
CN
China
Prior art keywords
code
node
slice
function
nodes
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Pending
Application number
CN202310252103.6A
Other languages
English (en)
Inventor
王炎
许少年
范永陈
邓凯
潘艺宁
钱奂奂
王晓楠
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Tianyi Cloud Technology Co Ltd
Original Assignee
Tianyi Cloud Technology Co Ltd
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Tianyi Cloud Technology Co Ltd filed Critical Tianyi Cloud Technology Co Ltd
Priority to CN202310252103.6A priority Critical patent/CN116305158A/zh
Publication of CN116305158A publication Critical patent/CN116305158A/zh
Pending legal-status Critical Current

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F21/00Security arrangements for protecting computers, components thereof, programs or data against unauthorised activity
    • G06F21/50Monitoring users, programs or devices to maintain the integrity of platforms, e.g. of processors, firmware or operating systems
    • G06F21/57Certifying or maintaining trusted computer platforms, e.g. secure boots or power-downs, version controls, system software checks, secure updates or assessing vulnerabilities
    • G06F21/577Assessing vulnerabilities and evaluating computer system security
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/53Decompilation; Disassembly
    • YGENERAL TAGGING OF NEW TECHNOLOGICAL DEVELOPMENTS; GENERAL TAGGING OF CROSS-SECTIONAL TECHNOLOGIES SPANNING OVER SEVERAL SECTIONS OF THE IPC; TECHNICAL SUBJECTS COVERED BY FORMER USPC CROSS-REFERENCE ART COLLECTIONS [XRACs] AND DIGESTS
    • Y02TECHNOLOGIES OR APPLICATIONS FOR MITIGATION OR ADAPTATION AGAINST CLIMATE CHANGE
    • Y02DCLIMATE CHANGE MITIGATION TECHNOLOGIES IN INFORMATION AND COMMUNICATION TECHNOLOGIES [ICT], I.E. INFORMATION AND COMMUNICATION TECHNOLOGIES AIMING AT THE REDUCTION OF THEIR OWN ENERGY USE
    • Y02D10/00Energy efficient computing, e.g. low power processors, power management or thermal management

Landscapes

  • Engineering & Computer Science (AREA)
  • General Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • Computer Hardware Design (AREA)
  • Computer Security & Cryptography (AREA)
  • Software Systems (AREA)
  • Physics & Mathematics (AREA)
  • General Physics & Mathematics (AREA)
  • Computing Systems (AREA)
  • Devices For Executing Special Programs (AREA)

Abstract

本发明涉及漏洞检测技术领域,具体公开了一种基于切片代码依赖图语义学习的漏洞识别方法,包括步骤S1:输入一个可执行的二进制程序,利用反编译技术获得二进制程序中每个函数的伪代码;步骤S2:对每个伪代码函数中的危险library/API函数调用执行过程内和过程间的数据依赖分析和控制依赖分析,提取只与危险library/API函数调用相关的细粒度伪代码片段,并以此构建切片代码依赖图;等步骤;本发明适用二进制代码场景下的漏洞识别,能够弥补源代码不可访问的受限条件下对软件进行安全漏洞检测,且有利于进一步检测源代码编译环节引入安全漏洞的问题,有效提升软件质量和代码行为的可信性式。

Description

一种基于切片代码依赖图语义学习的漏洞识别方法
技术领域
本发明涉及漏洞检测技术领域,具体是一种基于切片代码依赖图语义学习的漏洞识别方法。
背景技术
当今大多数安全事件的发生主要源于系统或软件中存在的大量安全漏洞。但是,分析目标的源代码经常难以被直接访问。例如,一些公司购买二进制格式的固件来集成到其产品的硬件中;软件公司利用第三方代码和库来增强其专有代码,而这些库通常不包含源代码;航空航天、军事和银行等特殊生产系统中遗留的程序为二进制格式。在这些场景中,如果要检测错误或分析软件系统的安全性,可执行二进制代码是有关程序内容和行为的唯一信息来源。二进制代码是计算机可以直接解析的编程数据的基本形式,是由流(指令流或字节流)构成的。相比针对源代码的漏洞识别,二进制代码漏洞识别会面临一些更为复杂的挑战,如编译器的影响、反汇编困难、语义信息和符号信息的缺失等。
现有针对二进制代码的漏洞识别主要分为动态方法和静态方法。动态方法只能对程序中的部分代码进行测试,这往往会导致较高的漏报率。不仅如此,动态检测方法耗时较长,因而不能适用于大规模软件。现有的静态二进制代码漏洞检测技术大致可分为基于代码相似性的方法和基于漏洞模式的方法。基于代码相似性的方法预先构建已知漏洞代码数据库,然后计算目标代码与已知漏洞代码之间的相似度。当相似度达到一定阈值时,表明目标代码与已知漏洞代码具有相同的漏洞。基于漏洞模式的方法提取漏洞模式或签名,以检测目标代码是否包含这些模式或签名。
现有技术CN112733137A提出了一种基于二进制代码相似性分析的漏洞检测方法,通过将源代码漏洞库编译为二进制文件,然后通过预训练的词嵌入模型生成指令的嵌入向量,接着生成基本块嵌入向量,最后与已知漏洞库中的代码通过相似性计算检测目标二进制文件是否含有漏洞。CN112613040A提出了一种基于二进制程序的漏洞检测方法及相关设备,通过将二进制程序进行反汇编并反编译,然后提取抽象语法树作为特征,并基于Tree-LSTM网络构建孪生网络实现相似性的计算来判断目标函数是否与已知漏洞函数同源,从而实现漏洞检测。现有技术CN111475820A提出了一种基于可执行程序的二进制漏洞检测方法,通过将可执行程序转换为VEX IR中间语言表示,并采用文本切割将VEX代码分成若干个文本片段,接着提取关键字并进行序列化,基于预训练的Word2vec词向量模型将其向量化表示,最后通过构建的Bi-LSTM网络模型检测目标代码是否含有漏洞。CN113297584A提出了一种漏洞检测方法、装置、设备及存储介质,其通过提取程序的伪代码,并利用程序切片提取漏洞代码片段,最后训练一个BiLSTM-attention神经网络用于漏洞的识别。然而,这些静态的二进制代码漏洞识别方法仍然存在一些不足之处:
1)基于代码相似性检测的方法只能检测代码克隆漏洞,而对于具有不同代码结构,但是有相似漏洞触发逻辑的再生漏洞的检测则会导致较高漏报。
2)基于汇编代码和中间语言表示提取漏洞特征容易遭受不同架构、不同平台、以及不同编译选项的影响,从而导致漏洞特征的鲁棒性较低,而且汇编代码和中间语言表示含有的高级别的语义结构信息较少,不利于漏洞特征的提取;
3)漏洞的产生往往只与少数指令相关,而无关指令会影响漏洞特征的有效性。现有以粗粒度的方式自动提取特征来实现漏洞检测的方法容易受到与漏洞无关的冗余代码、补丁代码的影响,因而会导致误报和漏报较高。其中,体量大的冗余代码会较大程度掩盖漏洞代码,而补丁代码相对于漏洞代码只有少数指令的变化,这种轻微改变会导致以粗粒度提取的特征难以被区分是否存在漏洞。
4)未考虑代码中多维度的漏洞特征信息,如语义信息,结构信息等,这些特征之间往往也存在潜在关联信息。而且,在结构信息方面,往往也只考虑了单一的信息,并未考虑多种类型的结构特点。这些多维度的特征信息有助于进一步挖掘关键漏洞特征。
因此,现有的二进制代码漏洞识别方法已经不能满足当前对高精度漏洞检测的需求,特别是在二进制代码是通过不同的编译选项编译而成,这导致原有检测技术的检测精度更低。这迫切需要一种新的方法能够识别更多类似的漏洞,且能够抵抗不同编译选项和无关代码的影响。
发明内容
本发明的目的旨在于提供一种基于切片代码依赖图语义学习的漏洞识别方法,解决漏洞特征提取时易受与漏洞无关的冗余代码和补丁代码的影响导致漏洞识别结果高漏报和高误报的问题,能够同时用于克隆漏洞和再生漏洞的检测。
为实现上述目的,本发明提供如下技术方案:一种基于切片代码依赖图语义学习的漏洞识别方法,所述方法包括:
步骤S1:输入一个可执行的二进制程序,利用反编译技术获得二进制程序中每个函数的伪代码;
步骤S2:对每个伪代码函数中的危险library/API函数调用执行过程内和过程间的数据依赖分析和控制依赖分析,提取只与危险library/API函数调用相关的细粒度伪代码片段,并以此构建切片代码依赖图;
步骤S3:将得到的与危险library/API函数调用相关的细粒度切片代码依赖图中的伪代码语句进行向量化表征,并采用多场景策略实现图数据的预处理;
步骤S4:将所述向量化的切片代码依赖图输入预训练的语义学习模型中进行检测,以检测所述待检测代码片段是否包含漏洞,以及识别漏洞的类型。
与现有技术相比,本发明的有益效果是:
1)在二进制代码的高级别表示方面,现有技术中对二进制代码的表述通常是将一个二进制程序反汇编后将得到对应的汇编代码,但是汇编代码中每条指令包含的语义信息较少,且容易受到不同架构、不同平台、以及不同编译选项的影响。本发明为了避免受制于传统反编译方法的缺陷,使本发明的漏洞识别方法能够用于跨架构、跨平台的二进制代码漏洞识别场景,提出将待检检测二进制代码直接进行反编译操作获得相应的伪代码,伪代码的优势在于:其与常见的C代码类似,相比汇编代码和中间语言具有更多高级别的语义结构信息,且能有效的抵抗由于代码编译过程中编译选项的差异所导致代码表示易受变化的影响,提高了漏洞特征的鲁棒性。
2)针对危险library/API函数调用位置,在同时考虑前向和后向的基础上采用数据流分析和控制流分析,可以挖掘出更完备的与漏洞相关的代码语句。并进一步的考虑过程间信息,解决了跨函数漏洞的相关代码语句的提取。相比于以整个函数作为输入,本发明更能有效抵抗与漏洞无关的冗余代码和补丁代码的影响。相比现有程序切片技术提取漏洞特征,本发明考虑了更多的依赖关系,改善了提取的漏洞代码片段的完备性。
3)将切片代码转换为切片代码依赖图,并保留代码之间的控制依赖关系和数据依赖关系,相比文本序列能够包含更多的结构信息。而且在对图结构数据进行归一化时,相比直接将尾部多余向量进行裁剪的方法,本发明采用一种更细粒度的策略,考虑切片代码依赖图的不同组成情况分两类,每类细分四种场景分别进行归一化操作,避免了因为裁剪导致漏洞关键信息大量缺少的问题。
4)利用基于多边属性的图神经网络语义学习模型对切片代码依赖图进行自动化的特征提取与多分类检测,可以有效的保留图数据中不同边所具有的特定潜在信息。相比基于特征匹配方法,本发明能够有效降低人工成本,提升检测的效率,且能够实现更低误报和漏报的漏洞检测和漏洞类型的识别。
附图说明
为了更清楚地说明本发明实施例中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例。
图1为本发明的检测技术整体结构的架构图;
图2为本发明提取漏洞代码片段依赖图的流程示例图;
图3为本发明代码片段向量化映射的流程示例图;
图4为本发明语义学习模型的神经网络结构图。
具体实施方式
为了使本发明所要解决的技术问题、技术方案及有益效果更加清楚明白,以下结合附图及实施例,对本发明进行进一步详细说明。应当理解,此处所描述的具体实施例仅仅用以解释本发明,并不用于限定本发明。
实施例
图1给出了本发明所述的二进制代码漏洞识别方法的一种流程框架实施例,主要包括二进制代码反编译模块,基于程序切片的代码片段生成模块、伪代码语句表征模块和基于多边属性的图神经网络的语义学习模块,包括以下步骤:
步骤S1:反编译待检测二进制程序,得到所述待检测程序的伪代码。由于本发明所提语义学习模型需要大量标记样本用于训练,因此从开源渠道获取大量有标记的CWE漏洞程序和无漏洞程序作为数据集。优选地,利用Ghidra开源软件逆向框架,并编写Python脚本实现自动化的伪代码提取。
步骤S2:获得反编译的伪代码后,接着构造伪代码的抽象语法树(AbstractSyntax Tree,AST)和程序依赖图(Program Dependency Graph,PDG)。其中,基于AST识别函数内所有调用的危险library/API函数,并以library/API函数调用位置为兴趣点和library/API函数调用的参数为变量来构造切片准则。进而基于切片准则在PDG上执行程序切片来生成切片代码,然后将其组装成代码片段,进而构建切片代码依赖图。在本发明的一个实施例中,程序切片过程的流程图如图2所示。
在本发明实施例中,需要预先定义一个存在高风险的函数集合用于表示哪些library/API函数容易产生漏洞。数据集中归纳总结了常见的66个危险library/API函数:access、alloca、assert、calloc、close、connect、execl、execlp、fclose、fgets、fopen、fprintf、fputc、fread、free、freopen、fscanf、fwrite、getenv、gets、listen、malloc、memcpy、memmove、memset、mkstemp、mktemp、open、popen、printf、putc、putchar、putenv、puts、rand、RAND32、RAND64、realloc、remove、rename、scanf、setsockopt、snprintf、sprintf、sqrt、sscanf、stat、stdThreadLockAcquire、stdThreadLockRelease、strcat、strcmp、strcpy、strdup、strlen、strncat、strncpy、strtol、system、tempnam、time、tmpnam、unlink、usleep、vfprintf、vprintf、wcstombs;
优选地,利用开源joern开源代码分析工具为每个伪代码程序构建AST和PDG。在每个函数的AST基础上,采用数据集匹配的方式检测每个伪代码函数中是否包含危险library/API函数。当在伪代码中检测到数据集中的危险函数时,说明待检测程序存在漏洞风险需要进一步的进行分析,因此将函数信息,危险library/API函数调用位置等信息进行记录构建切片准则集合Y。切片准则集合Y中的每个切片准则{ti,j,k,At,k}∈Y通过下面的操作在PDGi上生成一个向前切片fsi,j,k和一个向后切片bsi,j,k
(i)对于每个参数ae,v∈At,k,通过PDGi获得ti,j,k所在节点n的后继节点,然后识别后继节点中数据依赖于ae,v或控制依赖于n的节点;递归上述过程,直到节点n的后继节点全部判断完毕,所有包含依赖关系的节点都聚合为前向切片;
(ii)对于每个参数ae,v∈At,k,通过PDGi获取ti,j,k所在节点n的前驱节点,然后识别前驱节点中被ae,v数据依赖或n控制依赖的节点;递归上述过程,直到节点n的每个前驱节点被判断完成,所有包含依赖关系的节点被聚合成向后切片;
(iii)循环前面的步骤,直到切片点ti,j,k中的所有参数完成(i)和(ii);在切片点ti,j,k中,每个参数的前向切片被聚合为前向切片fsi,j,k,每个参数的后向切片被聚合为后向切片bsi,j,k
进一步地,在前向切片fsi,j,k和后向切片bsi,j,k的基础上考虑跨函数情况,根据fsi,j,k和fi调用函数的前向切片可以得到过程间前向切片cfsi,j,k,根据向后切片bsi,j,k和fi调用和被调用函数的向后切片获得过程间后向切片cbi,j,k
进一步地,将程序切片psi,j,k中的每条语句表示为单独的节点,依据每条语句之间的数据依赖关系和控制依赖关系构建两类边,以此构建一个切片代码依赖图。
如图2所示,test()函数中包含一个危险library/API函数strcpy(),在其参数“param_1”和“local_1b”上执行前向的数据依赖分析和控制依赖分析可以得到过程间前向切片cfsi,j,k:12→13→14→16;执行后向的数据依赖分析和控制依赖分析可以得到过程间后向切片:1→4→9→12。前面的数字表示了代码语句的行号。
接着依据原始代码语句顺序和删除重复代码语句将cfsi,j,k和cbsi,j,k合并为程序切片psi,j,k。一个完整的程序切片1→4→9→12→12→13→14→16可以通过组装前向切片12→13→14→16和后向切片1→4→9→12获得。其中,第12行是重复的,删除第12行后派生出一个新的语句片段1→4→9→12→13→14→16。然后,提取与行号对应的语句,并将其组装为程序切片代码片段hi,j,k。最后,依据代码顺序和每条语句之间的依赖关系构建一个包含多种边类型的切片代码依赖图,每个节点表示一条代码语句,语句之间的连接关系表示为节点之间的边。
步骤S3:在本发明的一个实施例中,得到完整的切片代码依赖图后,还需要对依赖图中每个节点的伪代码语句进行表征,具体包括规范化处理,向量化映射和多策略归一化,如图3所示。
规范化处理所述处理方法包括:
1、去除伪代码中所有的非ASCII字符以及注释。
因为在反编译过程中,反编译工具会自动添加一些注释。且也会由于反编译中的一些异常情况会导致反编译的伪代码中存在一些非ASCII字符,这些对漏洞检测是无用的或会造成干扰,都需要移除。
2、对变量名、函数名进行符号化处理。
因为伪代码中的变量名称都是反编译器自定义的,虽然命名方式固定,但是其中会涉及到一些内存地址相关的命名,这样会导致词向量模型中的词袋较大,不利于漏洞检测模型的扩展,因此需要将这些变量名再进行统一的符号化处理。
变量名规范化策略为:将变量名用符号“V”+“数字”进行替换,这里的数字指在切片代码中变量首次出现的顺序,从数字1开始,如“V1”。例如,将代码片段中的变量名如local_1b重新命名为V1。
本发明还对函数名进行规范化处理,但是本发明只符号化处理用户自定义的函数名,因为library/API函数名与漏洞是否存在是高相关性的,而用户自定义的名称差异性较大,需要减少这种差异性。规则为:只符号化处理用户自定义的函数,将函数名用符号“F”+“数字”进行替换,这里的数字也是指函数名在切片代码中第一次出现的顺序,但是这里的数字开始值与变量符号化中数字的开始值存在不一致,函数符号化中的数字从0开始如F0,并且函数名“F0”只用于命名切片代码所在的函数,代码片段中出现的自定义函数的符号则从“F1”开始。例如,将切片代码所在函数的名称char*param_1替换为F0,如果代码片段中还存在用户自定义函数则从F1开始替换。
接着将代码切片片段输入词向量模型中,所述词向量模型是经过预先训练的,得到切片代码的向量表示。本发明一个实施例中,将切片代码中的独立字节单元如void、F0作为词输入词向量模型,词向量模型将每一个输入的词都转换为向量,例如vi-1=(0.32,0.69,......,0.12)。所述词向量模型是基于skip-gram模式的Word2Vec词向量模型,词向量模型是经过预先训练,对于训练过程,本发明对采用伪代码词库对基础Word2Vec训练以得到能够用于转换伪代码词向量模型。优选地,其中所述Word2Vec词向量模型参数中窗口大小为5,向量维数为100。
切片代码依赖图中每个节点的代码语句的向量可以基于语句内token的向量聚合得到,为了体现代码语句中不同token的重要性差异,通过引入TD-IDF权值
Figure BDA0004134667200000081
表示每个tokenαt的权重,每个节点的伪代码语句si,f的向量/>
Figure BDA0004134667200000082
可以通过以下公式进行计算:
Figure BDA0004134667200000083
当把每个节点的向量带入原始的切片代码依赖图中,每个节点将附带有一个属性特征,而边的关系保持不变。考虑到每个切片代码依赖图中的节点大小不一致,而且图中含有两种类型的边,因此需要基于不同边的类型对切片代码属性图进行归一化处理,主要包括控制依赖边和数据依赖边,针对两种连接边中的节点的处理方法相同。
进一步地,对节点的归一化处理首先需要定义一个阈值θ来表示切片代码依赖图中控制依赖边中最大节点数量和数据依赖图中最大节点数量,θ设置为50。后续归一化操作步骤如下:
如果控制依赖边(或数据依赖边)中节点的数量d小于θ,则按照切片代码的顺序在图中末尾节点新增向量全为0的节点,使d等于θ,并为新增的节点附加控制依赖边(或数据依赖边);
如果控制依赖边(或数据依赖边)中前向切片片段cfsi,j节点的数量小于θ/2,表示后向切片片段的节点数量过多,此时将按照切片代码的顺序删除向后切片片段中最前面代码的节点,使d等于θ。但是,如果被删除的节点包含两种类型的边,则只删除控制依赖边(或数据依赖边),不删除节点;
如果控制依赖边(或数据依赖边)中后向切片片段cbsi,j节点的数量小于θ/2,表示前向切片片段的节点数量过多,此时将按照切片代码的顺序删除前向切片片段中最后面代码的节点,使d等于θ。但是,如果被删除的节点包含两种类型的边,则只删除控制依赖边(或数据依赖边),不删除节点;
如果控制依赖边(或数据依赖边)中的前向切片片段的节点和后向切片片段的节点的数量相等,此时将按照切片代码的顺序删除切片代码片段中相同数量的最前面的代码片段的节点和最后面的代码片段的节点,使d等于θ。但是,如果被删除的节点包含两种类型的边,则只删除控制依赖边(或数据依赖边),不删除节点;
步骤S4:将上述向量化处理后的切片代码依赖图输入基于多边属性的图神经网络中进行训练和检测,以检测所述待检测程序是否包含漏洞。在本发明一个实施例中,所述检测神经网络如图4所示,主要分为三层:节点注意力层、边注意力层和图注意力层。
其中,节点注意力层主要是通过对同一类型边中的节点进行迭代的信息传播以聚合周围节点的信息,并在其中引入注意力机制突显一个节点在同一条边的路径中具有不同的重要性。
每个节点i的特征首先会经过一个归一化的转换,计算公式如下:
h′i=M·hi
其中,hi是每个节点的特征向量,即
Figure BDA0004134667200000101
M是一个归一化的权值矩阵,h′i是转换后的特征向量。
接着使用一个self-attention来学习节点不同重要性的权值。对于一个给定的节点对(i,j),它们之间通过边Φ∈{Φc,Φd}连接,其中Φc表示控制依赖边,Φd表示数据依赖边,节点对之间的节点注意力值
Figure BDA0004134667200000102
表示节点j对节点i的重要性,计算公式如下:
Figure BDA0004134667200000103
其中,σ是sigmoid激活函数,||是拼接操作,
Figure BDA0004134667200000104
是节点级别的注意力向量。
每个节点的注意力权值系数计算公式如下:
Figure BDA0004134667200000105
最后,每个节点i最终的嵌入向量的计算公式如下:
Figure BDA0004134667200000106
其中,
Figure BDA0004134667200000107
表示通过类别为Φ的边与节点i相连的节点,/>
Figure BDA0004134667200000108
就是最终在Φ类型边上节点i的向量。经过该节点级注意力层后,每个切片代码依赖图中的每个节点将得到两个节点向量/>
Figure BDA0004134667200000109
其中只包含一种边类型的节点的另一种类型边的向量则用0填充。
其中,边注意力层主要是为了将每个节点所包含的不同边的向量进行聚合,考虑到不同类型的边应该有不同的权值,所以,该层的计算公式如下:
Figure BDA00041346672000001010
Figure BDA00041346672000001011
Figure BDA0004134667200000111
其中wΦ表示边Φ的注意力值,q是边注意力向量,W1是权值矩阵,b1是偏置向量,βΦ表示边Φ的注意力权值系数,Z是最终每个节点的向量。
其中,图注意力层是为了将每个节点的向量聚合为最终的图向量,考虑到不同的节点对图向量具有不同的权值,所以,该层的计算公式如下:
Figure BDA0004134667200000112
Figure BDA0004134667200000113
Figure BDA0004134667200000114
其中gi表示图注意力值,u是图注意力向量,W2是权值矩阵,b2是偏置向量,γi表示节点i的注意力权值系数,G是最终的图向量。
最终对G向量采用softmax进行多分类任务实现漏洞的检测。
所述检测神经网络是经过训练得到,所述训练过程与本发明检测方法过程类似,可以相互解释说明。整个训练阶段主要包含四个步骤,第一步、随机选取多个二进制程序,将选取的二进制代码进行反编译操作,以此来获得二进制代码相对应的伪代码。第二步、寻找程序伪代码中的危险函数(可基于本发明上述实施例中的危险函数集合),在伪代码中提取每个函数内的危险library/API函数调用,然后利用程序切片技术提取library/API函数调用的参数的前向切片片段和后向切片片段,然后进行组装并构建切片代码依赖图,图中每个节点的代码语句都与对应的library/API函数调用相关。在训练过程中,分析每个函数的实际漏洞触发代码语句,确认获取的切片代码依赖图是否包含漏洞,并给每个依赖图标记上标签,如果包含漏洞则标记为对应的CWE编号,例如“CWE-121”,表示该代码切片包含漏洞,漏洞类型为CWE-121,即栈缓冲区溢出漏洞,否则标记为“0”;第三步将构建好的切片代码依赖图进行符号化处理,来减少非ASCII字符、注释、自定义函数名以及变量名等造成的差异性影响。训练阶段在这一步还包括将规范化的切片代码进行词法分析,将切片代码依赖图中,每个节点包含的切片代码转换为一系列的token组成的结构体,接着基于所有切片序列的token构建一个语料库。基于该语料库,训练基础的Word2Vec词向量模型,词向量的维度为100。训练好的Word2Vec词向量模型可以将所有的token映射为向量表示,再将这些token的向量表示组装则可以将每个节点转换为向量表示;第四步则是将转换为向量的切片代码依赖图数据输入到基于多边属性的图神经网络进行训练来得到检测神经网络模型。
在检测阶段,本发明的二进制代码漏洞识别方法首先将待检测程序的二进制代码反编译为伪代码。检测伪代码中的危险函数,接着以危险函数为切片点,提取与危险函数调用相关的切片代码并构建切片代码依赖图,其次,将切片代码转换为向量表示,最后将向量化的切片代码依赖图作为输入,通过检测神经网络判断待检测程序是否包含漏洞,以及漏洞的类型。
本发明的方法可用于跨架构、跨平台的二进制代码漏洞识别场景,在二进制代码级别上实现了对漏洞进行细粒度的检测,能够有效地实现自动化的特征提取,缓解不同编译选项,与漏洞无关的冗余代码以及补丁代码造成的高误报影响,拥有着极高的准确率和极低的误报率及漏报率。
需要说明的是,在本文中,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者装置不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者装置所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括该要素的过程、方法、物品或者装置中还存在另外的相同要素。
以上仅为本发明的优选实施例,并非因此限制本发明的专利范围,凡是利用本发明说明书及附图内容所作的等效结构或等效流程变换,或直接或间接运用在其他相关的技术领域,均同理包括在本发明的专利保护范围内。

Claims (10)

1.一种基于切片代码依赖图语义学习的漏洞识别方法,其特征在于,所述方法包括:
步骤S1:输入一个可执行的二进制程序,利用反编译技术获得二进制程序中每个函数的伪代码;
步骤S2:对每个伪代码函数中的危险library/API函数调用执行过程内和过程间的数据依赖分析和控制依赖分析,提取只与危险library/API函数调用相关的细粒度伪代码片段,并以此构建切片代码依赖图;
步骤S3:将得到的与危险library/API函数调用相关的细粒度切片代码依赖图中的伪代码语句进行向量化表征,并采用多场景策略实现图数据的预处理;
步骤S4:将所述向量化的切片代码依赖图输入预训练的语义学习模型中进行检测,以检测所述待检测代码片段是否包含漏洞,以及识别漏洞的类型。
2.根据权利要求1所述的一种基于切片代码依赖图语义学习的漏洞识别方法,其特征在于,所述步骤S1中采用一个函数fi(1≤i≤n)是由一个输入一个可执行的二进制程序P={f1,...,fn},利用反编译技术获得二进制程序P中每个函数{f1,...,fn}的伪代码有序的代码语句组成,定义为fi={si,1,...,si,m};
一条语句si,j(1≤i≤n,1≤j≤m)是由一个有序的token序列集合组成,定义为si,j={ti,j,1,...,ti,j,z}。
3.根据权利要求2所述的一种基于切片代码依赖图语义学习的漏洞识别方法,其特征在于,所述步骤S2的详细步骤如下:
步骤S2.1:为程序P中的每个函数fi(1≤i≤n)构建抽象语法树;
步骤S2.2:为程序P中的每个函数fi(1≤i≤n)构建程序依赖图;
步骤S2.3:定义程序切片的位置和对象,切片位置由一个危险library/API函数集合L=(l1,l2,l3,...,ln)来确定,其中lz表示由于使用不当而容易导致漏洞的library/API函数;
步骤S2.4:对步骤S2.3中对构建的切片准则集合Y中的每个切片准则{ti,j,k,At,k}∈Y生成一个过程间向前切片fsi,j,k和一个过程间向后切片bsi,j,k
(i)对于每个参数ae,v∈At,k,通过PDGi获得ti,j,k所在节点n的后继节点,然后识别后继节点中数据依赖于ae,v或控制依赖于n的节点;递归上述过程,直到节点n的后继节点全部判断完毕,所有包含依赖关系的节点都聚合为前向切片;
(ii)对于每个参数ae,v∈At,k,通过PDGi获取ti,j,k所在节点n的前驱节点,然后识别前驱节点中被ae,v数据依赖或n控制依赖的节点;递归上述过程,直到节点n的每个前驱节点被判断完成,所有包含依赖关系的节点被聚合成向后切片;
(iii)循环前面的步骤,直到切片点ti,j,k中的所有参数完成(i)和(ii);在切片点ti,j,k中,每个参数的前向切片被聚合为前向切片fsi,j,k,每个参数的后向切片被聚合为后向切片bsi,j,k
步骤S2.5:将步骤S2.4中获得的cfsi,j,k和cbsi,j,k合并为程序切片psi,j,k,合并规则如下:
保留这些语句在fi中的顺序并删除重复语句的方式提取出属于函数fi并出现在psi,j,k中的语句;
提取出属于不同函数且出现在psi,j,k中的语句,提取不同函数的语句时,语句的组合顺序如下:
如果函数fi调用函数fq(1≤q≤n,且i≠q),则函数fi中的语句si,j出现在函数fq中的语句sq,w之前;否则,函数fq中的语句sq,w将出现在函数fi中的语句si,j之前;
步骤S2.6:将程序切片psi,j,k中的每条语句表示为单独的节点,依据每条语句之间的数据依赖关系和控制依赖关系构建两类边,以此构建一个切片代码依赖图,表示为SDGi=<Vi,Ei>,其中Vi表示节点集合,每个节点表示一个切片代码的伪代码语句或控制谓词,Ei表示每个节点之间的控制依赖关系或数据依赖关系。
4.根据权利要求3所述的一种基于切片代码依赖图语义学习的漏洞识别方法,其特征在于,所述步骤2.3中,函数集合L中包括66个危险library/API函数:access、alloca、assert、calloc、close、connect、execl、execlp、fclose、fgets、fopen、fprintf、fputc、fread、free、freopen、fscanf、fwrite、getenv、gets、listen、malloc、memcpy、memmove、memset、mkstemp、mktemp、open、popen、printf、putc、putchar、putenv、puts、rand、RAND32、RAND64、realloc、remove、rename、scanf、setsockopt、snprintf、sprintf、sqrt、sscanf、stat、stdThreadLockAcquire、stdThreadLockRelease、strcat、strcmp、strcpy、strdup、strlen、strncat、strncpy、strtol、system、tempnam、time、tmpnam、unlink、usleep、vfprintf、vprintf、wcstombs;
在每个函数fi的ASTi的基础上,通过查找危险library/API函数调用集合L的每个函数名lz来访问函数AST的每个节点ti,j,k
如果ti,j,k匹配了library/API函数调用集合L中的函数,然后获取切片点所在函数的参数集合At,k,并将其加入到切片准则集合Y={ti,j,k,At,k}。
5.根据权利要求4所述的一种基于切片代码依赖图语义学习的漏洞识别方法,其特征在于,所述步骤S2.4中在前向切片fsi,j,k和后向切片bsi,j,k的基础上考虑过程间信息,根据fsi,j,k和fi调用函数的前向切片可以得到过程间前向切片cfsi,j,k,根据向后切片bsi,j,k和fi调用和被调用函数的向后切片获得过程间后向切片cbsi,j,k
6.根据权利要求4所述的一种基于切片代码依赖图语义学习的漏洞识别方法,其特征在于,所述步骤S3详细步骤如下:
步骤S3.1:对每个切片代码依赖图中节点的伪代码语句进行规范化处理,采用的规范化方法如下所示:
从伪代码中删除所有非ASCII字符和注释;
将反编译器定义的变量名递归映射为符号表示,变量名符号化规则为:将变量名用符号“V”+“数字”进行替换,这里的数字指在切片代码中变量首次出现的顺序,从数字1开始;
将函数中用户定义和反编译器定义的函数名递归映射为符号表示,规则为:只符号化处理用户自定义的函数,将函数名用符号“F”+“数字”进行替换;如果代码片段所在函数的函数名是用户定义或反编译器定义的,则函数名会被映射为“F0”;
步骤S3.2:将每个规范化代码片段hi,j,k通过词法分析划分为一个token序列T,其中的每个tokenα使用训练过的词嵌入模型转换为向量表示v(α)并组装;
步骤S3.3:当把每个节点的向量带入原始的切片代码依赖图中,每个节点将附带有一个属性特征,而边的关系保持不变。
7.根据权利要求4所述的一种基于切片代码依赖图语义学习的漏洞识别方法,其特征在于,所述步骤S3.2中,切片代码依赖图中每个节点的代码语句的向量基于语句内token的向量聚合得到,通过TD-IDF权值
Figure FDA0004134667180000041
表示每个tokenαt的权重,每个节点的伪代码语句si,j的向量/>
Figure FDA0004134667180000042
通过以下公式进行计算:
Figure FDA0004134667180000043
8.根据权利要求4所述的一种基于切片代码依赖图语义学习的漏洞识别方法,其特征在于,所述步骤S3.3中对节点的归一化处理首先需要定义一个阈值θ来表示切片代码依赖图中控制依赖边中最大节点数量和数据依赖图中最大节点数量,后续归一化操作步骤如下:
如果控制依赖边或数据依赖边中节点的数量d小于θ,则按照切片代码的顺序在图中末尾节点新增向量全为0的节点,使d等于θ,并为新增的节点附加控制依赖边或数据依赖边;
如果控制依赖边或数据依赖边中前向切片片段cfsi,j节点的数量小于θ/2,表示后向切片片段的节点数量过多,此时将按照切片代码的顺序删除向后切片片段中最前面代码的节点,使d等于θ;但是,如果被删除的节点包含两种类型的边,则只删除控制依赖边或数据依赖边,不删除节点;
如果控制依赖边或数据依赖边中后向切片片段cbsi,j节点的数量小于θ/2,表示前向切片片段的节点数量过多,此时将按照切片代码的顺序删除前向切片片段中最后面代码的节点,使d等于θ;但是,如果被删除的节点包含两种类型的边,则只删除控制依赖边或数据依赖边,不删除节点;
如果控制依赖边或数据依赖边中的前向切片片段的节点和后向切片片段的节点的数量相等,此时将按照切片代码的顺序删除切片代码片段中相同数量的最前面的代码片段的节点和最后面的代码片段的节点,使d等于θ;但是,如果被删除的节点包含两种类型的边,则只删除控制依赖边或数据依赖边,不删除节点。
9.根据权利要求1所述的一种基于切片代码依赖图语义学习的漏洞识别方法,其特征在于,所述步骤S4中图神经网络分为三层注意力层:节点注意力层、边注意力层和图注意力层。
10.根据权利要求9所述的一种基于切片代码依赖图语义学习的漏洞识别方法,其特征在于,所述节点注意力层是通过对同一类型边中的节点进行迭代的信息传播以聚合周围节点的信息,并在其中引入注意力机制突显一个节点在同一条边的路径中具有不同的重要性;
每个节点i的特征首先会经过一个归一化的转换,计算公式如下:
h′i=M·hi
其中,hi是每个节点的特征向量,即
Figure FDA0004134667180000051
M是一个归一化的权值矩阵,h′i是转换后的特征向量;
接着使用一个self-attention来学习节点不同重要性的权值;对于一个给定的节点对(i,j),它们之间通过边Φ∈{Φc,Φd}连接,其中Φc表示控制依赖边,Φd表示数据依赖边,节点对之间的节点注意力值
Figure FDA0004134667180000052
表示节点j对节点i的重要性,计算公式如下:
Figure FDA0004134667180000053
其中,σ是sigmoid激活函数,||是拼接操作,
Figure FDA0004134667180000054
是节点级别的注意力向量;
每个节点的注意力权值系数计算公式如下:
Figure FDA0004134667180000055
最后,每个节点i最终的嵌入向量的计算公式如下:
Figure FDA0004134667180000061
其中,
Figure FDA0004134667180000062
表示通过类别为Φ的边与节点i相连的节点,/>
Figure FDA0004134667180000063
就是最终在Φ类型边上节点i的向量;经过该节点级注意力层后,每个切片代码依赖图中的每个节点将得到两个节点向量/>
Figure FDA0004134667180000064
其中只包含一种边类型的节点的另一种类型边的向量则用0填充。
CN202310252103.6A 2023-03-10 2023-03-10 一种基于切片代码依赖图语义学习的漏洞识别方法 Pending CN116305158A (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN202310252103.6A CN116305158A (zh) 2023-03-10 2023-03-10 一种基于切片代码依赖图语义学习的漏洞识别方法

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN202310252103.6A CN116305158A (zh) 2023-03-10 2023-03-10 一种基于切片代码依赖图语义学习的漏洞识别方法

Publications (1)

Publication Number Publication Date
CN116305158A true CN116305158A (zh) 2023-06-23

Family

ID=86795631

Family Applications (1)

Application Number Title Priority Date Filing Date
CN202310252103.6A Pending CN116305158A (zh) 2023-03-10 2023-03-10 一种基于切片代码依赖图语义学习的漏洞识别方法

Country Status (1)

Country Link
CN (1) CN116305158A (zh)

Cited By (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN117235741A (zh) * 2023-11-13 2023-12-15 仟言科技(佛山)有限公司 一种基于人工智能的低代码安全系统
CN117473510A (zh) * 2023-12-26 2024-01-30 南京邮电大学 一种基于图神经网络和漏洞补丁关系的自动化漏洞挖掘技术
CN117725422A (zh) * 2024-02-07 2024-03-19 北京邮电大学 程序代码漏洞检测模型训练方法及检测方法
CN118605885A (zh) * 2024-05-24 2024-09-06 南京航空航天大学 一种反编译场景下的标识符名称恢复方法

Cited By (7)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN117235741A (zh) * 2023-11-13 2023-12-15 仟言科技(佛山)有限公司 一种基于人工智能的低代码安全系统
CN117235741B (zh) * 2023-11-13 2024-02-23 仟言科技(佛山)有限公司 一种基于人工智能的低代码安全系统
CN117473510A (zh) * 2023-12-26 2024-01-30 南京邮电大学 一种基于图神经网络和漏洞补丁关系的自动化漏洞挖掘技术
CN117473510B (zh) * 2023-12-26 2024-03-26 南京邮电大学 一种基于图神经网络和漏洞补丁关系的自动化漏洞挖掘技术
CN117725422A (zh) * 2024-02-07 2024-03-19 北京邮电大学 程序代码漏洞检测模型训练方法及检测方法
CN117725422B (zh) * 2024-02-07 2024-05-07 北京邮电大学 程序代码漏洞检测模型训练方法及检测方法
CN118605885A (zh) * 2024-05-24 2024-09-06 南京航空航天大学 一种反编译场景下的标识符名称恢复方法

Similar Documents

Publication Publication Date Title
Harer et al. Automated software vulnerability detection with machine learning
Cheng et al. Deepwukong: Statically detecting software vulnerabilities using deep graph neural network
CN109426722B (zh) Sql注入缺陷检测方法、系统、设备及存储介质
US10585780B2 (en) Enhancing software development using bug data
US11775414B2 (en) Automated bug fixing using deep learning
CN111611586B (zh) 基于图卷积网络的软件漏洞检测方法及装置
CN109885479B (zh) 基于路径记录截断的软件模糊测试方法及装置
Cheng et al. Static detection of control-flow-related vulnerabilities using graph embedding
CN116305158A (zh) 一种基于切片代码依赖图语义学习的漏洞识别方法
CN117951701A (zh) 用于确定软件代码中的缺陷和漏洞的方法
CN112364352B (zh) 可解释性的软件漏洞检测与推荐方法及系统
CN109670318B (zh) 一种基于核控制流图循环验证的漏洞检测方法
CN115357904B (zh) 一种基于程序切片和图神经网络的多类漏洞检测方法
US20230075290A1 (en) Method for linking a cve with at least one synthetic cpe
Ferrag et al. Securefalcon: The next cyber reasoning system for cyber security
CN115033890A (zh) 一种基于对比学习的源代码漏洞检测方法及系统
Shakya et al. Smartmixmodel: machine learning-based vulnerability detection of solidity smart contracts
Wu et al. Code vulnerability detection based on deep sequence and graph models: A survey
CN117454387A (zh) 基于多维度的特征提取的漏洞代码检测方法
CN112115326A (zh) 一种以太坊智能合约的多标签分类和漏洞检测方法
Liu et al. Source Code Vulnerability Detection: Combining Code Language Models and Code Property Graphs
Liu et al. Prompt Learning for Multi-Label Code Smell Detection: A Promising Approach
Song et al. HGIVul: Detecting inter-procedural vulnerabilities based on hypergraph convolution
CN115129896B (zh) 基于对比学习的网络安全应急响应知识图谱关系提取方法
CN116595537A (zh) 一种基于多模态特征的生成式智能合约的漏洞检测方法

Legal Events

Date Code Title Description
PB01 Publication
PB01 Publication
SE01 Entry into force of request for substantive examination
SE01 Entry into force of request for substantive examination