C或C++代码漏洞检测方法、系统、计算机及存储介质

文档序号:28444537发布日期:2022-01-12 03:04阅读:167来源:国知局
C或C++代码漏洞检测方法、系统、计算机及存储介质
c或c++代码漏洞检测方法、系统、计算机及存储介质
技术领域
1.本发明涉及源代码漏洞检测的技术领域,尤其涉及到c或c++代码漏洞检测方法、系统、计算机及存储介质。


背景技术:

2.软件漏洞是一个很难忽视的话题,特别是在互联网高度发达的今天,桌面端、移动端上各种各样的软件层出不穷,也正是因为软件的多样性,软件存在漏洞的可能性日益增加。虽然软件给人们的日常生活带来了极大的便利,但任何尚未曝露的软件漏洞都有可能给个人和社会造成严重的后果,因此,在软件漏洞被恶意利用之前检测出来是软件安全的关键一环。
3.而传统的从源代码层级检测漏洞的方法称为静态分析方法,通过分析源代码的词法、语法、控制流等信息来检测漏洞,例如商用软件coverity、klocwork等,但这些软件往往依赖人工定义的代码漏洞匹配规则,在应对尚未被人工定义匹配规则的漏洞时存在较高的漏报率和误报率。同时,漏洞种类繁多,在定义规则的过程中每一类型的漏洞都需要相对应的人工专家耗费大量时间在源代码上,存在效率较低和定义规则涵盖漏洞专家个人主观判断两个问题。


技术实现要素:

4.本发明的目的在于克服现有技术的不足,提供一种c或c++代码漏洞检测方法,采用深度学习和自然语言处理结合的方式进行源代码漏洞检测,相比传统的静态分析方法,不需要人工专家手工定义匹配规则,显著降低漏洞误报率和漏报率。
5.为实现上述目的,本发明所提供的技术方案为:
6.一种c或c++代码漏洞检测方法,包括以下步骤:
7.s1、将包括训练集和待检集的c或c++代码集合进行预处理,使得该c或c++代码集合转化为符号表示;
8.s2、训练集的每一部分代码的符号表示根据代码自身属性打上标签;
9.s3、新建漏洞检测模型,并通过打上标签的训练集进行训练;
10.s4、将已转化为符号表示的c或c++代码集合中的待检集作为输入,通过已完成训练的漏洞检测模型进行检测,并输出漏洞检测结果。
11.进一步地,所述步骤s1中,预处理过程包括:
12.s1-1、从c或c++程序代码集合中搜索api函数调用;
13.s1-2、根据搜索到的api函数调用,以传进函数的参数作为出发点,记录其每个参数所在代码行,如果记录的某一代码行存在未知的参数或变量,则查找并记录其他存在该些未知的参数或变量的代码行,最后得到该函数调用相关联的代码;
14.s1-3、基于所得函数调用相关联的代码,按代码执行先后顺序排列代码,得到代码片段;
15.s1-4、根据所得代码片段,移除代码注释和非可读字符,对用户定义的变量和函数做符号映射,得到符号表示。
16.进一步地,所述步骤s3中,已转化为符号表示及打上标签的训练集中的c或c++代码输入漏洞检测模型,依次经过词编码器、词注意力层、句编码器、句注意力层,最终输出结果向量,结果向量再通过softmax层得到该c或c++代码存在漏洞的概率分布,概率较大的值即为检测值,检测值与标签值重合越多代表漏洞检测训练越准确;不断调节词编码器、词注意力层、句编码器、句注意力层中的各个参数,直到满足设定的精度要求;
17.其中,词编码器的处理,用于获取每一个词的隐藏状态;
18.词注意力层的处理,用于获取每行符号表示的特征向量;
19.句编码器的处理,用于获取每行符号表示的隐藏状态;
20.句注意力层的处理,用于获取结果向量。
21.进一步地,词编码器的处理过程包括:
22.a1、符号表示转化为向量;使用词法分析器将每一行符号表示转化为词序列,再使用word2vec模型将每一行词序列表示成向量形式。
23.a2、统一向量长度;根据调用函数中参数的来源不同,将调用的函数分为外部函数和内部函数,外部函数指参数受io交互影响,内部函数则相反;向量长度大于固定值时,外部函数向量丢弃尾部数据,内部函数向量丢弃头部数据;向量长度小于固定值时,外部函数向量尾部填充0,内部函数向量头部填充0,从而统一向量的长度;
24.a3、获取每一个词的隐藏状态;以统一长度的向量作为输入,分别通过前向和后向gru网络获得前后向隐藏状态,接着拼接前后向隐藏状态,从而得到每一个词的隐藏状态。
25.进一步地,词注意力层的处理过程包括:以词编码器编码后的每一个词的隐藏状态作为输入,通过只含一个隐藏层的多层感知机并以tanh作为激活函数获得每一个词的隐藏表征,隐藏表征再通过softmax函数获得每一个词在对应符号表示中的权重,最后将每个词的权重乘以每个词的向量相加获取对应符号表示的特征向量。
26.进一步地,句编码器的处理过程包括:以词注意力层获取的特征向量作为输入,通过前向和后向gru网络获得前后向隐藏状态,拼接前后向隐藏状态得到每行符号表示的隐藏状态。
27.进一步地,句注意力层的处理过程包括:以句编码器编码后的每行符号表示的隐藏状态作为输入,通过只含一个隐藏层的多层感知机并以tanh作为激活函数获得每行符号表示的隐藏表征,隐藏表征再通过softmax函数获得每行符号表示在整个代码片段中的权重,最后将每行符号表示的权重乘以每行符号表示的特征向量相加获取整个代码片段的结果向量。
28.为实现上述目的,本发明另外提供一种c或c++代码漏洞检测系统,所述c或c++代码漏洞检测系统用于实现上述c或c++代码漏洞检测方法,具体包括依次连接的预处理模块、标签模块、漏洞检测模型训练模块以及漏洞检测模块;
29.其中,
30.所述预处理模块用于将包括训练集和待检集的c或c++代码集合转化为符号表示;
31.所述标签模块用于对已转化为符号表示的c或c++代码集合中的训练集打上标签;
32.所述漏洞检测模型训练模块用于通过打上标签的训练集训练漏洞检测模型;
33.所述漏洞检测模块用于将已转化为符号表示的c或c++代码集合中的待检集作为输入,通过已完成训练的漏洞检测模型进行检测,并输出漏洞检测结果。
34.为实现上述目的,本发明另外提供一种计算机,包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,所述处理器执行所述程序时实现上述方法的步骤。
35.为实现上述目的,本发明另外提供一种存储介质,存储有计算机程序,该程序被处理器执行时实现上述方法的步骤。
36.与现有技术相比,本技术方案的原理和优点如下:
37.1)本技术方案采用深度学习和自然语言处理结合的方式,在源代码层级上检测代码漏洞,利用深度学习和自然语言处理的优点,先从大量打上标签的c/c++代码片段中提取含有漏洞代码片段的语义语法等特征,从而对未打标签c/c++代码进行漏洞检测,能够在不靠漏洞专家人工定义漏洞规则的情况下完成代码漏洞的自动化检测。
38.2)传统的代码静态分析方法检测漏洞需要人工定义规则,在定义规则的过程中受专家主观影响,存有高误报率和漏报率,而本技术方案靠神经网络模型检测漏洞只受训练集代码和模型架构影响,在训练漏洞检测模型的过程中可以调整模型的各个参数获取最优模型,检测c/c++代码漏洞的误报率和漏报率较低。
附图说明
39.为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的服务作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
40.图1为本发明实施例中c或c++代码漏洞检测方法的原理流程图;
41.图2为本发明实施例中采用到的神经网络模型的框架示意图;
42.图3为本发明实施例中采用到的gru网络示意图;
43.图4为本发明实施例中c或c++代码漏洞检测系统的结构示意图。
具体实施方式
44.下面结合实施例及附图对本发明作进一步详细的描述,但本发明的实施方式不限于此。
45.如图1所示,本实施例所述的c或c++代码漏洞检测方法,包括以下步骤:
46.s1、将包括训练集和待检集的c或c++代码集合进行预处理,使得该c或c++代码集合转化为符号表示;
47.预处理过程包括:
48.s1-1、从c或c++程序代码集合中搜索api函数调用;
49.s1-2、根据搜索到的api函数调用,以传进函数的参数作为出发点,记录其每个参数所在代码行,如果记录的某一代码行存在未知的参数或变量,则查找并记录其他存在该些未知的参数或变量的代码行,最后得到该函数调用相关联的代码;
50.s1-3、基于所得函数调用相关联的代码,按代码执行先后顺序排列代码,得到代码
片段;
51.s1-4、根据所得代码片段,移除代码注释和非可读字符,对用户定义的变量和函数做符号映射,得到符号表示。
52.s2、训练集的每一部分代码的符号表示根据代码自身属性打上标签,若代码存在漏洞,则标签置为1,否则置为0;
53.s3、新建如图2所示的漏洞检测模型,并将已转化为符号表示及打上标签的训练集中的c或c++代码输入至漏洞检测模型,依次经过词编码器、词注意力层、句编码器、句注意力层,最终输出结果向量,结果向量再通过softmax层得到该c或c++代码存在漏洞的概率分布,概率较大的值即为检测值,检测值与标签值重合越多代表漏洞检测训练越准确;不断调节词编码器、词注意力层、句编码器、句注意力层中的各个参数,直到满足设定的精度要求;
54.其中,经过的各子步骤的具体过程如下:
55.词编码器的处理:
56.a1、符号表示转化为向量;使用词法分析器将每一行符号表示转化为词序列,再使用word2vec模型将每一行词序列表示成向量形式。
57.a2、统一向量长度;根据调用函数中参数的来源不同,将调用的函数分为外部函数和内部函数,外部函数指参数受io交互影响,内部函数则相反;向量长度大于固定值时,外部函数向量丢弃尾部数据,内部函数向量丢弃头部数据;向量长度小于固定值时,外部函数向量尾部填充0,内部函数向量头部填充0,从而统一向量的长度;
58.a3、获取每一个词的隐藏状态;以统一长度的向量作为输入,分别通过前向和后向gru网络(如图3所示)获得前后向隐藏状态,接着拼接前后向隐藏状态,从而得到每一个词的隐藏状态。
59.词注意力层的处理:
60.以词编码器编码后的每一个词的隐藏状态作为输入,通过只含一个隐藏层的多层感知机并以tanh作为激活函数获得每一个词的隐藏表征,隐藏表征再通过softmax函数获得每一个词在对应符号表示中的权重,最后将每个词的权重乘以每个词的向量相加获取对应符号表示的特征向量。
61.句编码器的处理:
62.以词注意力层获取的特征向量作为输入,通过前向和后向gru网络获得前后向隐藏状态,拼接前后向隐藏状态得到每行符号表示的隐藏状态。
63.句注意力层的处理:
64.以句编码器编码后的每行符号表示的隐藏状态作为输入,通过只含一个隐藏层的多层感知机并以tanh作为激活函数获得每行符号表示的隐藏表征,隐藏表征再通过softmax函数获得每行符号表示在整个代码片段中的权重,最后将每行符号表示的权重乘以每行符号表示的特征向量相加获取整个代码片段的结果向量。
65.s4、将已转化为符号表示的c或c++代码集合中的待检集作为输入,通过已完成训练的漏洞检测模型进行检测,并输出漏洞检测结果,0代表待检集的代码片段不存在漏洞,1代表待检集的代码片段存在漏洞。
66.另外,本实施例还涉及一种c或c++代码漏洞检测系统,用于实现上面所述的c或c++代码漏洞检测方法,具体包括依次连接的预处理模块1、标签模块2、漏洞检测模型训练模
块3以及漏洞检测模块4;
67.其中,
68.预处理模块1用于将包括训练集和待检集的c或c++代码集合转化为符号表示;标签模块2用于对已转化为符号表示的c或c++代码集合中的训练集打上标签;漏洞检测模型训练模块3用于通过打上标签的训练集训练漏洞检测模型;漏洞检测模块4用于将已转化为符号表示的c或c++代码集合中的待检集作为输入,通过已完成训练的漏洞检测模型进行检测,并输出漏洞检测结果。
69.接着,本实施例还涉及到一种计算机,其包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,该处理器执行所述程序时实现上述c或c++代码漏洞检测方法的步骤。
70.最后,本实施例还涉及到一种存储介质,其存储有计算机程序,该程序被处理器执行时实现上述c或c++代码漏洞检测方法的步骤。
71.本实施例采用深度学习和自然语言处理结合的方式,在源代码层级上检测代码漏洞,利用深度学习和自然语言处理的优点,先从大量打上标签的c/c++代码片段中提取含有漏洞代码片段的语义语法等特征,从而对未打标签c/c++代码进行漏洞检测,能够在不靠漏洞专家人工定义漏洞规则的情况下完成代码漏洞的自动化检测,而且检测c/c++代码漏洞的误报率和漏报率较低。
72.以上所述之实施例子只为本发明之较佳实施例,并非以此限制本发明的实施范围,故凡依本发明之形状、原理所作的变化,均应涵盖在本发明的保护范围内。
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1