【技术实现步骤摘要】
一种基于新型漏洞指纹的脆弱性检测方法及系统
[0001]本专利技术属于计算机软件漏洞挖掘
,涉及一种基于新型漏洞指纹的脆弱性检测方法及系统。
技术介绍
[0002]利用现有组件与代码模板进行开发已经成为软件工程中的常用手段,现有研究指出知名代码仓库GitHub中70%的代码由以前创建文件的克隆组成开源代码作为提高开发效率、降低开发成本的良好选择,在互联网应用、网络安全、医疗卫生、大数据与人工智能、工业控制与自动化等领域有着广泛应用。引用开源项目、调用第三方库以及使用公开组件等手段使得开源代码从不同渠道进入到各类项目中,含有漏洞的代码(脆弱性代码)也被同时引入。开源项目的漏洞信息通常会通过漏洞数据库、邮件列表和项目主页等公开渠道披露,获取漏洞细节的门槛较低,项目受到攻击的风险较高。Black Duck公司在《开源软件安全与威胁分析报告》中指出,超过67%的使用开源组件的商用软件中存在已知的漏洞代码;研究开源项目中脆弱性代码复用的检测方法对保证信息安全具有重要意义。
[0003]脆弱性代码的复用是引发漏洞的重要原因之一,检测脆弱性代码复用是面向源代码进行漏洞挖掘的重要手段之一。代码克隆是代码复用的基本手段,代码复用的手段通常是在代码克隆的基础上使用修改注释、重命名、更改操作符或操作数、调整语句顺序、更改代码块顺序、添加冗余代码、更改数据类型、控制结构的等价变换。目前提出的对代码克隆过程中的修改操作的分类方法受到了普遍认可。Level1修改是指仅重新排版和删改注释,不对代码部分进行任何变动;Level2修改是 ...
【技术保护点】
【技术特征摘要】
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共同组成漏洞...
还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。