CN112379923B - 漏洞代码克隆检测方法、装置、电子设备和存储介质 - Google Patents
漏洞代码克隆检测方法、装置、电子设备和存储介质 Download PDFInfo
- Publication number
- CN112379923B CN112379923B CN202011444952.4A CN202011444952A CN112379923B CN 112379923 B CN112379923 B CN 112379923B CN 202011444952 A CN202011444952 A CN 202011444952A CN 112379923 B CN112379923 B CN 112379923B
- Authority
- CN
- China
- Prior art keywords
- vulnerability
- function
- detected
- slice
- hash
- 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.)
- Active
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/70—Software maintenance or management
- G06F8/75—Structural analysis for program understanding
- G06F8/751—Code clone detection
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F16/00—Information retrieval; Database structures therefor; File system structures therefor
- G06F16/90—Details of database functions independent of the retrieved data types
- G06F16/95—Retrieval from the web
- G06F16/951—Indexing; Web crawling techniques
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- General Engineering & Computer Science (AREA)
- Software Systems (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Databases & Information Systems (AREA)
- Data Mining & Analysis (AREA)
- Stored Programmes (AREA)
Abstract
本发明提供一种漏洞代码克隆检测方法、装置、电子设备和存储介质,其中方法包括:对待检测函数的代码进行切片,得到多个待检测切片;将所述多个待检测切片与预设漏洞库中存储的漏洞函数对应的所有漏洞切片进行切片匹配,得到所述待检测函数的漏洞代码克隆检测结果;其中,所述漏洞函数对应的漏洞切片中包含所述漏洞函数中需要删除的语句以及与所述需要删除的语句存在依赖关系的其他语句。本发明提供的漏洞代码克隆检测方法、装置、电子设备和存储介质,实现了Type‑3类型的代码克隆检测,提高了漏洞代码克隆检测的全面性和准确性,减少了漏洞的漏检率,且可以准确定位待检测函数中漏洞信息所在的位置。
Description
技术领域
本发明涉及信息安全技术领域,尤其涉及一种漏洞代码克隆检测方法、装置、电子设备和存储介质。
背景技术
随着计算机软件行业的高速发展,开源软件的数量也在不断的增长。相关研究显示,开源软件的数量已由线性增长转换为了非线性增长。在开源软件数量上涨的同时,与开源软件相关的漏洞数量也在增长。
开源软件的发展以及对于快速低成本的开发软件的需求导致了大量代码重用现象的产生。软件开发者为了快速实现需求,会直接在现有代码上进行改动并将其应用在开发的软件中。开源软件的发展虽然可以提高软件开发速度,但是在代码重用的过程中可能会导致一些安全问题的出现。例如,在代码重用过程中,如果开发者重用的代码是有漏洞的代码,就很有可能将这个漏洞引入到正在开发的软件中。所以,开源软件中的漏洞不仅会影响到自身的安全性,还会导致漏洞的扩散,从而影响到其他使用该开源软件的系统的安全性。更为值得注意的是,开源软件的漏洞很容易从互联网中获取到,例如NVD(NationalVulnerability Database)、cve mitre、cve details等网站上会列出CVE条目对应的部分漏洞细节,虽然这一举措有利于开源软件的使用者及时对系统打补丁,提高系统的安全性,但同时也将漏洞信息暴露给了攻击者,攻击者可以根据补丁信息生成针对特定漏洞的攻击方案,对于那些还没有来得及打补丁的软件系统造成潜在威胁。
综上所述,识别软件中的已知漏洞不仅可以提高软件自身的安全性,同时还可以控制漏洞的传播与扩散,降低由于漏洞造成各种损失的潜在可能性,具有十分重要的意义。
目前,识别软件源码中的已知漏洞主要通过代码相似性匹配的方法来实现,即与漏洞代码相似性越高的代码越有可能具有同样的漏洞。代码克隆指在软件系统内部或软件系统之间复制粘贴的代码片段,识别软件源码中已知漏洞的问题可视为找出源码中已知漏洞的代码克隆的问题。代码克隆的类型包括以下几种:(1)Type-1:除空格、格式和注释外,是完全相同的代码片段;(2)Type-2:在Type-1的基础上,除标识符、常量、类型外,在语法或结构上相同的代码段;(3)在Type-2的基础上,改变、增加或删除代码中的少量语句,是语法结构相似的代码片段。
一段漏洞代码的前两种类型的代码克隆较容易被检测到,并且现有方法能够在一个较短的时间内完成检测。其中,ReDeBug提出了一种基于行的漏洞代码克隆检测技术,利用安全补丁查找漏洞。其首先使用固定大小的滑动窗口对源码进行划分,对于每个窗口中的内容利用三个不同的哈希函数计算出三个哈希值,并将这些哈希值存入一个布隆过滤器中;然后使用同样大小的窗口在漏洞代码上滑动,并用与上述相同的三个哈希函数计算哈希值,利用布隆过滤器对这些哈希值进行成员资格测试,如果匹配上说明漏洞代码存在于被测源码中。ReDeBug使用布隆过滤器可以极大的加速检测过程,但是由于其没有对源码进行更多的处理,所以只能检测漏洞代码的Type-1类型的代码克隆。Vuddy提出了一种以函数为粒度的漏洞代码克隆检测技术。首先根据补丁信息将漏洞函数内容提取出来,将漏洞函数以key-value的形式存储在漏洞库中,其中key存储函数在抽象和标准化之后的字符串长度,value存储抽象和标准化之后的字符串的哈希值。在检测被测代码的时候,先将被测代码中的函数提取出来,做同样的抽象和标准化操作,并计算抽象和标准化之后的函数的长度与哈希值;如果长度与漏洞库中某个key值相匹配,则判断被测函数的哈希值是否存在于与key值相对应的value值中,如果存在则匹配,即当前被测函数是漏洞函数。Vuddy利用长度过滤无关代码,进一步提高了检测效率,并且对于代码进行了抽象处理,所以可以检测漏洞代码的Type-1和Type-2类型的代码克隆。
因此,当前大多数漏洞代码克隆的检测算法没有考虑代码中的语义信息,对源码的操作仅限于对变量名、类型名、参数名等替换的抽象操作,以及删除空格、注释等标准化操作,只能检测到漏洞代码的Type-1和Type-2类型的代码克隆,漏报率较高。
发明内容
本发明提供一种漏洞代码克隆检测方法、装置、电子设备和存储介质,用以解决现有技术中只能检测到漏洞代码的Type-1和Type-2类型的代码克隆,漏报率较高的缺陷,实现漏洞代码Type-3类型的代码克隆检测。
本发明提供一种漏洞代码克隆检测方法,包括:
对待检测函数的代码进行切片,得到多个待检测切片;
将所述多个待检测切片与预设漏洞库中存储的漏洞函数对应的所有漏洞切片进行切片匹配,得到所述待检测函数的漏洞代码克隆检测结果;
其中,所述漏洞函数对应的漏洞切片中包含所述漏洞函数中需要删除的语句以及与所述需要删除的语句存在依赖关系的其他语句。
根据本发明提供的一种漏洞代码克隆检测方法,所述漏洞函数对应的漏洞切片是基于如下步骤确定的:
基于所述漏洞函数对应的补丁信息,确定所述漏洞函数中需要删除的语句;
根据所述漏洞函数的程序依赖图的控制流和数据流,提取与所述需要删除的语句存在依赖关系的依赖语句;
其中,所述需要删除的语句与所述依赖语句构成一个漏洞切片。
根据本发明提供的一种漏洞代码克隆检测方法,所述将所述多个待检测切片与预设漏洞库中存储的漏洞函数对应的所有漏洞切片进行切片匹配,具体包括:
对待检测函数的函数体进行抽象和标准化操作,并计算抽象和标准化操作后的函数体的待检测函数体哈希值;
将所述待检测函数体哈希值与所述预设漏洞库中存储的漏洞函数对应的漏洞函数体哈希值进行函数体匹配;
若函数体匹配失败,则将所述多个待检测切片与预设漏洞库中存储的漏洞函数对应的所有漏洞切片进行切片匹配;
其中,漏洞函数体哈希值是将对应漏洞函数的函数体进行抽象和标准化操作后进行哈希运算得到的。
根据本发明提供的一种漏洞代码克隆检测方法,所述将所述多个待检测切片与预设漏洞库中存储的漏洞函数对应的所有漏洞切片进行切片匹配,具体包括:
对每一待检测切片进行抽象和标准化操作,并计算抽象和标准化操作后的每一待检测切片的待检测切片哈希值;
将每一待检测切片哈希值与漏洞函数对应的所有漏洞切片的漏洞切片哈希值进行切片匹配;
其中,漏洞切片哈希值是将对应漏洞切片进行抽象和标准化操作后进行哈希运算得到的。
根据本发明提供的一种漏洞代码克隆检测方法,所述将每一待检测切片哈希值与漏洞函数对应的所有漏洞切片的漏洞切片哈希值进行切片匹配,具体包括:
基于每一待检测切片哈希值,确定所述待检测函数的哈希比特向量;
判断所述漏洞函数对应的所有漏洞切片的漏洞切片哈希值在所述哈希比特向量的对应位置处的比特值是否为1;
若所述漏洞函数对应的所有漏洞切片的漏洞切片哈希值在所述哈希比特向量的对应位置处的比特值均为1,则切片匹配成功。
根据本发明提供的一种漏洞代码克隆检测方法,所述基于每一待检测切片哈希值,确定所述待检测函数的哈希比特向量,具体包括:
初始化所述待检测函数的哈希比特向量;
将所述哈希比特向量中每一待检测切片哈希值对应位置处的值置为1;
其中,所述哈希比特向量中的各个位置与哈希函数对应的哈希值范围内的各个哈希值一一对应。
根据本发明提供的一种漏洞代码克隆检测方法,所述将所述多个待检测切片与预设漏洞库中存储的漏洞函数对应的所有漏洞切片进行切片匹配,得到所述待检测函数的漏洞代码克隆检测结果,具体包括:
若切片匹配成功,则获取匹配成功的漏洞函数对应的漏洞函数信息,作为所述待检测函数的漏洞代码克隆检测结果;
所述漏洞函数信息包括所述匹配成功的漏洞函数对应的漏洞切片中包含的语句行号,以及所述匹配成功的漏洞函数对应的补丁信息。
本发明还提供一种漏洞代码克隆检测装置,包括:
函数切片单元,用于对待检测函数的代码进行切片,得到多个待检测切片;
切片匹配单元,用于将所述多个待检测切片与预设漏洞库中存储的漏洞函数对应的所有漏洞切片进行切片匹配,得到所述待检测函数的漏洞代码克隆检测结果;
其中,所述漏洞函数对应的漏洞切片中包含所述漏洞函数中需要删除的语句以及与所述需要删除的语句存在依赖关系的其他语句。
本发明还提供一种电子设备,包括存储器、处理器及存储在所述存储器上并可在所述处理器上运行的计算机程序,所述处理器执行所述计算机程序时实现如上述任一种所述漏洞代码克隆检测方法的步骤。
本发明还提供一种非暂态计算机可读存储介质,其上存储有计算机程序,所述计算机程序被处理器执行时实现如上述任一种所述漏洞代码克隆检测方法的步骤。
本发明提供的漏洞代码克隆检测方法、装置、电子设备和存储介质,通过将多个待检测切片与预设漏洞库中存储的漏洞函数对应的所有漏洞切片进行切片匹配,得到待检测函数的漏洞代码克隆检测结果;其中,漏洞函数对应的漏洞切片中包含漏洞函数中需要删除的语句以及与需要删除的语句存在依赖关系的其他语句,实现了Type-3类型的代码克隆检测,提高了漏洞代码克隆检测的全面性和准确性,减少了漏洞的漏检率,且可以准确定位待检测函数中漏洞信息所在的位置。
附图说明
为了更清楚地说明本发明或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作一简单地介绍,显而易见地,下面描述中的附图是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
图1为本发明提供的漏洞代码克隆检测方法的流程示意图之一;
图2为本发明提供的漏洞代码克隆检测方法的流程示意图之二;
图3为本发明提供的漏洞代码克隆检测装置的结构示意图;
图4为本发明提供的电子设备的结构示意图。
具体实施方式
为使本发明的目的、技术方案和优点更加清楚,下面将结合本发明中的附图,对本发明中的技术方案进行清楚、完整地描述,显然,所描述的实施例是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
图1为本发明实施例提供的漏洞代码克隆检测方法的流程示意图之一,如图1所示,该方法包括:
步骤110,对待检测函数的代码进行切片,得到多个待检测切片;
步骤120,将多个待检测切片与预设漏洞库中存储的漏洞函数对应的所有漏洞切片进行切片匹配,得到待检测函数的漏洞代码克隆检测结果;
其中,漏洞函数对应的漏洞切片中包含漏洞函数中需要删除的语句以及与需要删除的语句存在依赖关系的其他语句。
具体地,首先提取待检测的源码中各个文件的所有函数,得到所有待检测函数。对于其中任意一个待检测函数,将该待检测函数代码中的所有语句进行切片,得到该待检测函数的多个待检测切片。此处,可以根据该待检测函数的函数内容生成对应的程序依赖图,并依照程序依赖图中的控制流和数据流的关系对该待检测函数的所有语句进行切片,以保证待检测函数的待匹配信息的完整性。其中,任一待检测切片中包含一个或多个语句,且该待检测切片中的所有语句之间存在直接或间接的依赖关系,例如控制逻辑上的依赖关系或者数据流的依赖关系。
然后,将多个待检测切片与预设漏洞库中存储的各个漏洞函数对应的所有漏洞切片进行切片匹配。其中,漏洞库是预先构建好的,其中包含有多个漏洞函数的漏洞信息。漏洞库将作为检测的基准,用于后续的检测过程中,以判断待检测函数中是否含有漏洞代码。漏洞库构建一次就可以重复使用多次,并可以很容易地进行扩充。每个漏洞函数对应一个或多个漏洞切片,每个漏洞切片中包含有对应漏洞函数中需要删除的语句,以及与该需要删除的语句存在直接或间接的依赖关系的其他语句。
此处,需要删除的语句是指漏洞函数中的漏洞代码,或与漏洞代码相关的代码。由于漏洞切片中包含有对应漏洞函数中需要删除的语句,以及与该需要删除的语句存在依赖关系的其他语句,因此漏洞切片可以保证关键漏洞信息的完整性。另外,在对漏洞函数进行切片时,是以需要删除的语句为核心,而需要删除的语句本身为漏洞代码或与漏洞代码相关的代码,因此该切片方式相对于现有技术中以API调用为核心的切片方式,可以涵盖更多类型的漏洞信息,例如指针引用漏洞、数组越界漏洞等,有助于提高漏洞代码克隆检测的全面性和准确性,减少了漏洞的漏检率。
将多个待检测切片与预设漏洞库中存储的漏洞函数对应的所有漏洞切片进行切片匹配后,即可得到待检测函数的漏洞代码克隆检测结果。其中,漏洞代码克隆检测结果可以包括该检测函数是否为漏洞函数,还可以包括该检测函数对应的漏洞类型、补丁信息等相关漏洞信息,本发明实施例对此不作具体限定。具体而言,若待检测函数的多个待检测切片与某个漏洞函数对应的所有漏洞切片匹配成功,则可以将该待检测函数标记为漏洞函数,并进行报告。报告结果可以以HTML的格式给出,其中报告内容可以包括匹配成功的漏洞函数及其对应的补丁信息等。此处,当某一漏洞函数对应的所有漏洞切片均能与待检测函数的待检测切片匹配成功,则视为切片匹配成功。
现有技术中存在部分Type-3类型的代码克隆检测方案,但通常是采用的深度学习的方法。然而,深度学习的方法会受到不平衡数据集的影响,且无法精确定位漏洞代码的位置。而本发明实施例在对漏洞函数进行切片时,以需要删除的语句为核心,将与该需要删除的语句存在直接或间接的依赖关系的其他语句共同划分到同一漏洞切片中,过滤了与漏洞无关的语句,因此在检测过程中进行切片匹配时,可以根据漏洞函数中的关键漏洞信息以及与其相关联的其他语句,检测待检测函数中Type-3类型的代码克隆问题。此外,根据切片匹配结果,可以确定待检测函数中与漏洞函数的漏洞切片相匹配的待检测切片,因而可以根据待检测切片中各语句的位置,准确定位待检测函数中漏洞信息所在的位置。
本发明实施例提供的方法,通过将多个待检测切片与预设漏洞库中存储的漏洞函数对应的所有漏洞切片进行切片匹配,得到待检测函数的漏洞代码克隆检测结果;其中,漏洞函数对应的漏洞切片中包含漏洞函数中需要删除的语句以及与需要删除的语句存在依赖关系的其他语句,实现了Type-3类型的代码克隆检测,提高了漏洞代码克隆检测的全面性和准确性,减少了漏洞的漏检率,且可以准确定位待检测函数中漏洞信息所在的位置。
基于上述实施例,漏洞函数对应的漏洞切片是基于如下步骤确定的:
基于漏洞函数对应的补丁信息,确定漏洞函数中需要删除的语句;
根据漏洞函数的程序依赖图的控制流和数据流,提取与需要删除的语句存在依赖关系的依赖语句;
其中,需要删除的语句与依赖语句构成一个漏洞切片。
具体地,可以首先获取补丁信息以及相应的漏洞函数。此处,可以使用两种方式获取上述信息,即使用爬虫获取和通过开源软件的git仓库获取。例如,可以在NVD(NationalVulnerability Database,美国国家漏洞数据库)网站上根据漏洞的CVE编号爬取每个CVE对应的补丁信息,根据补丁信息获取到其对应的漏洞函数的内容。还可以获取开源软件git仓库中的日志提交记录,如果日志提交记录中含有“CVE-20”关键字,则将该提交记录中对应的diff文件内容作为补丁信息,补丁中记录的被修改的函数作为漏洞函数。
依据补丁信息,对漏洞函数中需要删除的语句进行标记。在提取漏洞切片时,首先根据漏洞函数内容生成程序依赖图,然后以标记的需要删除的语句为核心,依照程序依赖图中的控制流和数据流,提取与需要删除的语句存在依赖关系的依赖语句。每个需要删除的语句对应产生一个漏洞切片,该漏洞切片中包含该需要删除的语句及其对应的依赖语句。一个漏洞函数可能会产生多个漏洞切片。
基于上述任一实施例,步骤120具体包括:
对待检测函数的函数体进行抽象和标准化操作,并计算抽象和标准化操作后的函数体的待检测函数体哈希值;
将待检测函数体哈希值与预设漏洞库中存储的漏洞函数对应的漏洞函数体哈希值进行函数体匹配;
若函数体匹配失败,则将多个待检测切片与预设漏洞库中存储的漏洞函数对应的所有漏洞切片进行切片匹配;
其中,漏洞函数体哈希值是将对应漏洞函数的函数体进行抽象和标准化操作后进行哈希运算得到的。
具体地,对待检测函数的函数体进行抽象和标准化操作。其中,抽象是指将变量名和参数名用统一的字符来替换,以达到检测漏洞代码的Type-2类型代码克隆的目的,标准化是指删除空格以及注释内容,以去除与代码无关的因素对检测造成的负面影响。然后,计算抽象和标准化操作后的函数体的待检测函数体哈希值。此处,可以采用速度快、冲突率低、散列度高的FNV-1a哈希函数计算待检测函数体哈希值。
将待检测函数体哈希值与预设漏洞库中存储的漏洞函数对应的漏洞函数体哈希值进行函数体匹配。其中,漏洞函数体哈希值是采用与待检测函数体哈希值相同的哈希函数,对进行了相同的抽象和标准化操作后的漏洞函数函数体进行哈希计算后得到的。
若函数体匹配成功,则可以直接根据该匹配结果确定待检测函数的漏洞代码克隆检测结果;否则,再将多个待检测切片与预设漏洞库中存储的漏洞函数对应的所有漏洞切片进行切片匹配。
本发明实施例提供的方法,通过将待检测函数体哈希值与预设漏洞库中存储的漏洞函数对应的漏洞函数体哈希值进行函数体匹配,在函数体匹配失败时,再将多个待检测切片与预设漏洞库中存储的漏洞函数对应的所有漏洞切片进行切片匹配,可以提高漏洞代码克隆检测的效率和精确性。
基于上述任一实施例,将多个待检测切片与预设漏洞库中存储的漏洞函数对应的所有漏洞切片进行切片匹配,具体包括:
对每一待检测切片进行抽象和标准化操作,并计算抽象和标准化操作后的每一待检测切片的待检测切片哈希值;
将每一待检测切片哈希值与漏洞函数对应的所有漏洞切片的漏洞切片哈希值进行切片匹配;
其中,漏洞切片哈希值是将对应漏洞切片进行抽象和标准化操作后进行哈希运算得到的。
具体地,首先对待检测函数的每个待检测切片进行抽象和标准化操作,然后对抽象和标准化操作后的待检测切片进行哈希运算,得到每个待检测切片的待检测切片哈希值。将每一待检测切片哈希值与抽象和漏洞函数对应的所有漏洞切片的漏洞切片哈希值进行切片匹配。其中,漏洞切片哈希值是采用与待检测切片哈希值相同的哈希函数,对进行了相同的抽象和标准化操作后的漏洞切片进行哈希计算后得到的。
基于上述任一实施例,将每一待检测切片哈希值与漏洞函数对应的所有漏洞切片的漏洞切片哈希值进行切片匹配,具体包括:
基于每一待检测切片哈希值,确定待检测函数的哈希比特向量;
判断漏洞函数对应的所有漏洞切片的漏洞切片哈希值在哈希比特向量的对应位置处的比特值是否为1;
若漏洞函数对应的所有漏洞切片的漏洞切片哈希值在哈希比特向量的对应位置处的比特值均为1,则切片匹配成功。
具体地,将每一待检测切片哈希值组装到同一个比特向量中,得到待检测函数的哈希比特向量。其中,哈希比特向量由0和1构成,且其中的每个位置均对应一个哈希值,不同位置对应不同哈希值。若哈希比特向量的某一个位置处的值为1,表明待检测函数中的某个待检测切片的待检测切片哈希值与该位置对应的哈希值相等。
然后,依次判断漏洞函数对应的每个漏洞切片的漏洞切片哈希值在哈希比特向量的对应位置处的比特值是否为1。若为1,表明待检测函数中的某个待检测切片的待检测切片哈希值与该漏洞切片的漏洞切片哈希值相等,进一步意味着该待检测切片与该漏洞切片的代码相同。若漏洞函数对应的所有漏洞切片的漏洞切片哈希值在哈希比特向量的对应位置处的比特值均为1,表明待检测函数中包含与所有漏洞切片的代码相同的待检测切片,即待检测函数中包含漏洞函数中的所有漏洞代码,故此时切片匹配成功。
本发明实施例提供的方法,通过将每一待检测切片哈希值组装到待检测函数的哈希比特向量中,再判断漏洞函数对应的所有漏洞切片的漏洞切片哈希值在哈希比特向量的对应位置处的比特值是否为1,提高了切片匹配的速度和精确性。
基于上述任一实施例,基于每一待检测切片哈希值,确定待检测函数的哈希比特向量,具体包括:
初始化待检测函数的哈希比特向量;
将哈希比特向量中每一待检测切片哈希值对应位置处的值置为1;
其中,哈希比特向量中的各个位置与哈希函数对应的哈希值范围内的各个哈希值一一对应。
具体地,根据待检测切片和漏洞切片所采用的哈希函数,确定该哈希函数对应的哈希值范围,即该哈希函数的输出结果的取值范围。根据该哈希值范围,设定哈希比特向量,其中哈希比特向量中的各个位置与哈希函数对应的哈希值范围内的各个哈希值一一对应。然后,初始化待检测函数的哈希比特向量,即将该向量中的所有值置为0,再将哈希比特向量中每一待检测切片哈希值对应位置处的值置为1。具体而言,可以采用如下公式构建哈希比特向量:
其中,bitvectorf为待检测函数f的哈希比特向量,bitvectorf[n]表示哈希比特向量第n位的值,l为哈希比特向量的长度,与哈希函数的取值范围对应,H为哈希函数的取值范围中各个哈希值的集合。
基于上述任一实施例,步骤120具体包括:
若切片匹配成功,则获取匹配成功的漏洞函数对应的漏洞函数信息,作为待检测函数的漏洞代码克隆检测结果;
漏洞函数信息包括匹配成功的漏洞函数对应的漏洞切片中包含的语句行号,以及匹配成功的漏洞函数对应的补丁信息。
具体地,若切片匹配成功,则可以获取匹配成功的漏洞函数对应的漏洞函数信息,作为待检测函数的漏洞代码克隆检测结果。其中,漏洞函数信息包括匹配成功的漏洞函数对应的漏洞切片中包含的语句行号,以及匹配成功的漏洞函数对应的补丁信息。其中,匹配成功的漏洞函数对应的漏洞切片中包含的语句行号,包括漏洞切片中需要删除的语句的行号,以及与需要删除的语句相关的其他语句的行号中的至少一种。根据匹配成功的漏洞函数对应的漏洞切片中包含的语句行号,以及匹配成功的漏洞函数对应的补丁信息,可以准确定位漏洞信息的位置,并且为后续的打补丁工作提供便利。
基于上述任一实施例,图2为本发明实施例提供的漏洞代码克隆检测方法的流程示意图之二,如图2所示,该方法包括:
首先,构建漏洞库。具体而言,可以获取补丁信息以及相应的漏洞函数。依据补丁信息,对漏洞函数中需要删除的语句进行标记,并根据漏洞函数内容生成程序依赖图,然后以标记的语句为核心,依照程序依赖图中控制流和数据流的关系进行漏洞切片,得到各个漏洞函数对应的漏洞切片。然后,对产生的漏洞切片进行抽象和标准化操作。为了后续检测效率,还可以对每个漏洞函数的函数体也进行抽象和标准化操作。将漏洞函数的相关信息以函数为单位存储到漏洞库中,即每一条记录对应一个漏洞函数。每条记录中包括:本条记录对应的漏洞函数的CVE编号以及漏洞函数所在的文件名和漏洞函数名,抽象和标准化后的函数体和漏洞切片的哈希值,漏洞切片的核心语句行号,组成漏洞切片的语句的行号,以及抽象和标准化后的代码的字符串。其中,产生哈希值的哈希函数为FNV-1a,该哈希函数具有速度快,冲突率低,散列度高的特点,适合处理相似字符串。
然后,对待检测的源码进行预处理。具体而言,可以提取待检测的源码中各个文件的所有函数,作为待检测函数。对待检测函数的每行语句进行切片操作,得到多个待检测切片。同样地,对每个待检测切片进行同样的抽象和标准化操作,并对抽象和标准化后的待检测切片计算哈希值。对于每个待检测函数,使用一个哈希比特向量来记录该待检测函数中各个待检测切片的哈希值。同时,为了检测效率,也计算了抽象和标准化后的待检测函数的函数体的哈希值。
遍历漏洞库,将漏洞库中每条记录对应的漏洞函数与待检测函数进行匹配,若待检测函数与某个漏洞函数匹配,则认为当前函数为漏洞函数,输出到检测报告中。具体匹配过程可以为:如果待检测函数的函数体哈希值与某个漏洞函数的函数体哈希值相同,则认为匹配;若待检测函数的函数体哈希值与所有漏洞函数的函数体哈希值均匹配失败,则将待检测函数的待检测切片哈希值与漏洞函数的所有漏洞切片哈希值进行匹配。切片的具体匹配过程可以为:对于待检测函数对应的哈希比特向量,遍历漏洞库中的每条记录,如果某条记录中所有的漏洞切片的哈希值在该比特向量对应位置处的值均为1,则说明待检测函数包括该漏洞函数的所有漏洞切片,可以认为待检测函数与该漏洞函数匹配。
下面对本发明提供的漏洞代码克隆检测装置进行描述,下文描述的漏洞代码克隆检测装置与上文描述的漏洞代码克隆检测方法可相互对应参照。
基于上述任一实施例,图3为本发明实施例提供的漏洞代码克隆检测装置的结构示意图,如图3所示,该装置包括函数切片单元310和切片匹配单元320。
其中,函数切片单元310用于对待检测函数的代码进行切片,得到多个待检测切片;
切片匹配单元320用于将多个待检测切片与预设漏洞库中存储的漏洞函数对应的所有漏洞切片进行切片匹配,得到待检测函数的漏洞代码克隆检测结果;
其中,漏洞函数对应的漏洞切片中包含漏洞函数中需要删除的语句以及与需要删除的语句存在依赖关系的其他语句。
本发明实施例提供的装置,通过将多个待检测切片与预设漏洞库中存储的漏洞函数对应的所有漏洞切片进行切片匹配,得到待检测函数的漏洞代码克隆检测结果;其中,漏洞函数对应的漏洞切片中包含漏洞函数中需要删除的语句以及与需要删除的语句存在依赖关系的其他语句,实现了Type-3类型的代码克隆检测,提高了漏洞代码克隆检测的全面性和准确性,减少了漏洞的漏检率,且可以准确定位待检测函数中漏洞信息所在的位置。
基于上述任一实施例,该装置还包括漏洞切片单元,用于:
基于漏洞函数对应的补丁信息,确定漏洞函数中需要删除的语句;
根据漏洞函数的程序依赖图的控制流和数据流,提取与需要删除的语句存在依赖关系的依赖语句;
其中,需要删除的语句与依赖语句构成一个漏洞切片。
基于上述任一实施例,切片匹配单元320具体包括:
函数体哈希单元,用于对待检测函数的函数体进行抽象和标准化操作,并计算抽象和标准化操作后的函数体的待检测函数体哈希值;
函数体匹配单元,用于将待检测函数体哈希值与预设漏洞库中存储的漏洞函数对应的漏洞函数体哈希值进行函数体匹配;
漏洞切片匹配单元,用于若函数体匹配失败,则将多个待检测切片与预设漏洞库中存储的漏洞函数对应的所有漏洞切片进行切片匹配;
其中,漏洞函数体哈希值是将对应漏洞函数的函数体进行抽象和标准化操作后进行哈希运算得到的。
本发明实施例提供的装置,通过将待检测函数体哈希值与预设漏洞库中存储的漏洞函数对应的漏洞函数体哈希值进行函数体匹配,在函数体匹配失败时,再将多个待检测切片与预设漏洞库中存储的漏洞函数对应的所有漏洞切片进行切片匹配,可以提高漏洞代码克隆检测的效率和精确性。
基于上述任一实施例,将多个待检测切片与预设漏洞库中存储的漏洞函数对应的所有漏洞切片进行切片匹配,具体包括:
对每一待检测切片进行抽象和标准化操作,并计算抽象和标准化操作后的每一待检测切片的待检测切片哈希值;
将每一待检测切片哈希值与漏洞函数对应的所有漏洞切片的漏洞切片哈希值进行切片匹配;
其中,漏洞切片哈希值是将对应漏洞切片进行抽象和标准化操作后进行哈希运算得到的。
基于上述任一实施例,将每一待检测切片哈希值与漏洞函数对应的所有漏洞切片的漏洞切片哈希值进行切片匹配,具体包括:
基于每一待检测切片哈希值,确定待检测函数的哈希比特向量;
判断漏洞函数对应的所有漏洞切片的漏洞切片哈希值在哈希比特向量的对应位置处的比特值是否为1;
若漏洞函数对应的所有漏洞切片的漏洞切片哈希值在哈希比特向量的对应位置处的比特值均为1,则切片匹配成功。
本发明实施例提供的装置,通过将每一待检测切片哈希值组装到待检测函数的哈希比特向量中,再判断漏洞函数对应的所有漏洞切片的漏洞切片哈希值在哈希比特向量的对应位置处的比特值是否为1,提高了切片匹配的速度和精确性。
基于上述任一实施例,基于每一待检测切片哈希值,确定待检测函数的哈希比特向量,具体包括:
初始化待检测函数的哈希比特向量;
将哈希比特向量中每一待检测切片哈希值对应位置处的值置为1;
其中,哈希比特向量中的各个位置与哈希函数对应的哈希值范围内的各个哈希值一一对应。
基于上述任一实施例,切片匹配单元320具体包括:
漏洞信息获取单元,用于若切片匹配成功,则获取匹配成功的漏洞函数对应的漏洞函数信息,作为待检测函数的漏洞代码克隆检测结果;
漏洞函数信息包括匹配成功的漏洞函数对应的漏洞切片中包含的语句行号,以及匹配成功的漏洞函数对应的补丁信息。
图4示例了一种电子设备的实体结构示意图,如图4所示,该电子设备可以包括:处理器(processor)410、通信接口(Communications Interface)420、存储器(memory)430和通信总线440,其中,处理器410,通信接口420,存储器430通过通信总线440完成相互间的通信。处理器410可以调用存储器430中的逻辑指令,以执行漏洞代码克隆检测方法,该方法包括:对待检测函数的代码进行切片,得到多个待检测切片;将所述多个待检测切片与预设漏洞库中存储的漏洞函数对应的所有漏洞切片进行切片匹配,得到所述待检测函数的漏洞代码克隆检测结果;其中,所述漏洞函数对应的漏洞切片中包含所述漏洞函数中需要删除的语句以及与所述需要删除的语句存在依赖关系的其他语句。
此外,上述的存储器430中的逻辑指令可以通过软件功能单元的形式实现并作为独立的产品销售或使用时,可以存储在一个计算机可读取存储介质中。基于这样的理解,本发明的技术方案本质上或者说对现有技术做出贡献的部分或者该技术方案的部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行本发明各个实施例所述方法的全部或部分步骤。而前述的存储介质包括:U盘、移动硬盘、只读存储器(ROM,Read-Only Memory)、随机存取存储器(RAM,Random Access Memory)、磁碟或者光盘等各种可以存储程序代码的介质。
另一方面,本发明还提供一种计算机程序产品,所述计算机程序产品包括存储在非暂态计算机可读存储介质上的计算机程序,所述计算机程序包括程序指令,当所述程序指令被计算机执行时,计算机能够执行上述各方法所提供的漏洞代码克隆检测方法,该方法包括:对待检测函数的代码进行切片,得到多个待检测切片;将所述多个待检测切片与预设漏洞库中存储的漏洞函数对应的所有漏洞切片进行切片匹配,得到所述待检测函数的漏洞代码克隆检测结果;其中,所述漏洞函数对应的漏洞切片中包含所述漏洞函数中需要删除的语句以及与所述需要删除的语句存在依赖关系的其他语句。
又一方面,本发明还提供一种非暂态计算机可读存储介质,其上存储有计算机程序,该计算机程序被处理器执行时实现以执行上述各提供的漏洞代码克隆检测方法,该方法包括:对待检测函数的代码进行切片,得到多个待检测切片;将所述多个待检测切片与预设漏洞库中存储的漏洞函数对应的所有漏洞切片进行切片匹配,得到所述待检测函数的漏洞代码克隆检测结果;其中,所述漏洞函数对应的漏洞切片中包含所述漏洞函数中需要删除的语句以及与所述需要删除的语句存在依赖关系的其他语句。
以上所描述的装置实施例仅仅是示意性的,其中所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部模块来实现本实施例方案的目的。本领域普通技术人员在不付出创造性的劳动的情况下,即可以理解并实施。
通过以上的实施方式的描述,本领域的技术人员可以清楚地了解到各实施方式可借助软件加必需的通用硬件平台的方式来实现,当然也可以通过硬件。基于这样的理解,上述技术方案本质上或者说对现有技术做出贡献的部分可以以软件产品的形式体现出来,该计算机软件产品可以存储在计算机可读存储介质中,如ROM/RAM、磁碟、光盘等,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行各个实施例或者实施例的某些部分所述的方法。
最后应说明的是:以上实施例仅用以说明本发明的技术方案,而非对其限制;尽管参照前述实施例对本发明进行了详细的说明,本领域的普通技术人员应当理解:其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分技术特征进行等同替换;而这些修改或者替换,并不使相应技术方案的本质脱离本发明各实施例技术方案的精神和范围。
Claims (8)
1.一种漏洞代码克隆检测方法,其特征在于,包括:
对待检测函数的代码进行切片,得到多个待检测切片;
将所述多个待检测切片与预设漏洞库中存储的漏洞函数对应的所有漏洞切片进行切片匹配,得到所述待检测函数的漏洞代码克隆检测结果;
其中,所述漏洞函数对应的漏洞切片中包含所述漏洞函数中需要删除的语句以及与所述需要删除的语句存在依赖关系的其他语句;
所述对待检测函数的代码进行切片的步骤包括:
根据所述待检测函数的函数内容生成对应的程序依赖图,并依照所述程序依赖图中的控制流和数据流的关系对所述待检测函数的代码中所有语句进行切片;
所述将所述多个待检测切片与预设漏洞库中存储的漏洞函数对应的所有漏洞切片进行切片匹配的步骤,包括:
初始化所述待检测函数的哈希比特向量;
将所述哈希比特向量中每一待检测切片哈希值对应位置处的值置为1;
其中,所述哈希比特向量中的各个位置与哈希函数对应的哈希值范围内的各个哈希值一一对应;
基于每一待检测切片哈希值,确定所述待检测函数的哈希比特向量;
判断所述漏洞函数对应的所有漏洞切片的漏洞切片哈希值在所述哈希比特向量的对应位置处的比特值是否为1;
若所述漏洞函数对应的所有漏洞切片的漏洞切片哈希值在所述哈希比特向量的对应位置处的比特值均为1,则切片匹配成功。
2.根据权利要求1所述的漏洞代码克隆检测方法,其特征在于,所述漏洞函数对应的漏洞切片是基于如下步骤确定的:
基于所述漏洞函数对应的补丁信息,确定所述漏洞函数中需要删除的语句;
根据所述漏洞函数的程序依赖图的控制流和数据流,提取与所述需要删除的语句存在依赖关系的依赖语句;
其中,所述需要删除的语句与所述依赖语句构成一个漏洞切片。
3.根据权利要求1所述的漏洞代码克隆检测方法,其特征在于,所述将所述多个待检测切片与预设漏洞库中存储的漏洞函数对应的所有漏洞切片进行切片匹配,具体包括:
对待检测函数的函数体进行抽象和标准化操作,并计算抽象和标准化操作后的函数体的待检测函数体哈希值;
将所述待检测函数体哈希值与所述预设漏洞库中存储的漏洞函数对应的漏洞函数体哈希值进行函数体匹配;
若函数体匹配失败,则将所述多个待检测切片与预设漏洞库中存储的漏洞函数对应的所有漏洞切片进行切片匹配;
其中,漏洞函数体哈希值是将对应漏洞函数的函数体进行抽象和标准化操作后进行哈希运算得到的。
4.根据权利要求1至3任一项所述的漏洞代码克隆检测方法,其特征在于,所述将所述多个待检测切片与预设漏洞库中存储的漏洞函数对应的所有漏洞切片进行切片匹配,具体包括:
对每一待检测切片进行抽象和标准化操作,并计算抽象和标准化操作后的每一待检测切片的待检测切片哈希值;
将每一待检测切片哈希值与漏洞函数对应的所有漏洞切片的漏洞切片哈希值进行切片匹配;
其中,漏洞切片哈希值是将对应漏洞切片进行抽象和标准化操作后进行哈希运算得到的。
5.根据权利要求1至3任一项所述的漏洞代码克隆检测方法,其特征在于,所述将所述多个待检测切片与预设漏洞库中存储的漏洞函数对应的所有漏洞切片进行切片匹配,得到所述待检测函数的漏洞代码克隆检测结果,具体包括:
若切片匹配成功,则获取匹配成功的漏洞函数对应的漏洞函数信息,作为所述待检测函数的漏洞代码克隆检测结果;
所述漏洞函数信息包括所述匹配成功的漏洞函数对应的漏洞切片中包含的语句行号,以及所述匹配成功的漏洞函数对应的补丁信息。
6.一种漏洞代码克隆检测装置,其特征在于,包括:
函数切片单元,用于对待检测函数的代码进行切片,得到多个待检测切片;
切片匹配单元,用于将所述多个待检测切片与预设漏洞库中存储的漏洞函数对应的所有漏洞切片进行切片匹配,得到所述待检测函数的漏洞代码克隆检测结果;
其中,所述漏洞函数对应的漏洞切片中包含所述漏洞函数中需要删除的语句以及与所述需要删除的语句存在依赖关系的其他语句;
所述函数切片单元,具体用于:
根据所述待检测函数的函数内容生成对应的程序依赖图,并依照所述程序依赖图中的控制流和数据流的关系对所述待检测函数的代码中所有语句进行切片;
所述切片匹配单元,具体用于:
初始化所述待检测函数的哈希比特向量;
将所述哈希比特向量中每一待检测切片哈希值对应位置处的值置为1;
其中,所述哈希比特向量中的各个位置与哈希函数对应的哈希值范围内的各个哈希值一一对应;
基于每一待检测切片哈希值,确定所述待检测函数的哈希比特向量;
判断所述漏洞函数对应的所有漏洞切片的漏洞切片哈希值在所述哈希比特向量的对应位置处的比特值是否为1;
若所述漏洞函数对应的所有漏洞切片的漏洞切片哈希值在所述哈希比特向量的对应位置处的比特值均为1,则切片匹配成功。
7.一种电子设备,包括存储器、处理器及存储在所述存储器上并可在所述处理器上运行的计算机程序,其特征在于,所述处理器执行所述程序时实现如权利要求1至5任一项所述漏洞代码克隆检测方法的步骤。
8.一种非暂态计算机可读存储介质,其上存储有计算机程序,其特征在于,所述计算机程序被处理器执行时实现如权利要求1至5任一项所述漏洞代码克隆检测方法的步骤。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202011444952.4A CN112379923B (zh) | 2020-12-08 | 2020-12-08 | 漏洞代码克隆检测方法、装置、电子设备和存储介质 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202011444952.4A CN112379923B (zh) | 2020-12-08 | 2020-12-08 | 漏洞代码克隆检测方法、装置、电子设备和存储介质 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN112379923A CN112379923A (zh) | 2021-02-19 |
CN112379923B true CN112379923B (zh) | 2022-06-21 |
Family
ID=74590661
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202011444952.4A Active CN112379923B (zh) | 2020-12-08 | 2020-12-08 | 漏洞代码克隆检测方法、装置、电子设备和存储介质 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN112379923B (zh) |
Citations (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
KR20050034496A (ko) * | 2003-10-09 | 2005-04-14 | 주식회사 케이티프리텔 | 1x ev-do 단말의 해슁 버그 해결 방법 및 그 시스템 |
CN110222512A (zh) * | 2019-05-21 | 2019-09-10 | 华中科技大学 | 一种基于中间语言的软件漏洞智能检测与定位方法与系统 |
Family Cites Families (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN104144148A (zh) * | 2013-05-10 | 2014-11-12 | 中国电信股份有限公司 | 漏洞扫描方法和服务器、以及风险评估系统 |
US9659046B2 (en) * | 2013-07-31 | 2017-05-23 | Oracle Inernational Corporation | Probing a hash table using vectorized instructions |
CN108268777B (zh) * | 2018-01-18 | 2020-06-30 | 中国人民大学 | 一种利用补丁信息进行未知漏洞发现的相似性检测方法 |
CN111125716B (zh) * | 2019-12-19 | 2022-05-31 | 中国人民大学 | 一种以太坊智能合约漏洞检测方法及装置 |
-
2020
- 2020-12-08 CN CN202011444952.4A patent/CN112379923B/zh active Active
Patent Citations (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
KR20050034496A (ko) * | 2003-10-09 | 2005-04-14 | 주식회사 케이티프리텔 | 1x ev-do 단말의 해슁 버그 해결 방법 및 그 시스템 |
CN110222512A (zh) * | 2019-05-21 | 2019-09-10 | 华中科技大学 | 一种基于中间语言的软件漏洞智能检测与定位方法与系统 |
Also Published As
Publication number | Publication date |
---|---|
CN112379923A (zh) | 2021-02-19 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN108763928B (zh) | 一种开源软件漏洞分析方法、装置和存储介质 | |
CN108092962B (zh) | 一种恶意url检测方法及装置 | |
CN111400719B (zh) | 基于开源组件版本识别的固件脆弱性判别方法及系统 | |
US9323923B2 (en) | Code repository intrusion detection | |
CN108268777B (zh) | 一种利用补丁信息进行未知漏洞发现的相似性检测方法 | |
US20150207811A1 (en) | Vulnerability vector information analysis | |
CN107368582B (zh) | 一种sql语句检测方法及系统 | |
NL2026782B1 (en) | Method and system for determining affiliation of software to software families | |
EP2553581A1 (en) | Detection of global metamorphic malware variants using control and data flow analysis | |
CN111988341B (zh) | 数据处理方法、装置、计算机系统和存储介质 | |
CN112579476B (zh) | 一种漏洞和软件对齐的方法、装置以及存储介质 | |
WO2023241529A1 (zh) | 漏洞信息处理方法、服务装置和漏洞检测模块 | |
CN113419960A (zh) | 用于可信操作系统内核模糊测试的种子生成方法及系统 | |
CN105468975A (zh) | 恶意代码误报的追踪方法、装置及系统 | |
Ohm et al. | Sok: Practical detection of software supply chain attacks | |
CN112379923B (zh) | 漏洞代码克隆检测方法、装置、电子设备和存储介质 | |
CN112817877A (zh) | 异常脚本检测方法、装置、计算机设备和存储介质 | |
CN116821903A (zh) | 检测规则确定及恶意二进制文件检测方法、设备及介质 | |
CN117056347A (zh) | Sql语句永真式注入检测方法、装置、计算机设备及存储介质 | |
CN112395866A (zh) | 报关单数据匹配方法及装置 | |
CN117033552A (zh) | 情报评价方法、装置、电子设备及存储介质 | |
CN112883372B (zh) | 跨站脚本攻击检测方法和装置 | |
CN113742208A (zh) | 一种软件检测方法、装置、设备及计算机可读存储介质 | |
CN104462966B (zh) | Pdf中触发漏洞威胁的检测方法及装置 | |
CN104239800B (zh) | Pdf中触发漏洞威胁的检测方法及装置 |
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 | ||
GR01 | Patent grant | ||
GR01 | Patent grant |