论文部分内容阅读
软件日益扩大的规模和日益增长的复杂性对软件安全漏洞的研究提出了严峻的挑战,如何实现自动化的漏洞检测是当前急需解决的课题之一。随着深度学习技术的发展,基于规则的方法和基于传统机器学习的方法,依赖人工定义漏洞规则和漏洞特征的不足可以被基于深度学习的漏洞检测方法弥补,并实现自动化检测。然而,现有的基于深度学习的研究方法主要基于漏洞库的数据集进行建模,虽然在漏洞库数据集上检测效果很好,但是将其模型用于检测实际开发人员所编写的代码时,模型检测的准确率大幅度降低。经过实验分析,一方面是因为漏洞库数据集规模小、漏洞覆盖率低,而实际应用中开发人员编写的代码却更为复杂多样;另一方面是因为现有的方法忽略了程序的控制依赖信息与层次结构信息,损失了程序语义和漏洞特征之间的联系。本文主要针对这两方面问题对现有工作进行改进,提出一种基于深度学习技术的解决方案,本文的研究内容可以总结为以下几点:(1)针对源代码漏洞检测中数据集规模小,覆盖率低和代码语义信息缺失的问题,提出了一种利用双向长短时记忆网络(Bidirectional Long Short-Term Memory,Bi LSTM)对源代码进行漏洞检测的模型。一方面,本文基于大型开源仓库中实际开发人员所编写的代码进行建模。另一方面,为了更好的挖掘程序语义和漏洞特征之间的联系,提出一种利用数据依赖信息和控制依赖信息的切片方法处理源码,同时采用一种基于抽象语法树(Abstract Syntax Tree,AST)路径和注意力机制的源码向量化表示方法,从源码的AST路径中学习上下文表示,并利用Bi LSTM自动地学习源码的漏洞特征。(2)设计并实现了一个基于大型开源仓库的源代码漏洞检测原型系统Vul Finder。在本文中将具体介绍系统的功能和模块,给出每个组件的设计过程和关键算法,并展示漏洞检测过程。(3)设计并实现了一组综合实验,从多个维度对本文所提出的模型和系统进行验证和评估。实验结果表明,无论在开源仓库中收集的数据集上还是在漏洞库的数据集上,本文提出的方法都较相关工作有着更高的F1-score值,并具有自动化学习漏洞特征和细粒度漏洞检测的特点。