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

专利检索2022-05-11  2



1.本发明涉及计算机网络安全领域,特别涉及一种基于函数级代码相似性的漏洞检测方法。本发明避免生成复杂的中间表示,同时保留了基本的语法结构,保证了检测模型的性能,尤其是检测精度不受语法上无意义的修改的影响,可以进行1-3类克隆检测,同时自动区分漏洞代码和已打补丁的代码。在保证低误报率和漏报率的同时,提升了漏洞检测的可扩展性。


背景技术:

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


技术实现要素:

4.有鉴于此,本技术实施例提供了一种基于函数级代码相似性的漏洞检测方法,旨在在可接受的成本下平衡效率和准确性,有效地检测代码克隆中常见的变异方式。在保证低误报率和漏报率的同时,提升了漏洞检测的可扩展性。
5.本发明中涉及的相关定义如下。
6.定义1:antlr4,是一款基于java开发的开源的语法分析器生成工具,能够根据语法规则文件生成对应的语法分析器。
7.定义2:抽象语法树(abstract syntax tree,缩写为ast),指一种描述程序代码语法结构的树形表示方式,以从语法树的角度分析源码结构。如,形如if-else的条件语句,在ast中可使用两个分支节点表示。
8.定义3:fowler-noll-vo哈希(缩写为fnv哈希),该哈希能快速hash大量数据并保持较小的冲突率,它的高度分散使它适用于hash一些非常相近的字符串。如,url,hostname,文件名,text,ip地址等。
9.定义4:差异行代码,patch文件由一个或多个差异块组成,每个差异块是带有特殊
标记的代码行序列。以“ ”开头的行表示已添加的代码,以
“‑”
开头表示已删除的代码,本发明统称为差异行代码。
10.定义5:基于内容分割的分片哈希算法(context triggered piecewise hashing, 缩写为ctph算法),通过使用滚动哈希设置传统分段哈希的边界,创建了上下文触发的分段哈希,即使未知文件是已知文件的修改版本,此类哈希也可用于标识未知输入和已知文件之间的有序同源序列。
11.定义6:wagner-fischer算法(缩写为wf算法),指的是找到一系列成本最小的编辑操作将字符a转换为字符b,允许的编辑操作包括字符插入,字符删除和字符替换。如,字符串s1
ꢀ“
angel”和字符串s2
ꢀ“
angle”之间的wf值为2。
12.定义7:ac自动机(aho-corasick automaton,缩写为ac自动机),是多模匹配算法的一种,用于在输入的一串字符串中匹配有限组“字典”中的子串。它与普通字符串匹配的不同点在于同时与所有字典串进行匹配。
13.本发明的技术方案是:一种基于函数级代码相似性的漏洞检测方法,步骤包括。
14.步骤一,漏洞函数指纹库构建。
15.(1)面向c语言的包含漏洞的代码,采用python正则表达式进行匹配移除提取到的源代码中的注释。
16.(2)从github的cve project库中收集所有cve漏洞的commit文件和相应patch文件建立漏洞数据库,从中提取所有漏洞函数和相应patch文件中的增加行和删除行。
17.(3)使用antlr4编写c语言的语法规则文件,从c语言的源代码文件中生成所有函数的抽象语法树,然后将其转化为token序列,从中提取函数体和漏洞来源(所属文件位置),函数名字,形式参数列表,局部变量列表,数据类型列表,函数调用列表。
18.(4)按以下步骤进行语法抽象化:用符号funname替换函数名,用符号forpara替换体内每个出现的参数变量;用符号lovar替换出现在函数主体中的所有局部变量;用custype替换除了在iso c标准中声明的所有自定义的数据类型声明;用符号funcall替换每个函数调用,除了c标准库函数。
19.(5)删除空格,制表符和换行符,删除所有“{”和“}”,并将所有字符转换为小写字母。
20.(6)经过语法的抽象化和规范化处理之后生成的漏洞函数语法结构包括差异结构和函数体结构两部分,对于后者,生成基于ctph算法的模糊哈希值,步骤包括分片,每片求哈希,压缩映射,输出四步。其中,分片采用滚动哈希算法:假设有个字符的输入,输入的第个字节由表示。因此,输入整体上由字节组成。在输入中的任何位置处,滚动哈希的状态将仅取决于文件的最后个字节。因此,滚动哈希值可以表示为最后几个字节的函数,如下述等式所示:。
21.步骤二,目标函数的指纹生成。
22.(1)面向待检测c语言源代码,移除注释。
23.(2)从c语言的源代码文件中生成所有目标函数的抽象语法树,然后将其转化为token序列,从中提取目标函数体和目标函数来源(所属文件位置),函数名字,形式参数列表,局部变量列表,数据类型列表,函数调用。
24.(3)对目标函数的函数体依次进行函数名、函数形参、局部变量、自定义数据类型、
自定义函数调用的替换实现语法抽象化。
25.(4)对变量替换后的目标函数进行规范化。
26.其中,分片采用滚动哈希算法:假设有个字符的输入,输入的第个字节由表示。因此,输入整体上由字节组成。在输入中的任何位置处,滚动哈希的状态将仅取决于文件的最后个字节。因此,滚动哈希值可以表示为最后几个字节的函数,如下述等式所示:。
27.(5)对于目标函数进行语法抽象化和规范化处理之后,保留生成的目标函数的语法结构,同时生成基于ctph算法的模糊哈希,二者共同构成待检测函数中间表示。
28.步骤三,基于函数指纹的漏洞检测。
29.(1)计算漏洞函数指纹中的函数体模糊哈希与目标函数指纹中的模糊哈希之间的wagner-fischer值,得到相似程度的评分,判断两个函数是否有相似关系。
30.两个字符串和的wagner-fischer值可用如下的数学语言描述:。定义指的是中前个字符和中前个字符之间的距离。是的长度。这里的字符串的第一个字符index从1开始,因此最后的编辑距离便是时的距离:。
31.(2)将目标函数的语法结构作为主串,将漏洞函数指纹中的所有差异代码行作为多个模式串,构造ac自动机进行多模式精确匹配。ac算法实现分为预处理和匹配两步:预处理:将多个关键字构造成一个有限状态模式匹配机。构造一个包含所有关键字的自动机。匹配:遍历内置自动机上的给定文本以查找所有匹配的单词。从主串的第一个字符、自动机的初始状态0开始,如果成功匹配到该字符,则按自动机的转向函数转移到下一状态;如果转移的状态对应有输出函数,则输出已匹配上的模式串;如果字符匹配失败,则根据自动机的失效函数以递归方式执行传输。
32.本发明的优点主要有。
33.提出自定义的语法的抽象化和规范化规则,避免生成复杂的中间表示,同时保留了基本的语法结构,消除代码克隆修改带来的影响,保证了检测模型的性能,尤其是检测精度不受语法上无意义的修改的影响。
34.提出基于代码差异性的漏洞函数指纹。在许多情况下,含有漏洞的代码与打补丁的代码之间存在着很小的差异,通过插入单个if语句可以消除漏洞。也有很多安全漏洞通常对常量和语句顺序非常敏感,所以如果想要检测1、2、3类代码克隆漏洞,如果不区分漏洞代码和已打补丁的代码,会导致很高的漏报率。本发明利用漏洞函数体和相应patch文件中的增加行代码和删除行代码(统称为差异行代码)生成漏洞指纹,可以进行1-3类克隆检测,同时区分漏洞代码和已打补丁的代码。
附图说明
35.图1为系统流程图。
36.图2为图1中方框1001漏洞函数指纹库构建流程图。
37.图3为图1中方框1002目标函数指纹生成流程图。
38.图4为图1中方框1003基于函数指纹的漏洞检测流程。
具体实施方式
39.下面将参照附图和实施例对本发明作进一步说明如下。
40.图1为本发明的整体系统流程图。
41.漏洞函数指纹库构建模块从github的cve project库中收集所有cve漏洞的commit文件和相应patch文件建立漏洞数据库,生成基于ctph算法与代码差异性的漏洞函数指纹,建立漏洞函数指纹数据库。
42.目标函数的指纹生成模块生成基于ctph算法的目标函数指纹。
43.基于函数指纹的漏洞检测共包括两步匹配:模糊匹配和精确匹配,两步匹配都成功后可以成功检测出漏洞。
44.图2为图1中漏洞函数指纹库构建流程图,说明如何进行漏洞函数指纹库构建。
45.所述流程始于采用python正则表达式进行匹配移除提取到的漏洞函数源代码中的注释。一种是用“//”字符进行单行注释的,还有一种是多行注释的,用“/*”和“*/”将注释括起来。
46.第二步从github的cve project库中收集所有cve漏洞的commit文件和相应patch文件建立漏洞数据库,从中提取所有漏洞函数和相应patch文件中的增加行和删除行。
47.第三步使用antlr4编写c语言的语法规则文件,从c语言的源代码文件中生成所有函数的抽象语法树,然后将其转化为token序列,从中提取函数体和漏洞来源(所属文件位置),函数名字,形式参数列表,局部变量列表,数据类型列表,函数调用列表。
48.第四步按以下步骤进行语法抽象化:用符号funname替换函数名,用符号forpara替换体内每个出现的参数变量;用符号lovar替换出现在函数主体中的所有局部变量;用custype替换除了在iso c标准中声明的所有自定义的数据类型声明;用符号funcall替换每个函数调用,除了c标准库函数。
49.第五步删除空格,制表符和换行符,删除所有“{”和“}”,并将所有字符转换为小写字母以对函数主体进行规范化。
50.最后经过语法的抽象化和规范化处理之后生成的漏洞函数语法结构包括差异结构和函数体结构两部分,对于后者,生成基于ctph算法的模糊哈希值,具体过程如下。
51.分片:在函数中读取一部分内容,给弱哈希算法计算,得到一个哈希值。
52.不能使用固定长度的块来分隔文件,采用滚动哈希算法根据输入的当前上下文生成伪随机值,滚动散列通过仅基于输入的最后几个字节来维持状态来工作,在处理了一定数量的其他字节之后,每个字节都会在处理时添加到状态中,并从状态中删除。
53.假设我们有个字符的输入,我们说输入的第个字节由表示。因此,输入整体上由字节组成。在输入中的任何位置处,滚动哈希的状态将仅取决于文件的最后个字节。因此,滚动哈希值可以表示为最后几个字节的函数,如下等式所示:。滚动哈希函数被构造为可以消除其中项的影响。因此,给
定,能够通过去除的影响,表示为函数,以及添加的影响,表示为函数,计算出,如下等式所示。。。
54.确定好分片之后,使用alder-32算法作为弱哈希。最终的校验和是通过计算2个16位校验和a和b并将这些位连接为单个32位结果而获得的。在此算法中,a表示所有字节的总和加1,b是a中每个步骤的所有值的总和。运行adler-32时,a为1且b为0。这些总和取模65521(是素数,最大的不超过216)字节的存储顺序称为大字节序,其中b占据2个最高有效字节。
55.每片求哈希:将函数分片完以后,需要为每一个分片计算一个哈希值。在本发明中,使用一个名为fowler-noll-vo hash的哈希算法,fnv能快速hash大量数据并保持较小的冲突率,它的高度分散使它适用于hash一些非常相近的字符串。
56.压缩映射:对每一个函数分片,计算得到一个哈希值以后,可以选择将结果压缩短,本发明仅采用fnv的最低6位,并使用一个ascii字符将其表示为该片段的最终哈希结果。
57.输出:将每片压缩后的哈希值连接到一起,就得到该函数的模糊哈希值了。模糊哈希具有以下形状: bs:hash1:hash2。bs:这是块大小。我们只能比较相同块大小的哈希值。hash1:这是文件中每个块的fnv-1a结果(映射为64个字符)的串联。hash2:这与hash1相同,但使用的是块大小的两倍。写这个结果是因为很小的变化可以使块大小减半或加倍。如果发生这种情况,可以比较两个签名的至少一部分。对于差异结构不多做处理,漏洞函数指纹由函数体结构的模糊哈希和差异结构组成。
58.图3为图1中目标函数指纹生成流程图,说明如何对目标函数进行处理生成目标函数指纹。
59.所述流程始于采用python正则表达式进行匹配移除待检测漏洞的源代码中的注释。
60.第二步从c语言的源代码文件中生成所有目标函数的抽象语法树,然后将其转化为token序列,从中提取目标函数体和目标函数来源(所属文件位置),函数名字,形式参数列表,局部变量列表,数据类型列表,函数调用列表。
61.第三步对目标函数的函数体依次进行函数名、函数形参、局部变量、自定义数据类型、自定义函数调用的替换实现语法抽象化。
62.第四步在变量替换后的目标函数中删除空格,制表符和换行符,删除所有“{”和“}”,并将所有字符转换为小写字母。
63.最后对于目标函数进行语法抽象化和规范化处理之后,保留生成的目标函数的语法结构,同时生成基于ctph算法的模糊哈希,具体过程同漏洞函数体结构处理,二者共同构成待检测函数中间表示。
64.图4为图1中基于函数指纹的漏洞检测流程图,说明如何根据函数指纹进行漏洞的检测。
65.所述流程始于基于wagner fischer算法的模糊匹配,模糊匹配的步骤共分为五步。
66.第一步是比较块大小。我们只能比较针对相同块大小计算出的哈希值,在一个模糊哈希字符串中,我们同时具有块大小和双块大小的哈希值。因此,我们尝试至少匹配哈希值,如果它们没有通用的块大小,则比较返回0。
67.第二步删除三个以上相等字符的序列,这些相同的字符序列几乎没有关于文件的信息,并且使匹配分数有偏差。
68.第三步测试至少7个字符的重合,这是默认值,但是可以更改此值。如果最长的公共子字符串至少等于该长度,则该函数返回0。由于我们将32位fnv值映射到64个字符的输出中,因此会发生很多冲突,这是消除误报的一种方法。
69.第四步我们使用wagner-fischer算法使用以下权重来计算levenshtein距离:我们将两个字符串a,b的编辑距离表示为,其中和分别对应和的长度。编辑距离问题是找到一系列成本最小的编辑操作将字符转换为字符,允许的编辑操作包括字符插入,字符删除和字符替换。
70.两个字符串和的编辑距离可用如下的数学语言描述:定义指的是中前个字符和中前个字符之间的距离,是的长度,这里的字符串的第一个字符index从1开始,因此最后的编辑距离便是时的距离:。
71.当的时候,对应着字符串中前个字符和中前个字符,此时的有一个值为0,表示字符串和中有一个为空串,那么从转换到只需要进行次单字符编辑操作即可,所以它们之间的编辑距离为,即中的最大者。
72.当的时候,为如下三种情况的最小值:表示删除,表示插入,表示替换,为一个指示函数,表示当的时候取0;当的时候,其值为1。
73.第五步将按照原始的模糊哈希算法,缩放编辑距离,以使输出在0到100之间。其中,100代表两个函数完全一致,而0代表完全不相似。
74.这样,最后就得到相似程度的评分,可以用来判断两个函数是否有相似关系。
75.为模糊匹配设定一个相似度阈值,超过该阈值判定待检测函数与该漏洞函数有相似关系,继续进行后续的精确匹配以验证漏洞,若低于该阈值则直接判定待检测函数与该漏洞函数无相似关系。
76.最后精确匹配算法是基于aho-corasick算法的多模态匹配。
77.本发明将目标函数的语法结构作为主串,将漏洞函数指纹中的所有差异行代码作为多个模式串,若所有删除行差异指纹可以在目标函数的语法结构中精确匹配,所有增加行差异指纹无法在目标函数的语法结构中精确匹配,则证明目标函数存在漏洞。
78.ac算法实现分为预处理和匹配两步。
79.预处理:将多个关键字构造成一个有限状态模式匹配机,构造一个包含所有关键字的自动机,自动机主要具有如下三个函数。
80.转向:该函数存储自动机中所有关键字构造的trie中的边,它以二维数组表示,在其中存储当前字符的状态的该字符的下一个状态。
81.失效:此函数存储当前字符在tire中没有边时所连接的所有边,它表示为一维数组,其中存储当前状态的下一个状态。
82.输出:该函数存储在当前状态结尾的所有单词的索引。它以一维数组表示,将所有匹配单词的索引存储为当前状态的位图。
83.匹配:遍历内置自动机上的给定文本以查找所有匹配的单词,从主串的第一个字符、自动机的初始状态0开始,如果成功匹配到该字符,则按自动机的转向函数转移到下一状态;如果转移的状态对应有输出函数,则输出已匹配上的模式串;如果字符匹配失败,则根据自动机的失效函数以递归方式执行传输。
84.按照上述针对基于函数级代码相似性的漏洞检测方法的思路及实施步骤,通过基于函数级代码相似性的漏洞检测原型系统的运行结果知,模型选择了五个开源项目进行漏洞检测。
85.项目大小的范围从13.1mb到965m,而c函数的数量范围从1161到435,734。
86.代码克隆检测精确度为77.3%,被召回率为75.6%。
87.仅在28小时完成了指纹生成并检测了1个gb大小目标的克隆。
88.本模型可以将检测范围拓展到大规模代码仓库中,解决了如何在高频率增量代码的场景下达到开销与性能的平衡的问题。
89.本文面向网络安全领域,针对网络安全领域函数级漏洞代码检测问题,本文基于开源的函数级漏洞源代码,结合模糊哈希值尝试设计了漏洞函数指纹,提出了基于函数级代码相似性的漏洞检测方法。
90.首先使用自定义的语法抽象化和规范化规则对开源漏洞函数和待检测函数源代码进行预处理;然后利用漏洞函数体和相应patch文件中的增加行代码和删除行代码生成漏洞函数指纹和待检测函数指纹;基于函数指纹的漏洞检测过程共包括两步匹配:基于wagner fischer算法的模糊匹配和基于aho-corasick算法的多模态精确匹配,最后,通过实验验证和实验,代码克隆检测精确度为77.3%,被召回率为75.6%。
91.仅在28小时完成了指纹生成并检测了1个gb大小目标的克隆,验证了本文方法的正确性及有效性。
92.本发明避免生成复杂的中间表示,同时保留了基本的语法结构,保证了检测模型的性能,尤其是检测精度不受语法上无意义的修改的影响,可以进行1-3类克隆检测,同时自动区分漏洞代码和已打补丁的代码。
93.在保证低误报率和漏报率的同时,提升了漏洞检测的可扩展性。
94.本模型可以将检测范围拓展到大规模代码仓库中,在高频率增量代码的场景下达到开销与性能的平衡。
转载请注明原文地址:https://win.8miu.com/read-950293.html

最新回复(0)