基于代码属性图的软件脆弱性智能检测方法、系统及介质技术方案

技术编号:28295890 阅读:39 留言:0更新日期:2021-04-30 16:20
本发明专利技术公开了一种基于代码属性图的软件脆弱性智能检测方法、系统及介质,方法包括为被检测的代码样本生成代码属性图并提取出抽象语法树序列、控制流图序列和程序依赖图序列,将得到的各种序列分别通过预先训练好的向量映射器转换为数值型向量,再通过对应的预先训练好的特征提取器提取特征向量,然后将提取得到的三种特征向量合并成代码样本的特征向量;将代码样本的特征向利用预先训练好的脆弱性检测器得到代码样本为脆弱性代码的概率,若该概率超过预设阈值则判定该代码样本为脆弱性代码。本发明专利技术的处理方式能够保留源代码较多的语法和语义等信息,可提高面向跨软件源代码混合的真实数据集的脆弱性检测效果,降低误报率和漏报率。

【技术实现步骤摘要】
基于代码属性图的软件脆弱性智能检测方法、系统及介质
本专利技术涉及计算机程序检测、以及软件脆弱性检测检测
,具体涉及一种基于代码属性图的软件脆弱性智能检测方法、系统及介质。
技术介绍
软件脆弱性是指软件在其生命周期(即开发、部署、执行整个过程)中存在的缺陷,这些缺陷可被不法分子利用,如绕过系统的访问控制、非法窃取较高的权限等,往往造成用户隐私数据泄露、数字资产被盗、系统信息被更改等安全问题,从而导致企业和个人巨大的经济损失和名誉损失。随着现在软件系统的复杂度越来越高,规模越来越大,脆弱性代码出现的频率也在不断提升。根据美国国家漏洞数据库(NationalVulnerabilityDatabase,NVD)公布数据显示,2017年公布的脆弱性代码数目为14645个,2018年公布的脆弱性代码数目为16511个,2019年公布的脆弱性代码数目为17305个。随着计算机技术的发展,脆弱性代码出现的频率也在不断上升,因此及时发现软件中存在的脆弱性代码是一份十分重要的工作。目前检测软件脆弱性的方法主要有静态、动态和混合三大类。静态方法包括基于规则的分析、代码相似性检测(即代码克隆检测)和符号执行等方法。其中,基于规则的分析主要依靠专家人工去发现脆弱性代码中的脆弱性代码中的规则,并用脆弱性代码的规则对源代码进行匹配;代码相似性检测是将源代码与脆弱性代码进行相似度比较,进而发现脆弱性;符号执行是将输入用符号来表征而不是具体值,将程序的执行过程和程序变量表征成符号表达式。静态分析技术主要依靠对源代码的分析,往往难以发现在运行时发生的错误和脆弱性,并且存在误报率高的缺点。与静态方法不同,动态方法是通过实际运行软件来寻找脆弱性,因此可以发现软件运行时的错误。动态方法包括模糊测试和污点分析等方法。模糊测试主要是通过向目标系统提供非预期的输入并监视异常结果来发现软件脆弱性的方法;污点分析主要是通过实时监控程序的污点数据在系统程序中的传播来检测数据能否从污点源传播到污点汇聚点,进而检测软件中的脆弱性。动态测试方法通常十分耗时并且缺乏完整性,容易出现漏报的现象。混合方法结合了静态和动态分析技术,克服了部分缺点,但混合方法难以全部实现自动化检测,并且对未知脆弱性的检测效果相对较弱。目前,软件规模越来越庞大和复杂,脆弱性形式也更趋向多样化,传统的软件脆弱性检测方法在处理复杂且多样化的脆弱性方面存在着困难。与传统的软件脆弱性检测方法相比,基于机器学习的方法可以从海量数据中发现和学习规律,具有可自动寻找脆弱性的特点,减少了人工参与度,提高了检测的自动化程度。基于机器学习的软件脆弱性检测方法能通过学习已有的脆弱性代码特征检测出类似或未知脆弱性。与基于规则的分析方法相比,无需人工进行规则的提取,降低了人的主观性对于误报率和漏报率的影响等优势;代码相似性分析方法检测未知脆弱性的能力有限,机器学习算法具有自动学习脆弱性代码的特点,在检测未知脆弱性方面有一定优势;与符号执行相比,无需分析程序的执行过程以构建执行路径,可检测的脆弱性类型更具有一般性;与动态方法相比,无需运行软件,只需分析软件源代码,降低了对运行环境配置要求等优势。因此,机器学习方法和工具被研究者们应用到软件脆弱性检测领域,并提出了很多十分有效的算法。但是,机器学习方法应用到软件脆弱性领域,具体如何选择有效的检测特征、如何选择有效的及其学习模型以提高检测的效果,则仍然是一项亟待解决的关键技术问题。
技术实现思路
本专利技术要解决的技术问题:针对现有技术的上述问题,提供一种基于代码属性图的软件脆弱性智能检测方法、系统及介质,本专利技术针对现在脆弱性检测方法对于对跨软件的真实数据集的脆弱性检测效果较弱、误报率和漏报率较高等问题,通过先将源代码函数表征成代码属性图,再从代码属性图中提取出抽象语法树序列、控制流图序列和程序依赖图序列的方式,以减少源代码表征过程中语义和语法信息的损失、保留更多代码特征信息,然后通过机器学习的方法从序列中提取出特征向量,最后将特征向量作为脆弱性检测模型的输入对源代码进行脆弱性检测,通过这种方式可保留源代码较多的语法和语义等信息,可提高面向跨软件源代码混合的真实数据集的脆弱性检测效果,降低误报率和漏报率。为了解决上述技术问题,本专利技术采用的技术方案为:一种基于代码属性图的软件脆弱性智能检测方法,包括:1)基于待检测的代码样本生成代码属性图,所述代码样本为一个函数;2)从代码属性图中提取出抽象语法树序列、控制流图序列和程序依赖图序列;3)将抽象语法树序列、控制流图序列和程序依赖图序列分别通过预先训练好的向量映射器转换为数值型向量,得到抽象语法树向量、控制流图向量和程序依赖图向量;4)将抽象语法树向量、控制流图向量和程序依赖图向量分别通过对应的预先训练好的特征提取器提取特征向量,然后将提取得到的三种特征向量合并成代码样本的特征向量;5)将代码样本的特征向利用预先训练好的脆弱性检测器得到代码样本为脆弱性代码的概率,若该概率超过预设阈值则判定该代码样本为脆弱性代码。可选地,步骤1)之前还包括对待检测的代码样本进行预处理的步骤,所述预处理包括:针对所有的参数将名称按照出现的顺序替换为第一指定符号加顺序编号的形式,针对所有的变量将名称按照出现的顺序替换为第二指定符号加顺序编号的形式,针对所有的字符串常量,将名称替换为第三指定符号。可选地,步骤3)中预先训练好的向量映射器由分词器Tokenizer和词向量转换模型Word2Vec构成,输入是文本型向量,输出为N1*N2维的数值型向量,用于将文本型向量转换成机器学习算法可识别的N1*N2维向量,其中N1为词向量转换模型Word2Vec训练得到的单个映射向量的长度,N2为单个代码样本的文本型向量的长度。可选地,步骤3)之前包括训练向量映射器的步骤:A1)从预设的脆弱性代码数据集中提取代码样本,生成代码属性图,并从代码属性图中提取出抽象语法树序列、控制流图序列和程序依赖图序列,生成的抽象语法树序列、控制流图序列和程序依赖图序列中的所有元素组成一个语料库;A2)利用语料库对分词器Tokenizer进行训练得到词典D1,在词典D1中每个在语料库中出现过的词Token都有唯一对应的索引号;A3)利用语料库对词向量转换模型Word2Vec进行训练,词向量转换模型Word2Vec根据每个词Token在语料库中出现的频次生成词Token的映射集V1,语料库中出现次数超过阈值的每个词Token在映射集V1中有唯一的长度为N1的向量表示;步骤3)将抽象语法树序列、控制流图序列和程序依赖图序列分别通过预先训练好的向量映射器转换为数值型向量的步骤包括:将抽象语法树序列先通过词典D1转化由序列中的每个Token对应的索引号构成的数值型向量V2,当V2长度大于N2时,在向量末端截断,当V2长度小于N2时,在向量末端补0,使所有的向量长度全部为N2;由于索引号是整数,存在大小关系,而抽象语法树序列本身的每个Token是没有大小关系的因此再通过映射集V1,将数值型本文档来自技高网
...

【技术保护点】
1.一种基于代码属性图的软件脆弱性智能检测方法,其特征在于,包括:/n1)基于待检测的代码样本生成代码属性图,所述代码样本为一个函数;/n2)从代码属性图中提取出抽象语法树序列、控制流图序列和程序依赖图序列;/n3)将抽象语法树序列、控制流图序列和程序依赖图序列分别通过预先训练好的向量映射器转换为数值型向量,得到抽象语法树向量、控制流图向量和程序依赖图向量;/n4)将抽象语法树向量、控制流图向量和程序依赖图向量分别通过对应的预先训练好的特征提取器提取特征向量,然后将提取得到的三种特征向量合并成代码样本的特征向量;/n5)将代码样本的特征向利用预先训练好的脆弱性检测器得到代码样本为脆弱性代码的概率,若该概率超过预设阈值则判定该代码样本为脆弱性代码。/n

【技术特征摘要】
1.一种基于代码属性图的软件脆弱性智能检测方法,其特征在于,包括:
1)基于待检测的代码样本生成代码属性图,所述代码样本为一个函数;
2)从代码属性图中提取出抽象语法树序列、控制流图序列和程序依赖图序列;
3)将抽象语法树序列、控制流图序列和程序依赖图序列分别通过预先训练好的向量映射器转换为数值型向量,得到抽象语法树向量、控制流图向量和程序依赖图向量;
4)将抽象语法树向量、控制流图向量和程序依赖图向量分别通过对应的预先训练好的特征提取器提取特征向量,然后将提取得到的三种特征向量合并成代码样本的特征向量;
5)将代码样本的特征向利用预先训练好的脆弱性检测器得到代码样本为脆弱性代码的概率,若该概率超过预设阈值则判定该代码样本为脆弱性代码。


2.根据权利要求1所述的基于代码属性图的软件脆弱性智能检测方法,其特征在于,步骤1)之前还包括对待检测的代码样本进行预处理的步骤,所述预处理包括:针对所有的参数将名称按照出现的顺序替换为第一指定符号加顺序编号的形式,针对所有的变量将名称按照出现的顺序替换为第二指定符号加顺序编号的形式,针对所有的字符串常量,将名称替换为第三指定符号。


3.根据权利要求1所述的基于代码属性图的软件脆弱性智能检测方法,其特征在于,步骤3)中预先训练好的向量映射器由分词器Tokenizer和词向量转换模型Word2Vec构成,输入是文本型向量,输出为N1*N2维的数值型向量,用于将文本型向量转换成机器学习算法可识别的N1*N2维向量,其中N1为词向量转换模型Word2Vec训练得到的单个映射向量的长度,N2为单个代码样本的文本型向量的长度。


4.根据权利要求3所述的基于代码属性图的软件脆弱性智能检测方法,其特征在于,步骤3)之前包括训练向量映射器的步骤:
A1)从预设的脆弱性代码数据集中提取代码样本,生成代码属性图,并从代码属性图中提取出抽象语法树序列、控制流图序列和程序依赖图序列,生成的抽象语法树序列、控制流图序列和程序依赖图序列中的所有元素组成一个语料库;
A2)利用语料库对分词器Tokenizer进行训练得到词典D1,在词典D1中每个在语料库中出现过的词Token都有唯一对应的索引号;
A3)利用语料库对词向量转换模型Word2Vec进行训练,词向量转换模型Word2Vec根据每个词Token在语料库中出现的频次生成词Token的映射集V1,语料库中出现次数超过阈值的每个词Token在映射集V1中有唯一的长度为N1的向量表示;
步骤3)将抽象语法树序列、控制流图序列和程序依赖图序列分别通过预先训练好的向量映射器转换为数值型向量的步骤包括:
将抽象语法树序列先通过词典D1转化由序列中的每个Token对应的索引号构成的数值型向量V2,当V2长度大于N2时,在向量末端截断,当V2长度小于N2时,在向量末端补0,使所有的向量长度全部为N2;由于索引号是整数,存在大小关系,而抽象语法树序列本身的每个Token是没有大小关系的因此再通过映射集V1,将数值型向量V2中的每个Token用映射集中Token对应的长度为N1的向量替换,当映射集V1中不存在当前Token的映射时,用长度为N1的零向量替换,得到N1*N2维的数值型向量V3;
将控制流图序列先通过词典D1转化由序列中的每个Token对应的索引号构成的数值型向量V2,当V2长度大于N2时,在向量末端截断,当V2长度小于N2时,在向量末端补0,使所有的向量长度全部为N2;由于索引号是整数,存在大小关系,而控制流图序列本身的每个Token是没有大小关...

【专利技术属性】
技术研发人员:任怡肖添明谭郁松李宝杨立明杨洒情蹇松雷董攀阳国贵张建锋王静黄辰林王晓川丁滟谭霜王庆坤姜智文
申请(专利权)人:中国人民解放军国防科技大学
类型:发明
国别省市:湖南;43

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

1