一种基于新型漏洞指纹的脆弱性检测方法及系统技术方案

技术编号:34474747 阅读:33 留言:0更新日期:2022-08-10 08:49
本发明专利技术公开基于新型漏洞指纹的脆弱性检测方法及系统,包括:通过构建漏洞指纹的漏洞,收集修改前后的样本代码,构建代码解析器;利用代码解析器对漏洞补丁文件进行预处理,基于规范性代码和利用语法树形成控制流图,获取漏洞指纹;基于LCS算法计算待检测代码和形成漏洞指纹的补丁文件相似度,确定敏感代码段;对敏感代码段进行处理,得到敏感代码段的基本块特征序列和路径特征序列;将漏洞指纹映的基本块特征集合映射到位图中,基于位图对敏感代码段的基本块特征序列进行遍历;基于敏感代码段基本块特征序列和路径特征序列,判断敏感代码段是否存在脆弱代码片段,若是,输出脆弱代码片段。本发明专利技术提高了代码复用的检测效率和检测方法的鲁棒性与实用性。方法的鲁棒性与实用性。方法的鲁棒性与实用性。

【技术实现步骤摘要】
一种基于新型漏洞指纹的脆弱性检测方法及系统


[0001]本专利技术属于计算机软件漏洞挖掘
,涉及一种基于新型漏洞指纹的脆弱性检测方法及系统。

技术介绍

[0002]利用现有组件与代码模板进行开发已经成为软件工程中的常用手段,现有研究指出知名代码仓库GitHub中70%的代码由以前创建文件的克隆组成开源代码作为提高开发效率、降低开发成本的良好选择,在互联网应用、网络安全、医疗卫生、大数据与人工智能、工业控制与自动化等领域有着广泛应用。引用开源项目、调用第三方库以及使用公开组件等手段使得开源代码从不同渠道进入到各类项目中,含有漏洞的代码(脆弱性代码)也被同时引入。开源项目的漏洞信息通常会通过漏洞数据库、邮件列表和项目主页等公开渠道披露,获取漏洞细节的门槛较低,项目受到攻击的风险较高。Black Duck公司在《开源软件安全与威胁分析报告》中指出,超过67%的使用开源组件的商用软件中存在已知的漏洞代码;研究开源项目中脆弱性代码复用的检测方法对保证信息安全具有重要意义。
[0003]脆弱性代码的复用是引发漏洞的重要原因之一,检测脆弱性代码复用是面向源代码进行漏洞挖掘的重要手段之一。代码克隆是代码复用的基本手段,代码复用的手段通常是在代码克隆的基础上使用修改注释、重命名、更改操作符或操作数、调整语句顺序、更改代码块顺序、添加冗余代码、更改数据类型、控制结构的等价变换。目前提出的对代码克隆过程中的修改操作的分类方法受到了普遍认可。Level1修改是指仅重新排版和删改注释,不对代码部分进行任何变动;Level2修改是指对函数名、变量名等标识符进行重命名,并改变变量、函数返回的数据类型;Level3修改是指在不影响正常功能的前提下,添加或删除少量语句,替换部分表达式或函数调用;Level4修改是指在不影响语义的前提下调整代码结构,更改代码顺序,进行控制结构的等价变换。包含Level2、3、4中的修改手段的克隆通常被称为近似克隆(near

miss clone),也被称为代码复用。随着代码修改程度的不断增加,代码复用检测的难度也不断增大。现有工作可以准确完成对Level1、2修改手段的检测,但是更进一步的检测需要在分析结构、语义的基础上利用中间表示完成,计算开销较大。常见的代码克隆通常包含Level3、4的修改,高效检测包含此类修改的脆弱性代码复用意义重大。
[0004]现有技术的缺陷和不足:
[0005]现有方法为了检测脆弱性代码的近似克隆,通常需要将代码抽象为解析树或控制流图等中间表示,与已知漏洞代码的结构或特征进行匹配。然而引入复杂的中间表示会带来较高的计算代价,过度抽象可能会导致漏洞必要属性的缺失.在平衡效率与准确性的前提下。漏洞指纹技术在一定程度上有效缓解了这个问题,但是在代码块的语义和语法表达上却具有一定的欠缺。如何有效应对常见的代码修改手段是研究的重点问题。

技术实现思路

[0006]本专利技术的目的在于解决现有技术中的问题,提供一种基于新型漏洞指纹的脆弱性
检测方法及系统,提高代码复用的检测效率,提高检测方法的鲁棒性与实用性。
[0007]为达到上述目的,本专利技术采用以下技术方案予以实现:
[0008]一种基于新型漏洞指纹的脆弱性检测方法,包括:
[0009]选取用于构建漏洞指纹的漏洞,从漏洞对应的公开数据库中获取漏洞补丁文件diff,获得漏洞修改前后的样本代码;
[0010]构建代码解析器;
[0011]利用代码解析器分别对漏洞补丁文件diff中修改前后的样本代码进行预处理,获得规范性代码;
[0012]基于规范性代码和利用语法树形成控制流图,获取漏洞指纹;其中,漏洞指纹包含基本块特征序列;
[0013]对于待检测代码,基于LCS算法计算待检测代码和形成漏洞指纹的补丁文件相似度,确定敏感代码段;
[0014]对敏感代码段进行处理,得到敏感代码段的基本块特征序列和路径特征序列;
[0015]将漏洞指纹中的基本块特征序列映射到一个m位的位图,初始状态每一位都置为0,基于位图对敏感代码段的基本块特征序列进行遍历,判断敏感代码段的基本块特征序列中的特征值是否在在位图中,若是,将位图中对应的位定为1;若否,则不进行改变;
[0016]对敏感代码段进行标记,基于敏感代码段的路径特征序列,判断标记后的敏感代码段是否存在脆弱代码片段,若是,输出脆弱代码片段。
[0017]本专利技术的进一步改进在于:
[0018]构建代码解析器具体为:基于开源解析器ANTLR4构建解析器对应的岛屿语法,生成代码解析器。
[0019]在进行预处理之前,将所用代码转换为小写,删除多余空格、制表符、换行符和所有注释;将缩进样式改为Lisp样式。
[0020]代码解析器对漏洞补丁文件diff中修改前后的样本代码进行预处理,获得规范性代码,具体为:对函数和参数名、变量标识符、数据类型、字符串常量以及函数调用名进行统一替换;获得代码规范化和抽象化的结果。
[0021]对函数和参数名、变量标识符、数据类型、字符串常量以及函数调用名进行统一替换,具体为:
[0022]函数名与参数名替换:从函数的声明中获取所有形式参数,使用符号“_P ARAM”替换函数体中所有参数变量,使用符号“_FUNCDEC”替换函数声明中的函数名;
[0023]变量标识符替换:使用符号“_DATA”替换在函数体内定义并且使用的所有变量;
[0024]数据类型替换:使用符号“_TYPE”替换数据类型,但不替换signed、uns igned等类型修饰符;
[0025]常量替换:使用符号“_STR”替换代码中字符串常量,不替换所有print类函数中包含的“%”等格式字符的字符串参数;
[0026]函数调用替换:使用符号“_FUNCTION”替换每个被调用的函数的名称。
[0027]基于规范性代码和利用语法树形成控制流图,获取漏洞指纹;具体为:
[0028]1.1,利用语法树形成控制流图获取代码的基本块和基本块之间的控制转移路径;
[0029]1.2,将修改前的补丁文件形成的基本块集合称为blockA,路径集合称为p athA;
修改后的基本块集合称为blockB;
[0030]1.3,利用哈希函数分别计算blockA和blockB中基本块的特征值和pathA中路径的特征值;
[0031]1.4,设置第一空白代码块特征序列和第二空白代码块特征序列,设置第一空白的路径特征序列,将获得的基本块特征值分别添加到第一空白代码块特征序列和第二空白代码块特征序列中,得到修改前的补丁文件的代码块特征序列seqA和修改后的补丁文件的代码块特征序列seqB;将pathA获得的路径特征添加到第一空白的路径特征序列中,得到修改后的补丁文件的路径特征序列hA,并形成补丁文件diff对应的特征向量V(seqA,seqB,hA);
[0032]1.5,针对漏洞补丁中所有的补丁文件diff本文档来自技高网
...

【技术保护点】

【技术特征摘要】
1.一种基于新型漏洞指纹的脆弱性检测方法,其特征在于,包括:选取用于构建漏洞指纹的漏洞,从漏洞对应的公开数据库中获取漏洞补丁文件diff,获得漏洞修改前后的样本代码;构建代码解析器;利用代码解析器分别对漏洞补丁文件diff中修改前后的样本代码进行预处理,获得规范性代码;基于规范性代码和利用语法树形成控制流图,获取漏洞指纹;其中,漏洞指纹包含基本块特征序列;对于待检测代码,基于LCS算法计算待检测代码和形成漏洞指纹的补丁文件相似度,确定敏感代码段;对敏感代码段进行处理,得到敏感代码段的基本块特征序列和路径特征序列;将漏洞指纹中的基本块特征序列映射到一个m位的位图,初始状态每一位都置为0,基于位图对敏感代码段的基本块特征序列进行遍历,判断敏感代码段的基本块特征序列中的特征值是否在在位图中,若是,将位图中对应的位定为1;若否,则不进行改变;对敏感代码段进行标记,基于敏感代码段的路径特征序列,判断标记后的敏感代码段是否存在脆弱代码片段,若是,输出脆弱代码片段。2.根据权利要求1所述的基于新型漏洞指纹的脆弱性检测方法,其特征在于,所述构建代码解析器,具体为:基于开源解析器ANTLR4构建解析器对应的岛屿语法,生成代码解析器;在进行预处理之前,将所用代码转换为小写,删除多余空格、制表符、换行符和所有注释;将缩进样式改为Lisp样式。3.根据权利要求2所述的基于新型漏洞指纹的脆弱性检测方法,其特征在于,所述代码解析器对漏洞补丁文件diff中修改前后的样本代码进行预处理,获得规范性代码,具体为:对函数和参数名、变量标识符、数据类型、字符串常量以及函数调用名进行统一替换;获得代码规范化和抽象化的结果。4.根据权利要求3所述的基于新型漏洞指纹的脆弱性检测方法,其特征在于,所述对函数和参数名、变量标识符、数据类型、字符串常量以及函数调用名进行统一替换,具体为:函数名与参数名替换:从函数的声明中获取所有形式参数,使用符号“_PARAM”替换函数体中所有参数变量,使用符号“_FUNCDEC”替换函数声明中的函数名;变量标识符替换:使用符号“_DATA”替换在函数体内定义并且使用的所有变量;数据类型替换:使用符号“_TYPE”替换数据类型,但不替换signed、uns igned等类型修饰符;常量替换:使用符号“_STR”替换代码中字符串常量,不替换所有print类函数中包含的“%”等格式字符的字符串参数;函数调用替换:使用符号“_FUNCTION”替换每个被调用的函数的名称。5.根据权利要求4所述的基于新型漏洞指纹的脆弱性检测方法,其特征在于,所述基于规范性代码和利用语法树形成控制流图,获取漏洞指纹;具体为:5.1,利用语法树形成控制流图获取代码的基本块和基本块之间的控制转移路径;5.2,将修改前的补丁文件形成的基本块集合称为blockA,路径集合称为pathA;修改后
的基本块集合称为blockB;5.3,利用哈希函数分别计算blockA和blockB中基本块的特征值和pathA中路径的特征值;5.4,设置第一空白代码块特征序列和第二空白代码块特征序列,设置第一空白的路径特征序列,将获得的基本块特征值分别添加到第一空白代码块特征序列和第二空白代码块特征序列中,得到修改前的补丁文件的代码块特征序列seqA和修改后的补丁文件的代码块特征序列seqB;将pathA获得的路径特征添加到第一空白的路径特征序列中,得到修改后的补丁文件的路径特征序列hA,并形成补丁文件diff对应的特征向量V(seqA,seqB,hA);5.5,针对漏洞补丁中所有的补丁文件diff,重复步骤5.1到5.4获得特征向量V1,V2...Vn;特征向量V1,V2...Vn共同组成漏洞...

【专利技术属性】
技术研发人员:赵加坤陈迪阳杜小智
申请(专利权)人:西安交通大学
类型:发明
国别省市:

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

1