当前位置: 首页 > 专利查询>四川大学专利>正文

一种基于函数级代码相似性的漏洞检测方法技术

技术编号:31792763 阅读:15 留言:0更新日期:2022-01-08 10:51
本发明专利技术公开了一种基于函数级代码相似性的漏洞检测方法,属于计算机网络安全技术领域,该方法包括:首先使用自定义的语法抽象化和规范化规则对开源漏洞函数和待检测函数源代码进行预处理;然后利用漏洞函数体和相应patch文件中的增加行代码和删除行代码生成漏洞函数指纹和待检测函数指纹;最后基于基于Wagner Fischer算法的模糊匹配和基于Aho

【技术实现步骤摘要】
一种基于函数级代码相似性的漏洞检测方法


[0001]本专利技术涉及计算机网络安全领域,特别涉及一种基于函数级代码相似性的漏洞检测方法。本专利技术避免生成复杂的中间表示,同时保留了基本的语法结构,保证了检测模型的性能,尤其是检测精度不受语法上无意义的修改的影响,可以进行1

3类克隆检测,同时自动区分漏洞代码和已打补丁的代码。在保证低误报率和漏报率的同时,提升了漏洞检测的可扩展性。

技术介绍

[0002]在过去的几年中,开源软件(Open

source software,简称“OSS”)程序的数量迅速增加。OSS程序数量的显著增加自然导致了因代码克隆产生的软件漏洞的增加,从而对软件系统的安全性构成了严重威胁。软件漏洞包括缺乏对用户输入的验证,缺乏足够的日志记录机制,失败打开错误处理和无法正确关闭数据库连接等。代码克隆即复制和粘贴其他软件已有代码的行为,如果正确利用了代码克隆,则会极大地提高开发效率,缩短开发周期。但是,在实践中,代码克隆通常被视为不良的编程习惯,因为它会增加维护成本,降低代码质量,产生潜在的法律冲突,甚至传播软件漏洞。特别地,由于OSS程序被广泛用作软件开发中的代码库,所以代码克隆正成为软件漏洞的主要原因之一。
[0003]传统的代码相似性检测通通常将目标代码转换为中间表示形式,例如解析树或程序控制图,然后分析该中间表示形式并检查其是否与某个预定义的漏洞规则匹配,以确定源程序中是否含有与漏洞规则相对应的漏洞。复杂的中间表示方法有助于提高检测准确率,但也会导致更高的计算成本;而较高的代码抽象表示方式会提升效率,但也会丢失部分漏洞语义信息,无法区分漏洞代码和已打补丁的代码。

技术实现思路

[0004]有鉴于此,本申请实施例提供了一种基于函数级代码相似性的漏洞检测方法,旨在在可接受的成本下平衡效率和准确性,有效地检测代码克隆中常见的变异方式。在保证低误报率和漏报率的同时,提升了漏洞检测的可扩展性。
[0005]本专利技术中涉及的相关定义如下。
[0006]定义1:Antlr4,是一款基于Java开发的开源的语法分析器生成工具,能够根据语法规则文件生成对应的语法分析器。
[0007]定义2:抽象语法树(Abstract Syntax Tree,缩写为AST),指一种描述程序代码语法结构的树形表示方式,以从语法树的角度分析源码结构。如,形如if

else的条件语句,在AST中可使用两个分支节点表示。
[0008]定义3:Fowler

Noll

Vo哈希(缩写为FNV哈希),该哈希能快速hash大量数据并保持较小的冲突率,它的高度分散使它适用于hash一些非常相近的字符串。如,URL,hostname,文件名,text,IP地址等。
[0009]定义4:差异行代码,patch文件由一个或多个差异块组成,每个差异块是带有特殊
标记的代码行序列。以“+”开头的行表示已添加的代码,以
“‑”
开头表示已删除的代码,本专利技术统称为差异行代码。
[0010]定义5:基于内容分割的分片哈希算法(context triggered piecewise hashing, 缩写为CTPH算法),通过使用滚动哈希设置传统分段哈希的边界,创建了上下文触发的分段哈希,即使未知文件是已知文件的修改版本,此类哈希也可用于标识未知输入和已知文件之间的有序同源序列。
[0011]定义6:Wagner

Fischer算法(缩写为WF算法),指的是找到一系列成本最小的编辑操作将字符a转换为字符b,允许的编辑操作包括字符插入,字符删除和字符替换。如,字符串S1
ꢀ“
Angel”和字符串S2
ꢀ“
Angle”之间的WF值为2。
[0012]定义7:AC自动机(Aho

Corasick Automaton,缩写为AC自动机),是多模匹配算法的一种,用于在输入的一串字符串中匹配有限组“字典”中的子串。它与普通字符串匹配的不同点在于同时与所有字典串进行匹配。
[0013]本专利技术的技术方案是:一种基于函数级代码相似性的漏洞检测方法,步骤包括。
[0014]步骤一,漏洞函数指纹库构建。
[0015](1)面向C语言的包含漏洞的代码,采用Python正则表达式进行匹配移除提取到的源代码中的注释。
[0016](2)从Github的CVE project库中收集所有CVE漏洞的commit文件和相应patch文件建立漏洞数据库,从中提取所有漏洞函数和相应patch文件中的增加行和删除行。
[0017](3)使用Antlr4编写C语言的语法规则文件,从C语言的源代码文件中生成所有函数的抽象语法树,然后将其转化为token序列,从中提取函数体和漏洞来源(所属文件位置),函数名字,形式参数列表,局部变量列表,数据类型列表,函数调用列表。
[0018](4)按以下步骤进行语法抽象化:用符号FUNNAME替换函数名,用符号FORPARA替换体内每个出现的参数变量;用符号LOVAR替换出现在函数主体中的所有局部变量;用CUSTYPE替换除了在ISO C标准中声明的所有自定义的数据类型声明;用符号FUNCALL替换每个函数调用,除了C标准库函数。
[0019](5)删除空格,制表符和换行符,删除所有“{”和“}”,并将所有字符转换为小写字母。
[0020](6)经过语法的抽象化和规范化处理之后生成的漏洞函数语法结构包括差异结构和函数体结构两部分,对于后者,生成基于CTPH算法的模糊哈希值,步骤包括分片,每片求哈希,压缩映射,输出四步。其中,分片采用滚动哈希算法:假设有个字符的输入,输入的第个字节由表示。因此,输入整体上由字节组成。在输入中的任何位置处,滚动哈希的状态将仅取决于文件的最后个字节。因此,滚动哈希值可以表示为最后几个字节的函数,如下述等式所示:。
[0021]步骤二,目标函数的指纹生成。
[0022](1)面向待检测C语言源代码,移除注释。
[0023](2)从C语言的源代码文件中生成所有目标函数的抽象语法树,然后将其转化为token序列,从中提取目标函数体和目标函数来源(所属文件位置),函数名字,形式参数列表,局部变量列表,数据类型列表,函数调用。
[0024](3)对目标函数的函数体依次进行函数名、函数形参、局部变量、自定义数据类型、
自定义函数调用的替换实现语法抽象化。
[0025](4)对变量替换后的目标函数进行规范化。
[0026]其中,分片采用滚动哈希算法:假设有个字符的输入,输入的第个字节由表示。因此,输入整体上由字节组成。在输入中的任何位置处,滚动哈希的状态将仅取决于文件的最后个字节。因此,滚动哈希值可以表示为最后几个字节的函数,如下述等式所示:。
[0027](5)对于目标函数进行语法抽象化和本文档来自技高网
...

【技术保护点】

【技术特征摘要】
1.一种基于函数级代码相似性的漏洞检测方法,其特征包括以下步骤:A.漏洞函数指纹库构建模块面向C语言的包含漏洞的代码,采用Python正则表达式进行匹配移除提取到的源代码中的注释,从Github的CVE project库中收集所有CVE漏洞的commit文件和相应patch文件建立漏洞数据库,从中提取所有漏洞函数和相应patch文件中的增加行和删除行;B.使用Antlr4编写C语言的语法规则文件,从C语言的源代码文件中生成所有函数的抽象语法树,然后将其转化为token序列,进行语法抽象化和规范化;C.经过语法的抽象化和规范化处理之后生成的漏洞函数语法结构包括差异结构和函数体结构两部分,对于后者,生成基于CTPH算法的模糊哈希值;D.目标函数的指纹生成模块生成目标函数指纹:面向待检测C语言源代码,移除注释,对待检测的目标函数进行语法的抽象化和规范化,保留生成的目标函数的语法结构,同时生成基于CTPH算法的模糊哈希,二者共同构成待检测函数中间表示,详细步骤同漏洞函数指纹库构建模块;E.基于函数指纹的漏洞检测共包括两步匹配:基于Wagner Fischer算法的模糊匹配和基于Aho

Corasick算法的多模态精确匹配,两步匹配都成功后可以成功检测出漏洞。2.根据权利要求1所述的一种基于函数级代码相似性的漏洞检测方法,其语法抽象化和规范化的具体步骤在于:(1) 从token序列中提取函数体和漏洞来源(所属文件位置),函数名字,形式参数列表,局部变量列表,数据类型列表,函数调用列表;(2) 用符号FUNNAME替换函数名,用符号FORPARA替换体内每个出现的参数变量,用符号LOVAR替换出现在函数主体中的所有局部变量,用CUSTYPE替换除了在ISO C标准中声明的所有自定义的数据类型声明,用符号FUNCALL替换每个函数调用,除了C标准库函数;(3) 删除空格,制表符和换行符,删除所有“{”和“}”,并将所有字符转换为小写字母以对函数主体进行规范化。3.根据权利要求1所述的一种基于函数级代码相似性的漏洞检测方法,其生成基于CTPH算法的模糊哈希值,具体过程如下:(1) 分片:在函数中读取一部分内容,给定弱哈希算法计算,得到一个哈希值,采用滚动哈希算法根据输入的当前上下文生成伪随机值,假设有个字符的输入,我们说输入的第个字节由表示,因此,输入整体上由字节组成,在输入中的任何位置处,滚动哈希的状态将仅取决于文件的最后个字节,因此,滚动哈希值可以表示为最后几个字节的函数,如下等式所示:,确定好分片之后,使用Alder

32算法作为弱哈希;(2) 每片求哈希:将函数分片完以后,需要为每一个分片计算一个哈希值,在本发明中,使用一个名为Fowler

Noll

V...

【专利技术属性】
技术研发人员:黄诚赵倩崇郭勇延
申请(专利权)人:四川大学
类型:发明
国别省市:

网友询问留言 已有0条评论
  • 还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。

1