(19)中华人民共和国国家知识产权局(12)发明专利申请(10)申请公布号(43)申请公布日(21)申请号201910214764.3(22)申请日2019.03.20(71)申请人中山大学地址510275广东省广州市海珠区新港西路135号(72)发明人金舒原 吴跃隆 (74)专利代理机构广州粤高专利商标代理有限公司44102代理人林丽明(51)Int.Cl.H04L29/06(2006.01)G06K9/62(2006.01)(54)发明名称一种基于深度学习的源代码漏洞检测方法(57)摘要本发明提出了一种基于深度学习的源代码漏洞检测方法,基于深度学习,自动完成源代码的特征抽取,并结合代码度量指标和自动抽取的源代码特征,使用随机深林算法构建漏洞检测模型。本发明提供了一种基于深度学习的源代码漏洞检测方法具有更高的自动化程度,减少对领域专家知识的依赖,大大节约代码审计成本,提高代码审计的效率。而相较于其它使用深度学习进行漏洞检测的方法,本方法结合代码的多种表示更大化地将代码的语法和语义信息保留,使深度学习算法自动抽取的特征能更好地刻画代码,同时结合常用的代码度量指标作为检测的特征,进一步提高检测效果。权利要求书1页说明书6页附图3页CN110011986A2019.07.12CN110011986A1.一种基于深度学习的源代码漏洞检测方法,其特征在于,包括以下步骤:S1.计算源代码文件中函数的代码度量指标,并整合成一个代码度量向量Vcm;S2.以源代码中的函数作为基本单元,使用深度学习方法完成函数特征的自动抽取;使用代码静态分析工具可以完成函数抽象语法树AST、控制流图CFG以及程序依赖图PDG的抽取并依次转换成数值向量Vast、Vcfg、Vpdg。S3.将向量Vcm、Vast、Vcfg、Vpdg合并成一个向量Vf作为函数的特征向量,将函数的特征向量Vf和函数的标签输入到随机深林算法中训练得到最终的漏洞检测模型M(Vf);S4.对于待检测的源代码中的函数,通过S1和S2得到四个向量Vcm、Vast、Vcfg、Vpdg,拼接成特征向量Vf作为漏洞检测模型M(Vf)的输入,输出结果为1表示函数存在漏洞,输入结果为0表示函数不存在漏洞。2.根据权利要求1所述的基于深度学习的源代码漏洞检测方法,其特征在于,所述的S2的具体步骤如下:S21.使用双向长短时记忆网络从函数AST中自动抽取特征;S211.对AST进行深度优先的遍历操作,将AST中的标志按顺序保存在一个标志向量中;S212.以所有标志向量中标志的集合作为词库,将标志进行词嵌入并将AST标志向量转化为数值向量,根据所有向量长度的分布选择合适的数值作为固定长度,以此对向量进行裁剪或0填充操作将所有函数的数值向量的长度标准化;S213.根据函数是否存在漏洞,为函数添加标签,将长度标准化的向量和向量对应的标签输入到双向长短时记忆网络中进行训练;使用交叉验证的方法对训练的模型进行测试并使用F1值作为评价指标进行模型评估;调试参数,重复模型的训练、测试过程,当F1值达到最大值时,将全局最大池化层的输出作为从函数AST中抽取的特征向量Vast。S22.将抽取的CFG、PDG用邻接矩阵表示并分别输入到图嵌入模型得到两个固定长度的向量Vcfg、Vpdg,作为从函数CFG和PDG中抽取的特征。3.根据权利要求1所述的基于深度学习的源代码漏洞检测方法,其特征在于,所述的代码度量指标包括统计指标和复杂度指标,其中统计指标中行数统计指标有:总行数、代码行数、空白行数、注释行数、预处理代码行数、非活动行数、注释与代码行数比,语句数统计指标有:总语句数、声明语句数、执行语句数、空语句数;复杂度指标包括循环复杂度、修正循环复杂度、严格循环复杂度、本质复杂度以及最大嵌套层数。4.根据权利要求3所述的基于深度学习的源代码漏洞检测方法,其特征在于,所述的代码行数、空白行数、注释行数以及语句数统计指标只统计活动代码。5.根据权利要求2所述的基于深度学习的源代码漏洞检测方法,其特征在于,在步骤S213中,函数添加的标签如下,标签为0表示函数没有漏洞,1则表示函数存在漏洞。6.根据权利要求2所述的基于深度学习的源代码漏洞检测方法,其特征在于,所述的双向长短时记忆网络的网络结构包括一个输入层、一个BLSTM层、一个全局最大池化层、若干个全连接层和一个输出层。7.根据权利要求6所述的基于深度学习的源代码漏洞检测方法,其特征在于,所述的BLSTM网络中需要调试的参数包括:learningrate,epoch,batchsize,每个隐藏层中的单元数,全连接层的个数,全连接层的单元数,隐藏层和全连接层的激活函数,损失函数,优化器。权 利 要 求 书1/1页2CN110011986A2一种基于深度学习的源代码漏洞检测方法技术领域[0001]本发明涉及网络安全技术领域,更具体地,涉及一种基于深度学习的源代码漏洞检测方法。背景技术[0002]在当今信息化程度极高的环境下,人们生活的方方面面都与各式各样的软件息息相关。在日常生活中,人们通过即时通信软件进行通信,通过购物软件进行网上购物,并且使用支付软件完成支付;而在各种组织中软件也一样扮演重要角色,如学校的财务系统、各种机构中的自助服务系统、企业中的数据库管理系统等。而由于软件设计、实现以及使用中可能存在的错误,大部分软件都不可避免地存在漏洞。软件的漏洞一旦被不法分子利用,不仅直接损害软件使用者的利益也会间接影响到软件开发公司的利益,因此软件开发公司往往会投入极大的成本进行软件的代码审计以减少软件可能存在的漏洞,提高软件的安全性。[0003]在代码审计中通常可以使用漏洞检测工具进行快速的漏洞定位,提高审计效率。软件的漏洞检测方法根据是否需要执行程序可以分为静态分析的方法和动态分析的方法。静态分析的方法主要通过分析程序的语法和语义信息判断程序是否存在漏洞,主要用于分析程序的源代码。现有的较为成熟的静态分析方法存在的主要问题是严重依赖领域专家的知识,需要领域专家花费大量的时间和精力对程序的源代码进行分析,而且漏报率和误报率都比较高;动态分析的方法则通过分析程序执行过程中产生的信息判断程序是否存在漏洞,通常用于分析可执行文件。主流的程序动态分析有污点分析和符号执行,程序的污点分析无法涵盖程序的所有执行路径,同样需要领域专家花费大量的时间和精力分析程序且漏报率高,而符号执行通过将程序输入符号化、程序执行公式化,理论上可以覆盖所有执行路径,但由于求解开销大难以实际应用。发明内容[0004]针对的现有漏洞检测方法漏报率高、严重依赖领域专家知识的问题,本发明提出一种基于深度学习的源代码漏洞检测方法,本发明采用的技术方案是:[0005]一种基于深度学习的源代码漏洞检测方法,包括以下步骤:[0006]S1.计算源代码文件中函数的代码度量指标,并整合成一个代码度量向量Vcm;[0007]S2.以源代码中的函数作为基本单元,使用深度学习方法完成函数特征的自动抽取;抽取源代码中的抽象语法树(AbstractSyntaxTree,AST)、控制流图(Control Flow Graph,CFG)、程序依赖图(ProgramDependencyGraph,PDG);[0008]S3.将向量Vcm、Vast、Vcfg、Vpdg合并成一个向量Vf作为函数的特征向量,将函数的特征向量Vf和函数的标签输入到随机深林算法中训练得到最终的漏洞检测模型M(Vf);[0009]S4.对于待检测的源代码中的函数,通过S1和S2得到四个向量Vcm、Vast、Vcfg、Vpdg,拼接成特征向量Vf作为漏洞检测模型M(Vf)的输入,输出结果为1表示函数存在漏洞,输入结果说 明 书1/6页3CN110011986A3为0表示函数不存在漏洞。[0010]在一种优选方案中,所述的S2的具体步骤如下:[0011]S21.使用双向长短时记忆网络(BidirectionalLong-shortTerm Memory,BLSTM)从函数AST中自动抽取特征;[0012]S211.对AST进行深度优先的遍历操作,将AST中的标志(Token)按顺序保存在一个标志向量中;[0013]S212.以所有标志向量中标志的集合作为词库,将标志进行词嵌入(WordEmbedding)并将AST标志向量转化为数值向量,根据所有向量长度的分布选择合适的数值作为固定长度,以此对向量进行裁剪或0填充操作将所有函数的数值向量的长度标准化;[0014]S213.根据函数是否存在漏洞,为函数添加标签,将长度标准化的向量和向量对应的标签输入到BLSTM网络中进行训练;使用交叉验证的方法对训练的模型进行测试并使用F1值作为评价指标进行模型评估;调试参数,重复模型的训练、测试过程,当F1值达到最大值时,将全局最大池化层的输出作为从函数AST中抽取的特征向量Vast。[0015]S22.将抽取的CFG、PDG用邻接矩阵表示,分别输入到图嵌入模型得到两个固定长度的向量Vcfg、Vpdg,作为从函数CFG和PDG中抽取的特征。[0016]在一种优选方案中,所述的代码度量指标包括统计指标和复杂度指标,其中统计指标中行数统计指标有:总行数、代码行数、空白行数、注释行数、预处理代码行数、非活动行数、注释与代码行数比,语句数统计指标有:总语句数、声明语句数、执行语句数、空语句数;复杂度指标包括循环复杂度、修正循环复杂度、严格循环复杂度、本质复杂度以及最大嵌套层数。[0017]在一种优选方案中,所述的代码行数、空白行数、注释行数以及语句数统计指标只统计活动代码,即不在预处理的代码块之中的代码。[0018]在一种优选方案中,在步骤S213中,函数添加的标签如下,标签为0表示函数没有漏洞,1则表示函数存在漏洞。[0019]在一种优选方案中,所述的BLSTM网络的网络结构包括一个输入层、一个BLSTM层、一个全局最大池化层、数个全连接层和一个输出层。[0020]在一种优选方案中,所述的BLSTM网络中需要调试的参数包括:learningrate,epoch,batchsize,每个隐藏层中的单元数,全连接层的个数,全连接层的单元数,隐藏层和全连接层的激活函数,损失函数,优化器(Optimizer)。[0021]与现有技术相比,本发明技术方案的有益效果是:[0022]本发明提供了一种基于深度学习的源代码漏洞检测方法具有更高的自动化程度,减少对领域专家知识的依赖,大大节约代码审计成本,提高代码审计的效率。而相较于其它使用深度学习进行漏洞检测的方法,本方法结合代码的多种表示更大化地将代码的语法和语义信息保留,使深度学习算法自动抽取的特征能更好地刻画代码,同时结合常用的代码度量指标作为检测的特征,进一步提高检测效果。附图说明[0023]图1为本发明提供的基于深度学习的源代码漏洞检测方法的总体框架图;说 明 书2/6页4CN110011986A4[0024]图2为实施例2提供的基于深度学习的源代码漏洞检测方法的示例函数;[0025]图3为实施例2中的程序化程序的基本机构;[0026]图4为实施例2中的示例函数递归化简基本结构的过程;[0027]图5为实施例2中函数的AST、PDG、CFG的抽取;[0028]图6为实施例2中BLSTM的网络结构。具体实施方式[0029]下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,仅用于示例性说明,不能理解为对本专利的限制。基于本发明中的实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。[0030]下面结合附图和实施例对本发明的技术方案做进一步的说明。[0031]实施例1[0032]请参考图1,一种基于深度学习的源代码漏洞检测方法,包括以下步骤:[0033]S1.计算源代码文件中函数的代码度量指标,并整合成一个代码度量向量Vcm;[0034]S2.以源代码中的函数作为基本单元,使用深度学习方法完成函数特征的自动抽取;抽取源代码中的抽象语法树