论文部分内容阅读
近年来,随着互联网时代的不断发展和软件技术的不断提高,软件在人类的生活中发挥着越来越重要的作用,软件规模越来越大。同时,由于软件规模的不断扩大,开发人员的疏忽,导致软件的质量参差不齐,软件中存在的漏洞也越来越多,严重影响了软件的使用体验以及软件的安全性,对人类的生命财产安全产生了极大的威胁,越早检测出软件中存在的漏洞,损失就会越小,所以软件维护人员及时检测出软件中的漏洞就显得尤为重要。采用人工的方式检测代码中的漏洞复杂度比较高,同时也费时费力,所以要利用漏洞检测软件进行自动化的批量检测。目前的代码漏洞检测方法,误报率和漏报率比较高,而且检测粒度比较粗,一般是文件级别的漏洞检测,所以本文的工作主要有两个部分:第一个主要部分是从代码中提取出特征,然后将特征进行表示学习,转化成向量,第二个主要部分是将特征向量输入到代码漏洞检测模型当中,通过代码漏洞检测模型输出代码有无漏洞的概率。关键和难点是要在代码中提取出有用的特征,能表现出代码漏洞的特征,然后将特征转化成能输入到代码漏洞检测模型当中的向量。这个向量化的方式也很重要,要可以根据代码语句的上下文信息学习到代码token之间的语义信息,另外针对不同的漏洞类型,还要采取不同的深度学习网络以获得相对较好的漏洞检测效果。本文的主要工作如下:首先对不同的漏洞数据集进行分析研究,选取质量较高的漏洞数据集。然后对漏洞数据集进行预处理,预处理首先生成源文件的抽象语法树和程序依赖图,然后根据抽象语法树中的节点和程序依赖图中的数据依赖和控制依赖关系进行程序切片,将切片转换成向量进行漏洞检测。本文对四种类型的漏洞进行检测,四种类型分别为指针使用相关的漏洞,数组使用相关的漏洞,算术表达式使用相关的漏洞,函数调用相关的漏洞,每一种漏洞的数据集单独进行实验。根据相应的关键点提取出对应类型的程序切片可以过滤掉一些无关语句,减少噪音,使预测结果更加准确。其次,为了将提取出来的特征输入到漏洞检测模型当中,需要将其转换成向量,即向量化。首先利用word2vec得到词向量,然后在词向量的基础上进一步得到句子向量,最后,用这些漏洞代码的向量表示训练深度学习模型进行漏洞检测。在基于深度学习的漏洞检测模型上,本文除了使用常用的Bi LSTM模型外,还使用了Text CNN以及Desnse CNN两种深度学习模型,并对这些模型的检测结果进行实验,此外还在模型中加入了注意力机制,进一步提高了模型对漏洞检测的准确率。