CN115270136A - 一种基于二元组的漏洞克隆检测系统及方法 - Google Patents
一种基于二元组的漏洞克隆检测系统及方法 Download PDFInfo
- Publication number
- CN115270136A CN115270136A CN202210907348.3A CN202210907348A CN115270136A CN 115270136 A CN115270136 A CN 115270136A CN 202210907348 A CN202210907348 A CN 202210907348A CN 115270136 A CN115270136 A CN 115270136A
- Authority
- CN
- China
- Prior art keywords
- vulnerability
- function
- hash
- binary
- cve
- 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
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F21/00—Security arrangements for protecting computers, components thereof, programs or data against unauthorised activity
- G06F21/50—Monitoring users, programs or devices to maintain the integrity of platforms, e.g. of processors, firmware or operating systems
- G06F21/57—Certifying or maintaining trusted computer platforms, e.g. secure boots or power-downs, version controls, system software checks, secure updates or assessing vulnerabilities
- G06F21/577—Assessing vulnerabilities and evaluating computer system security
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F11/00—Error detection; Error correction; Monitoring
- G06F11/36—Preventing errors by testing or debugging software
- G06F11/3604—Software analysis for verifying properties of programs
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F2221/00—Indexing scheme relating to security arrangements for protecting computers, components thereof, programs or data against unauthorised activity
- G06F2221/03—Indexing scheme relating to G06F21/50, monitoring users, programs or devices to maintain the integrity of platforms
- G06F2221/033—Test or assess software
Landscapes
- Engineering & Computer Science (AREA)
- Computer Hardware Design (AREA)
- General Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Computer Security & Cryptography (AREA)
- Software Systems (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Computing Systems (AREA)
- Quality & Reliability (AREA)
- Stored Programmes (AREA)
Abstract
本发明涉及一种基于二元组的漏洞克隆检测系统及方法,包括:漏洞特征库的生成模块,漏洞克隆检测模块和结果过滤生成模块;漏洞特征库的生成模块,从漏洞函数以及打补丁函数中获取与漏洞有关的语句,这些语句经过标准化以及抽象表示之后,成为特定漏洞的特征;漏洞克隆检测阶段,将被测项目进行抽象处理,与漏洞特征库进行匹配,得到检测出的漏洞;结果过滤生成模块,采用过滤器,以CVE为单元,对检测出的漏洞进一步分析处理,如果结果中包含所有的漏洞函数,则判定是一个与所述CVE一样的漏洞,如果包含部分,则是一个不确定的结果。本发明减少信息冗余同时降低检测的误报率;同时,进一步准确判断检测结果是否是一个完整的漏洞。
Description
技术领域
本发明涉及一种基于二元组的漏洞克隆检测系统及方法,属于漏洞检测技术领域。
背景技术
开源软件的漏洞克隆检测一直以来都是软件分析领域的热点研究问题之一。随着互联网技术的不断推进发展,网络信息安全成为了人们越来越关注的问题。但与此同时,互联网中暴露出来的漏洞数量也呈现逐年增加的趋势。另外,在计算机领域,许多企业利用开源软件形成了独有的商业模式,据统计,有99%的企业在其IT系统中使用了开源软件。开源成为了如今计算机发展的大趋势。开源软件的不断流行壮大的同时,与开源软件相关的漏洞数量也在增长壮大。这主要是因为,在开源代码的克隆复用时,可能会将那些漏洞代码带到正在开发的系统中。这就导致了一个漏洞的隐蔽的广泛传播。从攻击者的角度来看,开源软件安全漏洞很容易从互联网中获得,这导致了攻击者可以根据官方发布的补丁细节进行有针对性的攻击设计。可以看到,尽可能的认识开源软件的漏洞克隆不仅可以提高软件自身的安全性,而且还可以控制漏洞在开源软件代码重用时的传播。所以开发漏洞克隆检测系统快速准确的检测出系统中存在的已知漏洞是应对软件安全风险,减少由漏洞造成的各种损失的有效措施。
目前,依据漏洞的分析方法,软件漏洞检测可以分为基于模式匹配的方法和基于代码相似性匹配的方法。开源软件对于源码的获取具有天然的便利性,所以本系统主要是针对源码的漏洞检测。
在早期的研究中,一些算法寻求在找出特定类型漏洞的独特模式,在被测代码中找到匹配这个模式的部分,即判定为存在漏洞。但是这种检测方法,首先时漏洞模式的产生,主要依据安全专家的经验,因此主观性强。针对每种类型的抖动,都需要设计不同的检测模式,设计复杂。规则的不完善也会导致检测的不准确。另一种检测算法就是根据与漏洞相似的代码很有可能也含有漏洞这一思想,设计出一种方法能比较出来代码的相似性。
针对开源软件的漏洞检测问题,有一些基于代码相似性的方法来处理这个问题。ReDeBug能够迅速发现操作系统规模代码库中未打补丁的漏洞代码。它使用特征散列法编码位向量中的n个标记,使ReDeBug以十分高效的方式执行相似性检测。SecureSync采用扩展的抽象语法树(xAST)来表征漏洞代码段,用于复制源码的再现漏洞检测。CBCD用子图同构匹配来确定缺陷代码的PDG是否是软件系统PDG的子图,并提供了4种PDG查询的优化方法。Vuddy将函数作为基本检测粒度,对漏洞函数中的类型名、变量名、函数名进行统一替换来确保对于漏洞代码克隆的检测。Song等人采用程序切片的方式,提取与漏洞有关的语句块进行匹配。
现有的基于代码相似性的源码漏洞克隆检测中,由于抽象语法树,数据流图,控制流图,程序依赖图对于代码的抽象不够全面,因此找到的漏洞特征不够完整。所以根据以上几种方案设计的检测方法,对漏洞的检测性能不高。而代码属性图结合了以上几种抽象结构,所以能够获取到足够多的代码结构特征。但是由于获取的抽象信息过多,会有很多的冗余,因此检测的速度包括准确率都不够高。
还有就是现有的检测方法,都是以函数为单位进行报告。但是,一个漏洞往往涉及多个函数,仅仅只有部分漏洞函数被匹配上,也不能判定其是一个漏洞。
总之,当前漏洞克隆检测方法中,基于文本的方法只需要对代码进行词法分析,文本所包含的代码信息过少。抽象语法树虽然能获得比文本表示更多的代码结构信息,但是抽象语法树的结构复杂,进行大规模软件的漏洞检测成本很高。代码属性图所包含的代码结构信息相较于抽象语法树来说更加的完整,但图相似的计算同样复杂,本发明首次使用二元组将代码属性图中的信息表示出来,将子图匹配问题转化为二元组匹配问题,极大简化了计算过程,提高检测效率,使其能够应用在较大规模软件。
另外,当前的漏洞检测是以函数为单位报告检测结果,但是一个漏洞形成原因是复杂的,漏洞的修复往往涉及多个函数。当一个CVE涉及到多个函数时,可能在被测项目中只能匹配到该CVE包含的一部分漏洞函数。虽然包含了一部分漏洞代码,但是这部分函数的漏洞性已经消失了,也即不存在漏洞。那报告出来的这个函数检测结果也就是没有意义的。因此我们需要对检测结果一个一个检查筛选,确定报告的结果是否一定包含一个漏洞。所以针对于一个漏洞涉及多个函数的情况,本方法在检测过程中,增加一个面向CVE的漏洞分析整合过程。
[1]JANG J,AGRAWAL A,BRUMLEY D.ReDeBug:finding un-patched code clonesin entire OS distributions[C]//2012IEEE Symposium on Security and Privacy(S&P).2012:48-62.
[2]李赞,边攀,石文昌,等.一种利用补丁的未知漏洞发现方法[J].软件学报,2018,29(5):1199-1212.LI Z,BIAN P,SHI W C,et al.Approach of leveraging patchestodiscover unknown vulnerabilities[J].Journal of Software,2018,29(5):1199-1212.
[3]Kim S,Woo S,Lee H,et al.VUDDY:A Scalable Approach for VulnerableCode Clone Discovery[C]//2017IEEE Symposium on Security and Privacy(SP).IEEE,2017.
[4]Song X,Yu A,Yu H,et al.Program Slice Based Vulnerable Code CloneDetection[C]//2020IEEE 19th International Conference on Trust,Security andPrivacy in Computing and Communications(TrustCom).IEEE,2020.
发明内容
本发明技术解决问题:克服现有技术的不足,提供一种基于二元组的漏洞克隆检测系统及方法,减少信息冗余同时降低检测的误报率;同时,进一步准确判断检测结果是否是一个完整的漏洞。
本发明技术解决方案:一种基于二元组的漏洞克隆检测系统,包括:漏洞特征库的生成模块,漏洞克隆检测模块和结果过滤生成模块;
漏洞特征库的生成模块,首先根据漏洞函数和打补丁后的函数分别生成代码属性图,然后根据代码属性图,获取与漏洞有关的语句,这些语句经过标准化以及抽象表示之后,得到漏洞特征信息,最终形成漏洞特征库;
漏洞克隆检测阶段,将被测项目进行抽象处理,首先获取被测项目中的函数,然后对函数进行处理,生成代码属性图,对代码属性图进一步抽象表示,最后,与漏洞特征库进行匹配,得到检测出的漏洞;
结果过滤生成模块,采用过滤器,以CVE为单元,对检测出的漏洞进一步判断,如果检测出的漏洞的结果中包含一个CVE-ID中所涉及的所有的漏洞函数,则判定是一个与所述CVE一样的漏洞,如果包含部分漏洞函数,则是一个不确定的结果。
所述漏洞特征库的生成模块具体实现如下:
(1)首先,获取CVE(Common Vulnerabilities&Exposures,通用漏洞披露)给出的漏洞对应的漏洞函数和打补丁函数;在NVD网站上,对于每一个CVE,都会公布其相关资源网址,在NVD网站上获取json格式的CVE数据集,然后处理数据集,由于本发明只用来检测C/C++代码,因此筛选出来与C/C++相关的CVE信息;筛选出来的CVE中,包含着CVE编号,补丁网址,描述信息;根据补丁网址,去获取对应的补丁,以及漏洞函数;根据补丁以及漏洞函数,将漏洞函数进行修改,最终获取打补丁函数;在获取到漏洞函数和打补丁函数之后,分别对两个函数进行标记;在两个函数标记完之后,处理获得两个函数的代码属性图;
(2)对获取到漏洞函数BadFunc和打补丁函数GoodFunc进行处理,获取两个函数代码属性图,具体为:使用joern对函数进行扫描,然后漏洞函数和打补丁函数经过处理之后均得到两个文件,即节点文件和边文件;节点文件中包括节点关键字,节点信息,节点类型;边文件中包括两个节点之间的边类型,包含FLOW_TO,USE八种类型;根据这两个文件,将两个函数分别抽象为两个二元组表示集合,二元组定义如下:[Code1_out,Code2_in],其中,二元组中的两个语句顺利不能改变,因为其中隐含着其控制流或者数据流关系;
(3)在漏洞函数BadFunc和打补丁函数GoodFunc中获取以标记“+”和标记“-”为核心的语句的所有相关的二元组表示,这一过程被称之为“切片”,整合获取的所有二元组,漏洞函数中获取的二元组表示集合称为漏洞函数切片集合,打补丁函数中获取的二元组表示集合称为补丁函数切片集合。对于这两个集合,再次进行分类,分类规则如下:
Cc=Vuls∩Pats
Bc=Cc∩Vuls
Gc=Cc∩Pats
其中,C_c指既出现在漏洞函数切片的集合中,也出现在打补丁函数的切片集合中的二元组,B_c指只出现在漏洞函数的切片集合中的二元组,G_c指只出现在打补丁函数的切片集合中的二元组;
(4)对每个集合中的二元组进行标准化处理,将二元组表示为一个32位的哈希值,对于每个漏洞函数来说,漏洞特征有以下五部分组成:
{CVE_ID#Funcname,Funchash,C_c_hash,B_c_hash,G_c_hash})
其中,CVE_ID#funcname指的是漏洞的函数名,Funchash指的是漏洞函数进行hash之后的函数体hash值,C_c_hash指的是C_c进行hash后的二元组hash值,B_c_hash指的是B_c进行hash后的二元组hash值,G_c_hash指的是G_c进行hash后的二元组hash值;
(5)最终,针对每个漏洞函数提取的各种特征,采用JSON数据格式进行存储,以函数为单位,组织漏洞特征,一个函数对应一条记录,存储最终得到的漏洞特征信息,从而形成漏洞特征库。
所述漏洞克隆检测阶段模块具体实现如下:
(1)首先是对被测项目进行处理,获取被测项目中的被测函数,具体的提取函数的过程包括:解析提取出文件名,函数名,函数中的变量列表,参数名列表,数据类型列表包括用户自定义的变量类型,函数调用列表和函数体;将上述解析提取的函数内容保存为以函数为单位的文件,文件名命名格式如下:文件路径#~文件名$~函数名$函数在文件中范围;
(2)将函数提取保存之后,对函数进行抽象处理,生成代码属性图,之后对代码属性图信息进行压缩,代码属性图是一个有向图,图中的结点包含代码语句,边包含代码之间的控制和依赖关系,将代码属性图按结点先后顺序,同一条有向边连接的两条代码语句为二元组元素,抽象出二元组,再对二元组进行标准化处理,利用hash算法—FNV-1a对二元组进行hash,生成二元组hash,方便后续的检测操作;
(3)最后的检测过程是以将被测函数抽象生成的hash与漏洞特征库中的hash进行比较匹配,具体的实现过程是:首先将被测函数的hash与漏洞特征库中的C_c_hash进行比较,通过比较确定被测函数是否与特定漏洞具有有关性,如果与特定漏洞有关,则才需要进一步判断被测函数是否是一个漏洞函数;如果被测函数的hash与漏洞独有特征的二元组集合B_c_hash更符合,而与补丁函数特征的二元组集合G_c_hash符合度不高,则确定该函数是一个漏洞函数。最终该被测函数会被标记为漏洞函数,被测项目中包含该漏洞。该被测函数会放入漏洞列表中。
所述结果过滤生成模块中的具体实现如下:
(1)对收集到的所有漏洞函数重新进行以CVE为单位的组织,生成JSON文件cve_write.json,文件中的数据组织形式如下:
{CVE_ID:[CVE_ID#funcname1,CVE_ID#funcname2,……]};
CVE_ID指的是CVE官方发布的漏洞编号,CVE_ID#funcname1指的是该CVE所涉及的函数名称,漏洞特征库中的内容再组织是为了方便后续的结果过滤;
(2)最后,将漏洞克隆检测阶段得到的检测结果与上述文件比较,将文件内容视为集合,进行集合与集合之间的包含关系的计算,如果检测结果中包括了CVE_ID下的所有函数,则判定在被测项目中,一定存在此CVE_ID给出的漏洞,将该漏洞作为一个被测项目中确定存在的漏洞报告给安全人员,安全人员直接按照漏洞官方网站给出的补丁进行修复即可,否则不能直接判定被测项目中存在该漏洞,这些检测出来的函数就会被报告为疑似漏洞。
本发明的一种基于二元组的漏洞克隆检测方法,步骤为:
(1)首先是漏洞特征库的生成部分,将漏洞函数和打补丁函数分别生成代码属性图,得到漏洞函数代码属性图和打补丁函数代码属性图;以漏洞官方网站给出的漏洞标记语句为中心,根据属性图中的语句关系,分别在两个属性图中得到漏洞语句代码的相关语句的子图,具体实现为:首先根据发布的补丁,找到补丁中打上标记的与漏洞直接相关的语句,然后以这些语句为中心点,找到漏洞函数代码属性图中与这些语句相关的语句所生成的子图;这一步的主要目的就是减少代码中的干扰语句,也就是与漏洞无关的语句。再将找到的这两个漏洞函数代码属性图的子图抽象成二元组,二元组中的内容为向图中的含有顺序关系的两个语句,这一步是将子图进一步压缩,减少冗余信息,这样匹配的时候复杂度远小于图匹配;将这些二元组利用hash函数进行hash计算得到对应的hash值,将这些二元组hash分为三个集合,分别为删除语句相关的语句切片二元组hash集合、增加语句相关的语句切片二元组hash集合、与删除与增加语句都相关的语句切片二元组hash集合,这一步的主要目的就是方便在检测过程中,先筛选出有漏洞代码的函数,然后筛选出可能是漏洞的函数,再确认是否是一个漏洞函数;
(2)然后在检测过程中,首先是对被测项目中的函数进行提取,然后对于被测函数,首先生成代码属性图,然后将代码属性图中的所有语句结点对抽象为二元组,然后将二元组进行hash计算得到对应hash值,对于被测函数生成的所有二元组hash,首先匹配与删除与增加语句都相关的语句切片二元组hash集合,如果达到设定的阈值1,则接着匹配漏洞特征库中的与删除语句相关语句二元组hash集合,如果达到设定的阈值2,则最后匹配增加语句相关的语句切片二元组hash集合,如果满足阈值3则结束检测过程,判定该被测函数是一个漏洞函数。如果三个匹配条件不能都满足,则该被测函数不是一个漏洞函数;最终得到一个与漏洞库中的漏洞特征匹配上的被测函数,这些函数就是检测出来的在被测项目中出现的漏洞。其中三个阈值是需要通过系统实验确定其值。阈值的确定规则如下:首先是对于阈值1,在实验中我们要保证能将实验数据集中的超99%的漏洞相关的函数筛选出来列为候选函数。对于阈值2,在实验中要把保证由阈值1筛选出来的候选函数中99%的疑似漏洞函数筛选出来。对于阈值3,在实验中发现它只要<1-阈值2,能将漏洞函数和打补丁后的函数有一个很好的检测区分。
(3)将检测的结果分析过滤,由于一个漏洞往往涉及多个文件或函数,以函数为单位检测完项目得到漏洞函数后,需要重新从漏洞整体角度进行分析筛选,以函数为单位的直接结果报告只能判断出被测项目中存在漏洞函数代码的克隆,但是漏洞代码克隆是否能造成一个漏洞需要进一步手动确认;设计一个结果分析过滤器,该过滤器以CVE_ID为单位,通过键值对的形式将一个CVE涉及到的多个函数名保存下来,用于结果分析;最后,所有的分析结果以CVE的形式组织;如果检测结果中包含CVE_ID涉及的所有函数,则直接判定是一个与CVE_ID一样的漏洞,报告会给出一个确定结果列表。如果包含部分,则是一个不确定的结果,报告会给出一个疑似结果列表;这样,直接判定为漏洞的确定结果直接参考CVE官方网站给出的补丁链接进行漏洞修复,只需要对那些疑似漏洞结果进行分析,确认是否需要修复。
本发明与现有技术相比的优点在于:
(1)本发明提出了一种新的基于二元组的漏洞特征表示方法,将漏洞函数和打补丁后的函数分别生成代码属性图。考虑生成的这两个抽象图,首先根据官方发布的补丁,找到补丁中打上标记的与漏洞直接相关的语句,然后以这些语句为中心点,找到属性图中与这些语句相关的语句片段。这一步的主要目的就是减少代码中的干扰语句,也就是与漏洞无关的语句。接下来,将找到的这两个代码属性图的子图抽象成二元组。二元组中的内容主要是有向图中的含有顺序关系的两个语句。这一步主要是讲子图进一步压缩,减少冗余信息。这样匹配的时候复杂度远小于图匹配。随后,将这些二元组分为三个集合。分别为删除语句相关语句集合,增加语句相关语句集合,与删除与增加语句都相关的语句集合。这一步的主要目的就是要在检测过程中,先筛选出有漏洞代码的函数,然后筛选出可能是漏洞的函数,最后确认是否是一个漏洞函数。最后,将检测的结果综合分析,设计一个过滤器,以CVE为单位,如果结果中包含所有的漏洞函数。那么就判定是一个与特定CVE一样的漏洞,如果包含部分,则是一个不确定的结果,能够将获取到的抽象图信息进一步压缩,减小匹配的复杂性。
(2)本发明提出了面向CVE的结果过滤方法,可以将检测结果进一步分析总结,减少人工工作量。
附图说明
图1为本发明系统的整体框图;
图2为本发明的漏洞克隆检测模块实施流程图;
图3为被测函数的处理过程。
具体实施方式
下面结合附图及实施例对本发明进行详细说明。
如图1所示,本发明的系统包含三大模块:漏洞特征库的生成模块,漏洞克隆检测模块和结果过滤生成模块。漏洞特征提取模块,从漏洞函数以及打补丁函数中获取与漏洞有关的语句。这些语句经过标准化以及抽象表示之后,成为特定漏洞的特征;漏洞克隆检测阶段,将被测项目进行抽象处理,与漏洞特征库进行匹配,结果分析报告是指以CVE为单元,对检测出来的这些漏洞进一步分析处理。
下面将详细介绍系统的漏洞特征库生成模块、漏洞克隆检测模块、结果过滤生成模块的实施步骤。
1.漏洞特征库生成模块
首先,获取CVE对应的漏洞函数和打补丁函数。在NVD网站上,对于每一个CVE,都会公布其相关资源网址,首先在NVD网站上获取json格式的CVE数据集,然后处理数据集,筛选出来与C/C++相关的CVE信息。筛选出来的CVE中,包含着CVE编号,补丁网址,描述信息等。根据补丁网址,去获取对应的补丁,以及漏洞函数。打补丁函数没有办法直接得到,根据补丁以及漏洞函数,将漏洞函数进行修改,最终获取打补丁函数。在获取到漏洞函数和打补丁函数之后,需要分别将补丁中以”-”标记的语句重新标记到漏洞函数中,以”+”标记的语句重新标记到打补丁函数中。
在两个函数标记完之后,还要进行处理获得函数的代码属性图,所以在标记时,不能和补丁函数中标记的方法一样,所以将”-”以”//-”标记到语句末尾,”+”做同样的处理。
第二部分就是对获取到漏洞函数(BadFunc)和打补丁函数(GoodFunc)进行处理,获取其代码属性图。使用joern对函数进行扫描,然后每个函数经过处理之后回得到两个文件,一个节点文件,一个边文件。节点文件中包括节点关键字,节点信息,节点类型等,边文件中包括两个节点之间的边类型,包含FLOW_TO,USE等八种类型。根据这两个文件,将函数抽象为一个二元组表示,二元组定义如下:[Code1_out,Code2_in],其中,二元组中的两个语句顺利不能改变。因为其中隐含着其控制流或者数据流关系。
第三部分就是在BadFunc或GoodFunc中,根据获取的二元组,获取以”//-”标记或者”//+”为核心的语句,其切片规则如下:
1)首先对于标记语句,直接进行前向和后向切片。前向切片指的是,在切片时找到标记代码与在二元组Code2位置的代码,将Code1放入前向切片集合。后向切片指的时,在切片时找到标记代码在Code1位置的代码,将Code2放入后向切片集合中,并将此二元组放入漏洞特征集。
2)对于前向切片集合,执行前向切片,并将二元组放入漏洞特征集。
3)对于后向切片集合,执行后向切片,并将二元组放入漏洞特征集。
整合其获取的所有二元组,其中主要是”//-”语句及其切片生成的二元组集合。称之为漏洞函数切片集合(Vulnerability slices,Vul_s),以”//+”语句及其切片生成的二元组集合,称之为补丁函数切片集合(Patch slices,Pat_s)。
对于这两个集合,再次进行分类,定义如下:
Cc=Vuls∩Pats
Bc=Cc∩Vuls
Gc=Cc∩Pats
其中,C_c指的是,既出现在漏洞函数切片的集合中,也出现在打补丁函数的切片集合中的二元组。B_c指的是,只出现在漏洞函数的切片集合中的二元组。G_c指的是只出现在打补丁函数的切片集合中的二元组。
第四部分,就是对每个集合中的二元组进行标准化处理,将其表示为一个32位的哈希值。
最终,对于每个漏洞函数来说,漏洞特征有以下四部分组成:
{CVE_ID#Funcname,Funchash,C_c_hash,B_c_hash,G_c_hash}
2.漏洞克隆检测模块,如图2所示。
整个检测模块包括两大部分,分别是对被测项目处理的源码预处理部分和漏洞检测部分。
首先是对于被测项目的处理,主要是有两步:
1)对文件处理获取函数。要对被测项目中的文件进行处理,得到以函数为单位的数据处理集。处理的过程主要就是遍历所有文件,找出以”.C”,”.Cpp”,”.C*”结尾的文件,分别对这些文件中的函数进行提取。
2)对函数处理获取抽象表示。对上述提取的函数使用Joern进行分析,获取其代码属性图。然后根据代码属性图获取函数中所有语句对,形成函数的二元组集合,对二元组进行抽象和标准化操作,得到能与漏洞特征库匹配的代码表示。具体的被测函数处理过程如图3所示,首先是利用Joern对函数进行分析,得到两个文件Edges file和Nodes file。其中,Edges file保存的是代码属性图中的边属性信息,包含结点和结点之间的边,Nodesfile保存的是结点属性和内容信息,按结点编号给出相应的信息。Nodes file和Edgesfile文件中的信息可以通过结点编号连接起来。得到代码属性图文件之后,可以从中提取代码属性图中的边连接的两个语句结点,形成语句二元组(code1,code2)。对这些二元组语句对进行标准化操作,主要就是将变量名、参数名、类型名统一替换为“VAR”,“PARA”,“TYPE”。最后将标准化之后的二元组进行hash计算,每一个二元组得到一个hash值。
然后是检测模块中的漏洞检测部分,主要流程是:
首先,对于被测函数在匹配过程中,要对三个集合分别匹配,设置针对不同集合匹配时的相似度阈值。首先将目标代码与公共上下文集合进行匹配,达到一定的阈值,确认目标代码时一个漏洞敏感函数。与漏洞特征集合进行匹配,达到一定的阈值,发现其可能存在漏洞。最后与打补丁后的特征集合进行匹配,不超过其阈值,确认目标代码是漏洞函数而非打补丁之后的函数。
3.结果过滤生成模块
一个漏洞形成原因是复杂的,漏洞的修复往往涉及多个函数。当一个CVE涉及到多个函数时,可能会出现能匹配一部分漏洞函数,但是这部分函数的漏洞性已经消失了。所以针对于一个漏洞涉及多个函数的情况,在检测过程中,增加一个面向CVE的漏洞分析整合过程。如果一个漏洞涉及多个函数时,如果目标项目中检测到一个漏洞的所有函数时,才能认定其是一个漏洞。如果只检测到部分漏洞函数的话,是无法判断是否是漏洞,所以给出一个疑似漏洞的判定结果。
最终,给出两个文件,一个文件是确定的漏洞检测结果,一个是疑似漏洞检测结果。文件中,以CVE为单元,显示被测函数,漏洞函数名,漏洞函数,以及对应的补丁文件。
以上虽然描述了本发明的具体实施方法,但是本领域的技术人员应当理解,这些仅是举例说明,在不背离本发明原理和实现的前提下,可以对这些实施方案做出多种变更或修改,因此,本发明的保护范围由所附权利要求书限定。
Claims (5)
1.一种基于二元组的漏洞克隆检测系统,其特征在于,包括:漏洞特征库的生成模块,漏洞克隆检测模块和结果过滤生成模块;
漏洞特征库的生成模块,首先根据漏洞函数和打补丁后的函数分别生成代码属性图,然后根据代码属性图,获取与漏洞有关的语句,这些语句经过标准化以及抽象表示之后,得到漏洞特征信息,最终形成漏洞特征库;
漏洞克隆检测阶段,将被测项目进行抽象处理,首先获取被测项目中的函数,然后对函数进行处理,生成代码属性图,对代码属性图进一步抽象表示,最后与漏洞特征库进行匹配,得到检测出的漏洞;
结果过滤生成模块,采用过滤器,以CVE为单元,对检测出的漏洞进一步判断,如果检测出的漏洞的结果中包含一个漏洞编CVE_ID中所涉及的所有的漏洞函数,则判定被测项目中存在一个与所述CVE_ID一样的漏洞,如果包含部分漏洞函数,则是一个不确定的结果。
2.根据权利要求1所述的基于二元组的漏洞克隆检测系统,其特征在于:所述漏洞特征库的生成模块具体实现如下:
(1)首先,获取通用漏洞披露的CVE给出的漏洞对应的漏洞函数和打补丁函数;在NVD网站上,对于每一个CVE公布其相关资源网址,在NVD网站上获取json格式的CVE数据集,然后处理数据集,筛选出CVE信息;筛选出来的CVE信息包含着CVE编号,补丁网址,描述信息;根据补丁网址,去获取对应的补丁,以及漏洞函数;根据补丁以及漏洞函数,将漏洞函数进行修改,最终获取打补丁函数;在获取到漏洞函数和打补丁函数之后,分别对两个函数进行标记;在两个函数标记完之后,处理获得两个函数的代码属性图;
(2)对获取到漏洞函数BadFunc和打补丁函数GoodFunc进行处理,获取两个函数代码属性图,具体为:使用joern对函数进行扫描,然后漏洞函数和打补丁函数经过处理之后均得到两个文件,即节点文件和边文件;节点文件中包括节点关键字,节点信息,节点类型;边文件中包括两个节点之间的边类型,包含FLOW_TO,USE八种类型;根据这两个文件,将两个函数分别抽象为两个二元组表示集合,二元组定义如下:[Code1_out,Code2_in],二元组中的两个语句顺利不能改变,因为其中隐含着其控制流或者数据流关系;
(3)在漏洞函数BadFunc和打补丁函数GoodFunc中获取以标记“+”和标记“-”为核心的语句的所有相关的二元组表示,这一过程被称之为切片,整合获取的所有二元组,漏洞函数中获取的二元组表示集合称为漏洞函数切片集合,打补丁函数中获取的二元组表示集合称为补丁函数切片集合,对这两个集合再次进行分类,分类规则如下:
Cc=Vuls∩Pats
Bc=Cc∩Vuls
Gc=Cc∩Pats
其中,C_c指既出现在漏洞函数切片的集合中,也出现在打补丁函数的切片集合中的二元组,B_c指只出现在漏洞函数的切片集合中的二元组,G_c指只出现在打补丁函数的切片集合中的二元组;
(4)对每个集合中的二元组进行标准化处理,将二元组表示为一个32位的哈希值,对于每个漏洞函数,漏洞特征有以下五部分组成:
{CVE_ID#Funcname,Funchash,C_c_hash,B_c_hash,G_c_hash})
其中,CVE_ID#funcname指的是CVE漏洞的函数名,Funchash指的是漏洞函数进行hash之后的函数体hash值,C_c_hash指的是C_c进行hash后的二元组hash值,B_c_hash指的是B_c进行hash后的二元组hash值,G_c_hash指的是G_c进行hash后的二元组hash值;
(5)最终,针对每个漏洞函数提取的各种特征,采用JSON数据格式进行存储,以函数为单位,组织漏洞特征,一个函数对应一条记录,存储最终得到的漏洞特征信息,从而形成漏洞特征库。
3.根据权利要求1所述的基于二元组的漏洞克隆检测系统,其特征在于:所述漏洞克隆检测阶段模块具体实现如下:
(1)首先是对被测项目进行处理,获取被测项目中的被测函数,提取被测函数的过程包括:解析提取出文件名,函数名,函数中的变量列表,参数名列表,数据类型列表包括用户自定义的变量类型,函数调用列表和函数体;将解析提取的被测函数保存为以函数为单位的文件,文件名命名格式如下:文件路径#~文件名$~函数名$函数在文件中范围;
(2)将被测函数提取保存之后,对被测函数进行抽象处理,生成代码属性图,之后对代码属性图信息进行压缩,所述代码属性图是一个有向图,图中的结点包含代码语句,边包含代码之间的控制和依赖关系,将代码属性图按结点先后顺序,同一条有向边连接的两条代码语句为二元组元素,抽象出二元组,再对二元组进行标准化处理,利用hash算法对二元组进行hash计算,生成二元组hash;
(3)最后的检测过程是以将被测函数抽象生成的hash与漏洞特征库中的hash进行比较匹配,具体过程是:首先将被测函数的hash与漏洞特征库中的C_c_hash进行比较,通过比较确定被测函数是否与某一漏洞具有有关性,如果与某一漏洞有关,则才需要进一步判断被测函数是否是一个漏洞函数;如果被测函数的hash与漏洞独有特征的二元组集合B_c_hash更符合,而与补丁函数特征的二元组集合G_c_hash符合度不高,则确定该函数是一个漏洞函数;最终该被测函数会被标记为漏洞函数,被测项目中包含该漏洞,该被测函数会放入漏洞列表中。
4.根据权利要求1所述的基于二元组的漏洞克隆检测系统,其特征在于:所述结果过滤生成模块中的具体实现如下:
(1)对收集到的所有漏洞函数重新进行以CVE为单位的组织,生成JSON文件,文件内容的组织形式如下:
{CVE_ID:[CVE_ID#funcname1,CVE_ID#funcname2,……]};
CVE_ID指的是CVE官方发布的漏洞编号,CVE_ID#funcname1指的是该CVE所涉及的函数名称,漏洞特征库中的内容再组织是为了方便后续的结果过滤;
(2)将漏洞克隆检测阶段得到的检测结果与JSON文件比较,将JSON文件内容视为集合,进行集合与集合之间的包含关系的计算,如果检测结果中包括了CVE_ID下的所有函数,则判定在被测项目中,存在此CVE_ID给出的漏洞,将该漏洞作为一个被测项目中确定存在的漏洞,报告给安全人员,安全人员直接按照漏洞官方网站给出的补丁进行修复即可,否则不能直接判定被测项目中存在该漏洞,这些检测出来的函数会被报告为疑似漏洞。
5.一种基于二元组的漏洞克隆检测方法,其特征在于:
(1)生成漏洞特征库,将漏洞函数和打补丁函数分别生成代码属性图,得到漏洞函数代码属性图和打补丁函数代码属性图;以漏洞官方网站给出的漏洞标记语句为中心,根据属性图中的语句关系,分别在两个属性图中得到漏洞语句代码的相关语句的子图,再将找到的这两个漏洞函数代码属性图的子图抽象成二元组,具体实现为:首先根据发布的补丁,找到补丁中打上标记的与漏洞直接相关的语句,然后以这些语句为中心点,找到漏洞函数代码属性图中与这些语句相关的语句所生成的子图;再将找到的这两个漏洞函数代码属性图的子图抽象成二元组,二元组中的内容为向图中的含有顺序关系的两个语句;将这些二元组利用hash函数进行hash计算得到对应的hash值,将这些二元组hash分为三个集合,分别为删除语句相关的语句切片二元组hash集合、增加语句相关的语句切片二元组hash集合、与删除与增加语句都相关的语句切片二元组hash集合;
(2)在检测过程中,首先是对被测项目中的被测函数进行提取生成代码属性图,再将代码属性图中的所有语句结点对抽象为二元组,对二元组进行hash计算得到对应hash值;对于被测函数生成的所有二元组hash,首先匹配与删除与增加语句都相关的语句切片二元组hash集合,如果达到设定的阈值1,则接着匹配漏洞特征库中的与删除语句相关语句二元组hash集合,如果达到设定的阈值2,则最后匹配增加语句相关的语句切片二元组hash集合,如果满足阈值3则结束检测过程,判定该被测函数是一个漏洞函数;如果三个匹配条件都不满足,则该被测函数不是一个漏洞函数;最终得到一个与漏洞库中的漏洞特征匹配上的被测函数,这些被测函数则是检测出来的在被测项目中出现的漏洞;
(3)将检测的结果分析过滤,由于一个漏洞往往涉及多个函数,以函数为单位检测完项目得到漏洞函数后,重新从漏洞整体角度进行分析筛选,以函数为单位的直接结果报告只能判断出被测项目中存在漏洞函数代码的克隆,但是漏洞代码克隆是否能造成一个漏洞需要进一步分析;设计一个结果分析过滤器,该过滤器以CVE_ID为单位,通过键值对的形式将一个CVE涉及到的多个函数名保存下来,用于结果分析;所有的分析结果以CVE的形式组织;如果检测结果中包含CVE_ID涉及的所有函数,则直接判定是一个与CVE_ID一样的漏洞,报告会给出一个确定结果列表;如果包含部分,则是一个不确定的结果,报告会给出一个疑似结果列表。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202210907348.3A CN115270136A (zh) | 2022-07-29 | 2022-07-29 | 一种基于二元组的漏洞克隆检测系统及方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202210907348.3A CN115270136A (zh) | 2022-07-29 | 2022-07-29 | 一种基于二元组的漏洞克隆检测系统及方法 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN115270136A true CN115270136A (zh) | 2022-11-01 |
Family
ID=83770849
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202210907348.3A Pending CN115270136A (zh) | 2022-07-29 | 2022-07-29 | 一种基于二元组的漏洞克隆检测系统及方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN115270136A (zh) |
Cited By (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN116226871A (zh) * | 2023-05-08 | 2023-06-06 | 中汽智联技术有限公司 | 基于静态和动态结合的漏洞验证方法、设备和介质 |
-
2022
- 2022-07-29 CN CN202210907348.3A patent/CN115270136A/zh active Pending
Cited By (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN116226871A (zh) * | 2023-05-08 | 2023-06-06 | 中汽智联技术有限公司 | 基于静态和动态结合的漏洞验证方法、设备和介质 |
CN116226871B (zh) * | 2023-05-08 | 2023-08-01 | 中汽智联技术有限公司 | 基于静态和动态结合的漏洞验证方法、设备和介质 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
He et al. | Identifying impactful service system problems via log analysis | |
CN111459799B (zh) | 一种基于Github的软件缺陷检测模型建立、检测方法及系统 | |
US11888881B2 (en) | Context informed abnormal endpoint behavior detection | |
CN109241223B (zh) | 行为行踪识别方法及系统 | |
Xiao et al. | From patching delays to infection symptoms: Using risk profiles for an early discovery of vulnerabilities exploited in the wild | |
CN109670318B (zh) | 一种基于核控制流图循环验证的漏洞检测方法 | |
Xu et al. | Vulnerability detection for source code using contextual LSTM | |
CN106027529A (zh) | 一种基于溯源信息的入侵检测系统及方法 | |
KR20120071834A (ko) | 악성코드 그룹 및 변종 자동 관리 시스템 | |
CN113239365B (zh) | 一种基于知识图谱的漏洞修复方法 | |
CN111881300A (zh) | 面向第三方库依赖的知识图谱构建方法及系统 | |
CN112115326B (zh) | 一种以太坊智能合约的多标签分类和漏洞检测方法 | |
CN113139192A (zh) | 基于知识图谱的第三方库安全风险分析方法及系统 | |
Ashraf et al. | WeFreS: weighted frequent subgraph mining in a single large graph | |
Kim et al. | Automatic abnormal log detection by analyzing log history for providing debugging insight | |
CN115270136A (zh) | 一种基于二元组的漏洞克隆检测系统及方法 | |
Akram et al. | VCIPR: vulnerable code is identifiable when a patch is released (hacker's perspective) | |
CN108959922B (zh) | 一种基于贝叶斯网的恶意文档检测方法及装置 | |
CN117828605A (zh) | 系统漏洞的检测方法、装置、电子设备和存储介质 | |
KR20180077397A (ko) | 소프트웨어 프로젝트 관계도 구성 시스템 및 그 방법 | |
CN116821903A (zh) | 检测规则确定及恶意二进制文件检测方法、设备及介质 | |
Qin et al. | Vulnerability Intelligence Alignment via Masked Graph Attention Networks | |
CN113342632A (zh) | 仿真数据自动化处理方法、装置、电子设备及存储介质 | |
CN111079145B (zh) | 基于图处理的恶意程序检测方法 | |
Chrenousov et al. | Deep learning based automatic software defects detection framework |
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 |