CN112651028B - 基于上下文语义和补丁验证的漏洞代码克隆检测方法 - Google Patents
基于上下文语义和补丁验证的漏洞代码克隆检测方法 Download PDFInfo
- Publication number
- CN112651028B CN112651028B CN202110007740.8A CN202110007740A CN112651028B CN 112651028 B CN112651028 B CN 112651028B CN 202110007740 A CN202110007740 A CN 202110007740A CN 112651028 B CN112651028 B CN 112651028B
- Authority
- CN
- China
- Prior art keywords
- vulnerability
- code
- function
- detected
- fragile
- 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
- 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
- G06F8/00—Arrangements for software engineering
- G06F8/40—Transformation of program code
- G06F8/41—Compilation
- G06F8/42—Syntactic analysis
-
- 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
Abstract
本发明公开了一种基于上下文语义和补丁验证的漏洞代码克隆检测方法,解决了现有漏洞代码克隆检测方法无法获取漏洞上下文及补丁修补的问题。实现步骤是:获取漏洞数据;对漏洞脆弱代码控制语句标记;对漏洞源代码和补丁进行抽象规范化预处理;构建漏洞函数和漏洞脆弱代码指纹库;对待检测代码克隆检测;检测结果判定及检测输出,完成软件的漏洞克隆检测。本发明基于代码指纹,避免了高级别抽象技术准确率低的问题;本发明对代码抽象预处理操作消除了重命名对检测准确率的影响;对上下文关系和补丁验证,降低误报率;对待检测代码做脆弱代码、控制语句及补丁检测,应用场景更广,降低漏报率。用于对软件中因代码克隆引起的漏洞的检测。
Description
技术领域
本发明属于计算机技术领域,特别涉及软件漏洞检测,具体是一种基于上下文语义和补丁验证的漏洞代码克隆检测方法,用于面向源代码的漏洞克隆检测。
背景技术
随着科学技术的不断发展,软件的应用越来越广泛,软件规模也越来越大,各行各业对软件的需求也越来越多。同时也存在攻击者可以利用软件中存在的漏洞侵入其中,从而造成大量安全事故。开源软件(OSS)程序的数量以高速增长,OSS程序数量的大量增加自然导致了代码克隆引起的软件漏洞的增加,对软件系统的安全构成了严重的威胁,例如,OpenSSL的Heartbleed漏洞(CVE-2014-0160)已经影响了几种类型的系统(包括网站、web服务器、操作系统发行版和软件应用程序)。被广泛使用的开源加密工具OpenSSL在2016年3月暴露出的“水牢漏洞”导致全球三分之二的网站信息安全遭到严重威胁,我国有超过十万家网站受到影响。
脆弱代码是指导致软件漏洞产生的关键代码,代码克隆是指复制和粘贴其他软件的一部分的行为,如果被正确地利用,是有用的。然而在实践中,代码克隆往往被认为是一种不良的编程行为,对脆弱代码的克隆可能会在开发过程中引入漏洞。代码克隆检测作为一个重要的软件工程领域,旨在自动化地检测一个或多个代码库中功能上等效的代码块或代码段集合。代码克隆检测在软件度量、剽窃检测、关注点挖掘、版权侵权检测、代码压缩、病毒检测和检测bug等领域具有广泛而重要的用途。
目前,代码克隆主要包括四种类型,被广泛接受:Type-1:精确克隆。代码直接复制,不做任何修改。Type-2:更名为克隆。除了标识符、文本、类型、空格、顺序和注释的修改外,这些都是语法上相同的克隆。Type-3:重组克隆。基于Type-2的克隆,将进一步修改复制的代码片段,如添加、删除或修改语句。Type-4:语义克隆。克隆的两个代码片段实现了相同的函数,具有相同的语义,但它们的语法不同。代码修改级别的增加将直接导致代码克隆检测难度的增加。
作为面向源代码级别漏洞检测中的重要手段,现阶段国内外提出了多种软件脆弱性代码克隆检测方法。在CCFinder中,采用令牌级粒度对程序进行词法分析,以便将其转换为令牌序列或令牌包的技术。然后对标记序列进行相似性比较。词法组件序列(即标记)的相似性是通过后缀树算法来度量的,这在计算上是昂贵的,并且会消耗大量内存。ReDeBug以一组行为处理单元。它在源代码中滑动一个n(默认情况下为4)行的窗口,并对每个窗口应用三个不同的散列函数。文件之间的代码克隆是通过布鲁姆过滤器中的成员检查来检测的,布鲁姆过滤器存储每个窗口的散列值。尽管基于行窗口滑动技术使重调试能够检测一些Type-3克隆,但ReDeBug不能检测变量被重命名或数据类型被更改的Type-2克隆。DECKARD为每个文件构建ast,然后从ast中提取特征向量。根据欧氏距离对向量进行聚类后,在欧氏空间内彼此接近的向量被识别为代码克隆。这种基于树的方法需要大量的执行时间,因为子图同构问题是一个众所周知的耗时的np完全问题。Kim等人提出了一种高效检测函数级脆弱性代码克隆的方法VUDDY,利用函数签名比对与函数长度过滤实现了高效性与可扩展性,能够以较高的精确度识别已知漏洞的代码克隆。但该方法只能应对简单代码修改,不支持语序修改、冗余代码插入等常见的代码修改手段,应用场景具有较大的局限。
现有漏洞代码克隆检测的方法通常将待检测代码进行别名替换或进行较高程度的抽象,基于此可以通过将相同结构或相同特征与已知情况相匹配来找到由代码克隆引起的漏洞。但是当代码修改增加,比如添加和删除代码行时,就会受到影响,这也使得漏洞检测更加困难且应用场景有限。如果缺乏对上下文关系的验证和针对打好补丁的代码进行过滤,会导致漏报误报。如果采用相当高的抽象级别的技术(例如,将函数放入令牌包中,或放入语法树中)对于检测克隆可能是有效的,但它们并不适合准确地检测脆弱代码克隆,因为安全问题对上下文非常敏感。
发明内容
针对现有漏洞代码克隆检测方法的不足,本发明提供一种检测准确率更高,应用场景更广的基于上下文语义和补丁验证的漏洞代码克隆检测方法。
本发明是一种基于上下文语义和补丁验证的漏洞代码克隆检测方法,其特征在于,包含有如下步骤:
步骤1)获取数据:选定用于构建指纹的一个漏洞,从公开漏洞数据库中获取该漏洞信息,获取该漏洞源代码和补丁;
步骤2)对漏洞脆弱代码对应控制语句标记:使用开源图生成工具Joern将漏洞源代码转换为代码属性图,从中找到脆弱代码对应的控制语句并标记;
步骤3)对漏洞源代码和补丁进行具有针对重命名克隆的抽象规范化预处理:对漏洞源代码中漏洞函数、脆弱代码、对应控制语句及补丁进行规范化和针对重命名克隆的别名替换抽象,完成预处理,得到漏洞函数、脆弱代码、对应控制语句及补丁的规范化中间表示;
步骤4)构建漏洞函数和漏洞脆弱代码指纹库:将预处理后脆弱代码的漏洞函数利用哈希函数生成漏洞函数的指纹,保存在漏洞函数指纹库中;对预处理后的脆弱代码、对应控制语句和补丁分别利用哈希函数生成指纹保存在漏洞脆弱代码指纹库中,将漏洞脆弱代码指纹库中的指纹与漏洞函数指纹库中的漏洞函数指纹对应关联,共同完成一个漏洞的指纹生成;获取可知范围内其他漏洞源代码和补丁,实现漏洞的指纹生成,完成漏洞函数和漏洞脆弱代码指纹库的构建;
步骤5)通过构建的指纹库对待检测代码克隆检测:首先假设待检测代码所克隆的漏洞包含于构建的漏洞函数和漏洞脆弱代码指纹库中;再对待检测代码进行具有针对克隆重命名的抽象规范化预处理操作,再利用哈希函数对待检测代码生成函数级和行级指纹,进而通过对漏洞函数、脆弱代码、对应控制语句及补丁的指纹匹配检测实现对待检测代码的克隆检测并记录检测结果;
步骤6)检测结果判定及检测输出:判定完成漏洞函数、脆弱代码、对应控制语句和补丁的克隆检测的检测结果是否满足判定条件,若满足判定条件,则待检测代码为脆弱性代码克隆并进行输出;判定条件是需满足条件1或条件2中的一个即可,其中,条件1和条件2表达如下:
条件1:待检测代码在漏洞函数指纹库中检测到有对应的漏洞函数指纹;
条件2:待检测代码能够完整检测到脆弱代码及对应控制语句且补丁代码没有检测到。
本发明解决了现有漏洞代码克隆检测方法无法有效获取漏洞上下文及补丁修补的问题而导致误报,漏报及应用场景有限的问题。
与现有方法相比,本发明具有以下优点:
检测效率高、使用范围广:本发明通过对漏洞源代码中漏洞函数、脆弱代码的预处理,生成漏洞函数和脆弱代码指纹,进而对待检测代码进行指纹识别和定位,以应对代码克隆中重命名、垃圾代码插入和重新排序的漏洞代码克隆和代码进行少量增删而不改变代码风险的情况。
对上下文关系和补丁的验证:本发明增加了对脆弱代码对应控制语句及补丁的检测,实现对上下文语义关系的验证,可以有效识别待检测代码中补丁修补的情况,从而减少因脆弱代码进行行检测而忽略上下文关系导致的误报和因待检测代码通过补丁对脆弱代码进行修补导致的误报。
附图说明
图1为本发明的流程框图;
图2为本发明中实现漏洞代码克隆检测过程示意图;
图3为本发明中漏洞函数指纹示意图;
图4为本发明中漏洞脆弱代码指纹示意图;
图5为本发明中漏洞脆弱代码控制语句级补丁指纹示意图。
下面将结合附图和实施例对本发明进行详细地说明。
具体实施方式
实施例1
软件的应用越来越广泛,软件规模也越来越大,科学研究以及各行各业对软件的需求也越来越多,现代人的日常生活也离不开软件的支持,但软件在开发过程中不可避免地出现漏洞,攻击者可以利用软件中存在的漏洞侵入其中,从而造成大量安全事故,对软件安全造成威胁,因此针对软件漏洞的检测能够提前发现漏洞,减低安全事故发生的概率。现有漏洞检测方法不能有效检测到重命名和代码少量增删修改的代码克隆,缺乏上下文关系和补丁的验证,本发明对上述现状经过研究与实验提出一种基于上下文语义和补丁验证的漏洞代码克隆检测方法。
本发明是一种基于上下文语义和补丁验证的漏洞代码克隆检测方法参见图1,包含有如下步骤:
步骤1)获取数据:从开源漏洞数据库中选定用于构建指纹的一个漏洞,从公开漏洞数据库中获取该漏洞信息,获取该漏洞源代码和补丁,保存在本地漏洞代码数据库中。
步骤2)对漏洞脆弱代码对应控制语句标记:使用开源图生成工具Joern将漏洞源代码转换为代码属性图,从中找到脆弱代码对应的控制语句,并对控制语句进行标记,以便后续脆弱代码控制语句指纹生成。
步骤3)对漏洞源代码和补丁进行具有针对重命名克隆的抽象规范化预处理:对漏洞源代码中漏洞函数、脆弱代码、对应控制语句及补丁进行规范化预处理,并针对规范化预处理后的漏洞代码和补丁进行重命名克隆的别名替换抽象,完成预处理,得到漏洞函数、脆弱代码、对应控制语句及补丁的规范化中间表示。
步骤4)构建漏洞函数和漏洞脆弱代码指纹库:将预处理后脆弱代码的漏洞函数利用哈希函数生成漏洞函数的指纹并保存在漏洞函数指纹库中;对预处理后的脆弱代码、对应控制语句和补丁分别利用哈希函数生成指纹保存在漏洞脆弱代码指纹库中。最后将漏洞脆弱代码指纹库中的指纹与漏洞函数指纹库中的漏洞函数指纹对应关联起来,共同完成一个漏洞的指纹生成;获取可知范围内其他漏洞源代码和补丁,实现漏洞的指纹生成返回步骤1,对保存在本地漏洞代码数据库中的漏洞,完成漏洞函数和漏洞脆弱代码指纹库的构建。
重复执行步骤1-4,即通过重复获取数据、对漏洞脆弱代码对应控制语句标记、对漏洞源代码和补丁进行具有针对重命名克隆的抽象规范化预处理和漏洞指纹生成操作,完成保存在本地漏洞代码数据库中漏洞源代码和补丁的指纹生成,进而完成漏洞函数和漏洞脆弱代码指纹库构建。
步骤5)通过构建的指纹库对待检测代码克隆检测:首先假设待检测代码所克隆的漏洞包含于步骤4构建的漏洞函数和漏洞脆弱代码指纹库中;再对待检测代码进行步骤3中具有针对克隆重命名的抽象规范化预处理操作,按照步骤4中生成指纹的方法,再利用哈希函数对待检测代码生成函数级和行级指纹,进而通过对漏洞函数、脆弱代码、对应控制语句及补丁的指纹匹配检测实现对待检测代码的克隆检测并记录检测结果,完成基于漏洞指纹的流分析代码克隆检测。
步骤6)检测结果判定及检测输出:判定完成漏洞函数、脆弱代码、对应控制语句和补丁的克隆检测的检测结果是否满足判定条件,若满足判定条件,则待检测代码为脆弱性代码克隆并进行输出;判定条件是需满足条件1或条件2中的一个即可,其中,条件1和条件2表达如下:
条件1:待检测代码在漏洞函数指纹库中检测到有对应的漏洞函数指纹;
条件2:待检测代码能够完整检测到脆弱代码及对应控制语句且补丁代码没有检测到。
针对现有漏洞检测方法不能有效检测到重命名和代码进行少量增删,缺乏上下文关系和补丁的验证,本发明通过对漏洞源代码和补丁的抽象预处理来解决重命名的漏洞代码克隆问题;利用漏洞函数和脆弱代码的代码指纹进行克隆检测解决不能有效检测代码进行少量增删;本发明还对漏洞脆弱代码对应控制语句的验证来解决不能有效验证上下文关系;对漏洞脆弱代码对应补丁的验证来解决待检测代码已通过补丁完成修补而导致的误报。
本发明提高了漏洞代码克隆检测方法的准确性,可以检测到常见的代码克隆类型,具有较高的应用范围;本发明解决了现有技术尚不能有效检测到重命名、垃圾代码插入、重新排序等常见的漏洞代码克隆的问题。
实施例2
基于上下文语义和补丁验证的漏洞代码克隆检测方法同实施例1,步骤3中所述的对漏洞源代码和补丁进行具有针对重命名克隆的抽象规范化预处理,首先通过删除注释、空格、制表符和换行符,并将所有字符转换为小写字母,对漏洞源代码进行规范化,消除与语法无关的因素对检测结果的影响。然后对代码中的参数名称、局部变量、数据类型及函数调用名分别做统一别名替换;从函数头的参数中收集形式参数,并用符号FPARAM替换函数中出现的每次参数变量。本发明用符号LVAR替换代码中出现的所有局部变量;用符号DTYPE替换数据类型;本发明中数据类型不仅包括标准的C数据类型和限定符,还包括定义的类型;用符号FUNCCALL替换每个被调用函数的名称。
盲目地使用未处理的漏洞源代码生成指纹会导致重命名克隆的遗漏,并导致漏报误报,本发明中漏洞源代码及补丁预处理是消除重命名克隆所带来的影响的有效手段。针对重命名克隆所导致的错误,本发明提出的抽象规范化预处理通过对参数名称、局部变量、数据类型及函数调用名分别做统一别名替换,可以有效检测到重命名的漏洞代码克隆,为高精度代码克隆检测提供良好的数据准备。
实施例3
基于漏洞指纹的流分析代码克隆检测方法同实施例1-2,步骤4中所述的构建漏洞函数和漏洞脆弱代码指纹库,包括有如下步骤:
步骤4.1)通过使用MD5哈希算法,对脆弱代码的漏洞函数处理,生成漏洞函数指纹并将漏洞函数的长度和漏洞的CVE编号同漏洞函数的指纹作为三个元素保存为一个三元组,存入漏洞函数指纹库。
步骤4.2)使用MD5哈希算法,对脆弱代码、对应控制语句和补丁处理,分别逐行生成脆弱代码、对应控制语句和补丁的指纹,按语句顺序存入漏洞脆弱代码指纹库,然后将其与对应漏洞函数对应关联。
步骤4.3)重复执行步骤1-4,即通过重复获取可知范围内的其他漏洞源代码和补丁数据、对漏洞脆弱代码对应控制语句标记、对漏洞源代码和补丁进行具有针对重命名克隆的抽象规范化预处理和漏洞指纹生成操作,完成漏洞函数和漏洞脆弱代码指纹库构建。
本发明研究通过对漏洞函数指纹、函数长度和对应漏洞CVE编号组成三元组来对待检测代码进行代码克隆检测,可以精准地检测到Type-1和Type-2的代码克隆,并通过漏洞函数长度将相同长度的漏洞函数指纹保存在一起,提高了代码克隆检测的效率;本发明逐行生成脆弱代码指纹来检测重新排序和代码少量增删的漏洞代码克隆。
现有技术中,当代码进行少量增删修改时,代码风险问题不能直接改变,无法检测到代码中存在的风险,而这种风险同样会导致软件安全性遭到破坏。本发明专门针对这种风险,对脆弱代码逐行生成指纹,以便后续检测方法可以检测到这种少量语句增删修改的漏洞代码克隆,降低了这种问题带来的风险。
本发明研究了漏洞代码指纹的生成来提高了代码克隆检测方法的可扩展性,可以在漏洞数据源中获取数据,构建完善的漏洞函数和脆弱代码指纹库。
实施例4
基于漏洞指纹的流分析代码克隆检测方法同实施例1-3,步骤5中所述的漏洞代码克隆检测方法,包括有如下步骤:
步骤5.1)待检测代码选择:假设待检测代码所克隆的漏洞包含于步骤4构建的漏洞函数和漏洞脆弱代码指纹库。
步骤5.2)待检测代码预处理:对待检测代码进行步骤3中所述的漏洞源代码和补丁的抽象规范化预处理操作,得到待检测代码的规范化中间表示。
步骤5.3)待检测代码漏洞函数克隆检测:利用MD5哈希函数对预处理后的待检测代码以函数为单位生成函数级指纹,通过哈希查找的方法在漏洞函数指纹库中查找是否有相同漏洞函数指纹;首先在漏洞函数指纹库中查找是否存在相同的漏洞函数长度,再在相同函数长度的漏洞函数指纹中查找是否有与待检测代码相同哈希值的漏洞函数指纹;如果检测到对应漏洞函数指纹,结束检测并记录检测结果;如果没有检测到对应漏洞函数,则执行步骤5.4,进入下一步;进行脆弱代码克隆检测。
步骤5.4)待检测代码脆弱代码克隆检测:利用MD5哈希算法对预处理后的待检测代码以行为单位利用哈希函数进行处理,生成待检测代码的行级指纹,并在步骤4中构建的漏洞脆弱代码指纹库中对待检测代码中是否存在脆弱代码进行行检测,行检测可以看作是子序列存在的问题,因为如果一个漏洞的脆弱代码指纹是待检测代码的子序列,那么待检测代码与该指纹具有相同的漏洞。待检测代码行检测采用贪婪算法来实现。如果行检测成功,则进入下一步,进入控制语句克隆检测;反之,结束检测并记录检测结果,执行步骤6,进行检测结果判定。
步骤5.5)待检测代码脆弱代码对应控制语句克隆检测:因脆弱代码行检测中忽略上下文关系,对待检测代码的行级指纹在漏洞脆弱代码指纹库中检测是否存在脆弱代码对应控制语句来验证上下文关系,如果成功检测到脆弱代码对应控制语句,则进入下一步,进入补丁检测;反之,结束检测并记录检测结果,执行步骤6,进行检测结果判定。
步骤5.6)通过补丁指纹检测漏洞修补情况并记录:针对补丁修补代码未识别而导致误报的问题,通过对待检测代码的行级指纹在步骤4中构建的漏洞脆弱代码指纹库中检测是否存在脆弱代码对应补丁指纹来验证漏洞修补情况,如果成功检测到脆弱代码对应的补丁指纹,则检测到待检测代码已修补漏洞,结束检测并记录检测结果;反之,未检测到脆弱代码补丁指纹,则待检测代码未修补漏洞,同样结束检测并记录检测结果,执行步骤6,进行检测结果判定。
本发明研究的代码克隆检测方法首先对待检测代码进行抽象规范化预处理来解决待检测代码中重命名克隆和与语法无关的改动;本发明针对脆弱代码指纹的行检测可以有效检测到少量代码语句增删修改;本发明对脆弱代码对应控制语句的检测来解决行检测导致缺乏对上下文关系,减少漏报误报,相比于高级别抽象来进行脆弱代码克隆检测,提高了脆弱代码克隆检测的精确度。为消除忽略待检测代码已通过补丁对脆弱代码进行修补而导致的误报,本发明通过对脆弱代码对应补丁的检测进而对检测结果进行筛选,检测到待检测代码中已通过补丁修补的情况。现有漏洞检测技术忽略补丁修补情况而导致了误报,本发明提出了针对补丁指纹的检测可以避免因忽略待检测代码已完成补丁修补漏洞而产生的误报。
本发明设计的一种基于漏洞指纹的流分析代码克隆检测方法。本发明通过收集漏洞源代码,建立漏洞数据库;选定漏洞,查询漏洞信息,获取脆弱代码及补丁;使用开源图生成工具将脆弱代码转换为图,将脆弱代码对应语句标记下来;对脆弱代码进行预处理,得到规范化的中间表示;通过哈希函数对漏洞函数,脆弱代码及对应控制语句和补丁生成指纹,构建指纹库;对待检测代码进行预处理,利用哈希函数对待检测代码生成指纹并进行代码克隆检测,若成功检测,则对其进行记录并输出。本发明有效应对代码克隆中常见代码修改手段,拥有较高的应用场景,保持良好的准确性,具有检测效率高、误报漏报率低和可扩展性强的优点。
下面给出一个针对一个漏洞的全部检测过程的更加详细的例子,对本发明进一步说明。
实施例5:基于漏洞指纹的流分析代码克隆检测方法同实施例1-4,参见图2。
1.首先选定用于构建指纹的一个漏洞,从公开漏洞数据库中获取该漏洞信息,获取该漏洞源代码和补丁。
以CVE-2017-13012的漏洞脆弱代码和补丁为例,该漏洞关键的脆弱代码与对ipprint和EXTRACT 16BITS(&ip->ip len)的调用有关。由于攻击者控制ip->ip len的值,所以有必要在使用该变量之前检查它的值。补丁的修补增加了对ND TCHECK 16位(&ip->iplen)的调用。参见表1,表1为漏洞CVE-2017-13012脆弱代码及对应补丁。
表1漏洞CVE-2017-13012脆弱代码及对应补丁
2.使用Joern控制流图生成工具将漏洞源代码转换为图,找到脆弱代码对应控制语句并标记下来。
3.漏洞源代码进行抽象规范化预处理:通过删除注释、空格、制表符和换行符,并将所有字符转换为小写字母,对漏洞源代码进行规范化;对代码中的形式参数、局部变量、数据类型及函数调用名分别做统一替换。从函数头的参数中收集形式参数,并用符号FPARAM替换体中出现的每次参数变量;用符号LVAR替换漏洞源代码中出现的所有局部变量;用符号DTYPE替换数据类型;数据类型不仅包括标准的C数据类型和限定符,还包括定义的类型;用符号FUNCCALL替换每个被调用函数的名称,完成漏洞源代码抽象规范化预处理,漏洞源代码抽象规范化预处理的结果如表2所示,表2为抽象规范化预处理后的漏洞源代码;
表2漏洞源代码抽象规范化预处理
4.构建漏洞函数和脆弱代码及补丁的指纹库
使用输出为32位字节的MD5算法作为哈希函数用于生成漏洞代码指纹,并通过如下步骤构建指纹库:
4.1使用哈希函数为脆弱代码所在的漏洞函数生成指纹,同时保留函数长度及对应漏洞的CVE编号,保存为一个三元组,存入漏洞函数指纹库;
4.2使用哈希算法,对脆弱代码、对应控制语句和补丁处理,分别逐行生成脆弱代码、对应控制语句和补丁的指纹,按语句顺序存入漏洞脆弱代码指纹库,然后将其与对应漏洞函数对应关联。
对表1中所示的漏洞CVE-2017-13012脆弱代码及对应补丁进行构建指纹库步骤,得到如图3、图4和图5所示的漏洞代码指纹;图3为本发明中漏洞函数指纹示意图。
图3中,显示了漏洞函数指纹及其CVE编号和函数长度,其中左侧为漏洞函数长度,中间为所对应漏洞的CVE编号,右侧为漏洞函数指纹哈希值。图4为本发明中漏洞脆弱代码指纹示意图,为预处理后的脆弱代码及对应指纹哈希值,左侧为预处理后的脆弱代码,右侧为脆弱代码对应指纹哈希值。图5为本发明中漏洞脆弱代码控制语句级补丁指纹示意图,图中为脆弱代码对应控制语句及补丁的指纹哈希值,左侧为脆弱代码对应控制语句和补丁,右侧为控制语句及补丁的指纹哈希值。
本发明通过漏洞函数长度将相同长度的漏洞函数指纹保存在一起,提高了代码克隆检测的效率。本发明逐行生成脆弱代码指纹来检测重新排序和代码少量增删的漏洞代码克隆。本发明通过脆弱代码控制语句及补丁的指纹生成为后续检测验证上下文关系和补丁修补情况提供数据基础。
5.漏洞克隆检测
5.1选定满足待检测代码所克隆的漏洞包含于步骤4构建的漏洞函数和漏洞脆弱代码指纹库的待检测代码;
表3为漏洞CVE-2017-13012的一个克隆样例,该样例在发现漏洞之前的6个月就已经存在。该样例添加了ndo->ndo snaplen=ndo->ndo snapend-bp,并不是补丁代码,不会影响核心脆弱代码。
表3漏洞CVE-2017-13012克隆样例
5.2对待检测代码进行抽象规范化预处理;
5.3利用哈希函数对预处理后的待检测代码以函数为单位生成函数级指纹,首先在漏洞函数指纹库中查找是否存在相同的漏洞函数长度,再在相同函数长度的漏洞函数指纹中查找是否有与待检测代码相同的漏洞函数指纹;如果检测到对应漏洞函数指纹,结束检测并记录检测结果;如果没有检测到对应漏洞函数,则进入下一步;
5.4待检测代码以行为单位进行检测,利用MD5哈希算法对预处理后的待检测代码以行为单位利用哈希函数进行处理,生成指纹,并在漏洞脆弱代码指纹库中对脆弱代码进行行检测。针对待检测代码行检测的问题,通过采用贪婪算法来解决,在算法1中描述了行检测算法,如果行检测成功,则进入下一步;反之,结束检测并记录检测结果;
其中,A为待检测代码,F为漏洞指纹。如果代码A包含指纹F,则输出R为True,否则为False。如果A的长度小于F的长度,A不可能匹配F。如果F完全匹配,则认为指纹匹配成功,返回True。
5.5因行检测忽略了上下文关系,通过对完成以行为单位指纹生成的待检测代码在漏洞脆弱代码指纹库中检测脆弱代码对应控制语句来验证上下文关系,如果成功检测脆弱代码对应控制语句,则进入下一步;反之,结束检测并记录检测结果;
5.6针对补丁修补代码未识别而导致误报的问题,通过对完成以行为单位指纹生成的待检测代码在漏洞脆弱代码指纹库中检测是否有脆弱代码对应补丁的指纹来检测代码是否完成修补,结束检测并记录检测结果。
5.6检测结果判定及检测输出
判定满足判定条件的待检测代码为脆弱性代码克隆并进行输出;判定条件是需满足条件1或条件2中的一个即可,其中,条件1和条件2表达如下:
条件1:待检测代码在漏洞函数指纹库中检测到有对应的漏洞函数指纹;
条件2:待检测代码能够完整检测到脆弱代码及对应控制语句且补丁代码没有检测到。
本发明中,对两个条件的考虑是,当满足条件1时,待检测代码完全克隆了漏洞函数,保留了漏洞函数存在的风险。当满足条件2时,待检测代码可以完整检测到脆弱代码,保留了脆弱代码的风险,故而待检测代码存在脆弱代码风险。
表3中漏洞CVE-2017-13012的克隆样例,通过研究的代码克隆检测方法进行检测,因语句的增加,没有查找到对应漏洞函数指纹,但通过脆弱代码行检测可以完整匹配到脆弱代码及其对应控制语句,最后未检测脆弱代码对应补丁,故将待检测代码判定为脆弱代码克隆并输出。通过以上步骤完成对待检测代码的代码克隆检测,输出为漏洞代码克隆,其克隆漏洞的CVE编号为CVE-2017-13012。本发明可以检测到Type-1、Type-2和Type-3克隆。
综上所述,本发明公开的上下文关系验证和补丁筛选的漏洞代码克隆检测方法,解决了现有漏洞代码克隆检测方法无法有效获取漏洞上下文及补丁修补的问题而导致误报,漏报及应用场景有限的问题。实现步骤是:获取数据;对漏洞脆弱代码对应控制语句标记;对漏洞源代码和补丁进行具有针对重命名克隆的抽象规范化预处理;构建漏洞函数和漏洞脆弱代码指纹库;通过构建的指纹库对待检测代码克隆检测;检测结果判定及检测输出,完成计算机软件的漏洞克隆检测。本发明基于代码指纹,避免了采用高级别抽象技术的缺乏上下文关系而导致的准确率降低的问题;针对重命名代码克隆对检测准确率的影响,本发明采用了对代码进行抽象预处理操作消除了重命名对检测准确率的影响;因不能有效检测到代码少量增删修改的问题而导致的应用场景有限和缺乏对上下文关系和补丁验证而导致误报的问题,本发明对待检测代码进行脆弱代码、控制语句及补丁的检测,使应用场景更广泛,降低了漏报率,用于对软件中因代码克隆引起的漏洞进行检测。
Claims (4)
1.一种基于上下文语义和补丁验证的漏洞代码克隆检测方法,其特征在于,包含有如下步骤:
步骤1)获取数据:选定用于构建指纹的一个漏洞,从公开漏洞数据库中获取该漏洞信息,获取该漏洞源代码和补丁;
步骤2)对漏洞脆弱代码对应控制语句标记:使用开源图生成工具Joern将漏洞源代码转换为代码属性图,从中找到脆弱代码对应的控制语句并标记;
步骤3)对漏洞源代码和补丁进行具有针对重命名克隆的抽象规范化预处理:对漏洞源代码中漏洞函数、脆弱代码、对应控制语句及补丁进行规范化和针对重命名克隆的别名替换抽象,完成预处理,得到漏洞函数、脆弱代码、对应控制语句及补丁的规范化中间表示;
步骤4)构建漏洞函数和漏洞脆弱代码指纹库:将预处理后脆弱代码的漏洞函数利用哈希函数生成漏洞函数的指纹并保存在漏洞函数指纹库中;对预处理后的脆弱代码、对应控制语句和补丁分别利用哈希函数生成指纹保存在漏洞脆弱代码指纹库中,将漏洞脆弱代码指纹库中的指纹与漏洞函数指纹库中的漏洞函数指纹对应关联,共同完成一个漏洞的指纹生成;获取可知范围内其他漏洞源代码和补丁,实现漏洞的指纹生成,完成漏洞函数和漏洞脆弱代码指纹库的构建;
步骤5)通过构建的指纹库对待检测代码克隆检测:首先假设待检测代码所克隆的漏洞包含于构建的漏洞函数和漏洞脆弱代码指纹库中;再对待检测代码进行具有针对克隆重命名的抽象规范化预处理操作,再利用哈希函数对待检测代码生成函数级和行级指纹,进而通过对漏洞函数、脆弱代码、对应控制语句及补丁的指纹匹配检测实现对待检测代码的克隆检测并记录检测结果;
步骤6)检测结果判定及检测输出:判定完成漏洞函数、脆弱代码、对应控制语句和补丁的克隆检测的检测结果是否满足判定条件,若满足判定条件,则待检测代码为脆弱性代码克隆并进行输出;判定条件是需满足条件1或条件2中的一个即可,其中,条件1和条件2表达如下:
条件1:待检测代码在漏洞函数指纹库中检测到有对应的漏洞函数指纹;
条件2:待检测代码能够完整检测到脆弱代码及对应控制语句且补丁代码没有检测到。
2.根据权利要求1所述的基于上下文语义和补丁验证的漏洞代码克隆检测方法,其特征在于,步骤3中所述的对漏洞源代码和补丁进行具有针对重命名克隆的抽象规范化预处理,包含:对代码中的参数名称、局部变量、数据类型及函数调用名分别做统一替换;从函数头的参数中收集形式参数,并用符号FPARAM替换体中出现的每次参数变量;用符号LVAR替换代码中出现的所有局部变量;用符号DTYPE替换数据类型;数据类型不仅包括标准的C数据类型和限定符,还包括定义的类型;用符号FUNCCALL替换每个被调用函数的名称。
3.根据权利要求1所述的基于上下文语义和补丁验证的漏洞代码克隆检测方法,其特征在于,步骤4中所述的构建漏洞函数和漏洞脆弱代码指纹库,包括有如下步骤:
步骤4.1)通过使用MD5哈希算法,对脆弱代码的漏洞函数处理,生成漏洞函数指纹并将漏洞函数的长度和漏洞的CVE编号同漏洞函数的指纹作为三个元素保存为一个三元组,存入漏洞函数指纹库;
步骤4.2)使用MD5哈希算法,对脆弱代码、对应控制语句和补丁处理,分别逐行生成脆弱代码、对应控制语句和补丁的指纹,按语句顺序存入漏洞脆弱代码指纹库,然后将其与对应漏洞函数对应关联;
步骤4.3)重复执行步骤1-4,即通过重复获取可知范围内的其他漏洞源代码和补丁数据、对漏洞脆弱代码对应控制语句标记、对漏洞源代码和补丁进行具有针对重命名克隆的抽象规范化预处理和漏洞指纹生成操作,完成漏洞函数和漏洞脆弱代码指纹库构建。
4.根据权利要求1所述的基于上下文语义和补丁验证的漏洞代码克隆检测方法,其特征在于,步骤5中所述的漏洞代码克隆检测方法,包括有如下步骤:
步骤5.1)待检测代码选择:假设待检测代码所克隆的漏洞包含于构建的漏洞函数和漏洞脆弱代码指纹库;
步骤5.2)待检测代码预处理:对待检测代码进行漏洞源代码和补丁的抽象规范化预处理操作;
步骤5.3)待检测代码漏洞函数克隆检测:利用MD5哈希函数对预处理后的待检测代码以函数为单位生成函数级指纹,通过哈希查找的方法在漏洞函数指纹库中查找相同漏洞函数指纹;首先在漏洞函数指纹库中查找是否存在相同的漏洞函数长度,再在相同函数长度的漏洞函数指纹中查找是否有与待检测代码相同哈希值的漏洞函数指纹;如果检测到对应漏洞函数指纹,结束检测并记录检测结果;如果没有检测到对应漏洞函数,则进入下一步;
步骤5.4)待检测代码脆弱代码克隆检测:利用MD5哈希算法对预处理后的待检测代码以行为单位利用哈希函数进行处理,生成待检测代码的行级指纹,并在漏洞脆弱代码指纹库中对待检测代码中是否存在脆弱代码进行行检测,行检测采用贪婪算法;如果行检测成功,则进入下一步;反之,结束检测并记录检测结果;
步骤5.5)待检测代码脆弱代码对应控制语句克隆检测:因脆弱代码行检测中忽略上下文关系,对待检测代码的行级指纹在漏洞脆弱代码指纹库中检测是否存在脆弱代码对应控制语句来验证上下文关系,如果成功检测到脆弱代码对应控制语句,则进入下一步;反之,结束检测并记录检测结果;
步骤5.6)通过补丁指纹检测漏洞修补情况并记录:对待检测代码的行级指纹在漏洞脆弱代码指纹库中检测是否存在脆弱代码对应补丁指纹来验证漏洞修补情况,如果成功检测到脆弱代码对应的补丁指纹,则检测到待检测代码已修补漏洞,结束检测并记录检测结果;反之,未检测到脆弱代码补丁指纹,则待检测代码未修补漏洞,同样结束检测并记录检测结果。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202110007740.8A CN112651028B (zh) | 2021-01-05 | 2021-01-05 | 基于上下文语义和补丁验证的漏洞代码克隆检测方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202110007740.8A CN112651028B (zh) | 2021-01-05 | 2021-01-05 | 基于上下文语义和补丁验证的漏洞代码克隆检测方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN112651028A CN112651028A (zh) | 2021-04-13 |
CN112651028B true CN112651028B (zh) | 2022-09-30 |
Family
ID=75367396
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202110007740.8A Active CN112651028B (zh) | 2021-01-05 | 2021-01-05 | 基于上下文语义和补丁验证的漏洞代码克隆检测方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN112651028B (zh) |
Families Citing this family (6)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN113778852B (zh) * | 2021-06-04 | 2023-07-28 | 南方科技大学 | 一种基于正则表达式的代码分析方法 |
CN114880674A (zh) * | 2022-04-28 | 2022-08-09 | 西安交通大学 | 一种基于新型漏洞指纹的脆弱性检测方法及系统 |
CN114969765B (zh) * | 2022-07-27 | 2022-11-01 | 杭州海康威视数字技术股份有限公司 | 一种物联网设备无感安全漏洞修复方法、装置及设备 |
CN115586920B (zh) * | 2022-12-13 | 2023-03-14 | 北京安普诺信息技术有限公司 | 脆弱代码片段克隆检测方法、装置、电子设备及存储介质 |
CN116820405B (zh) * | 2023-08-31 | 2023-12-01 | 浙江大学 | 一种基于复用分析的evm字节码控制流图构建方法 |
CN117873905A (zh) * | 2024-03-11 | 2024-04-12 | 北京安普诺信息技术有限公司 | 一种代码同源检测的方法、装置、设备及介质 |
Citations (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN110543770A (zh) * | 2019-09-02 | 2019-12-06 | 南瑞集团有限公司 | 一种开源软件的漏洞检测方法、装置及系统 |
Family Cites Families (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
JP6503084B2 (ja) * | 2015-10-09 | 2019-04-17 | 日本電信電話株式会社 | 脆弱性発見装置、脆弱性発見方法、および、脆弱性発見プログラム |
KR101780233B1 (ko) * | 2016-04-26 | 2017-09-21 | 고려대학교 산학협력단 | 소프트웨어의 코드 클론 탐지 장치 및 방법 |
CN107273751B (zh) * | 2017-06-21 | 2020-06-02 | 北京计算机技术及应用研究所 | 基于多模式匹配的安全漏洞在线发现方法 |
CN107688748B (zh) * | 2017-09-05 | 2019-09-24 | 中国人民解放军信息工程大学 | 基于漏洞指纹的脆弱性代码克隆检测方法及其装置 |
CN111400724B (zh) * | 2020-05-08 | 2023-09-12 | 中国人民解放军国防科技大学 | 基于代码相似性分析的操作系统脆弱性检测方法、系统及介质 |
-
2021
- 2021-01-05 CN CN202110007740.8A patent/CN112651028B/zh active Active
Patent Citations (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN110543770A (zh) * | 2019-09-02 | 2019-12-06 | 南瑞集团有限公司 | 一种开源软件的漏洞检测方法、装置及系统 |
Also Published As
Publication number | Publication date |
---|---|
CN112651028A (zh) | 2021-04-13 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN112651028B (zh) | 基于上下文语义和补丁验证的漏洞代码克隆检测方法 | |
Liao et al. | Soliaudit: Smart contract vulnerability assessment based on machine learning and fuzz testing | |
Bao et al. | {BYTEWEIGHT}: Learning to recognize functions in binary code | |
Pham et al. | Detection of recurring software vulnerabilities | |
US7810155B1 (en) | Performance enhancement for signature based pattern matching | |
US20080271147A1 (en) | Pattern matching for spyware detection | |
US20090158385A1 (en) | Apparatus and method for automatically generating SELinux security policy based on selt | |
US20140052748A1 (en) | Match engine for detection of multi-pattern rules | |
CN114077741B (zh) | 软件供应链安全检测方法和装置、电子设备及存储介质 | |
US20080027866A1 (en) | System and method for authenticating file content | |
CN113901474B (zh) | 一种基于函数级代码相似性的漏洞检测方法 | |
CN109241737B (zh) | 一种面向多种补丁模式的差异分支识别方法及系统 | |
CN109670318B (zh) | 一种基于核控制流图循环验证的漏洞检测方法 | |
Liu et al. | Vfdetect: A vulnerable code clone detection system based on vulnerability fingerprint | |
WO2018066516A1 (ja) | 攻撃コード検知装置、攻撃コード検知方法及び攻撃コード検知プログラム | |
Liao et al. | Smartdagger: a bytecode-based static analysis approach for detecting cross-contract vulnerability | |
US9600644B2 (en) | Method, a computer program and apparatus for analyzing symbols in a computer | |
CN113297580B (zh) | 基于代码语义分析的电力信息系统安全防护方法及装置 | |
CN112115053A (zh) | 基于序列模式匹配的api误用缺陷检测方法 | |
CN112214399A (zh) | 基于序列模式匹配的api误用缺陷检测系统 | |
EP2189920B1 (en) | Malware signature builder and detection for executable code | |
Partenza et al. | Automatic identification of vulnerable code: Investigations with an ast-based neural network | |
CN117235741B (zh) | 一种基于人工智能的低代码安全系统 | |
Feichtner et al. | Obfuscation-resilient code recognition in Android apps | |
CN117940894A (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 | ||
GR01 | Patent grant | ||
GR01 | Patent grant | ||
TR01 | Transfer of patent right |
Effective date of registration: 20230607 Address after: 710061 Room 502, F3, West Yungu Phase I, Diaotai Subdistricts of China, Fengxi New Town, Xixian New District, Xi'an, Shaanxi Patentee after: Shaanxi Qianmo Tongda Technology Co.,Ltd. Address before: 710021 No. 2 Xuefu Road, Weiyang District, Xi'an, Shaanxi Patentee before: XI'AN TECHNOLOGICAL University |
|
TR01 | Transfer of patent right |