借鉴计算机视觉领域中的目标检测过程,将深度学习用于漏洞检测领域,主要存在以下三方面挑战:一是目标检测能够很自然地利用图像中的纹理、边缘和颜色等信息定义候选区域,漏洞检测则没有明显的细粒度代码结构来描述漏洞的候选区域;二是目标检测拥有海量的人工标注类别的图像数据集,但目前没有标注好的涵盖各种类型漏洞的大规模数据集,且人工标注漏洞的难度远比标注图像大得多;三是目标检测采用适合图像处理的卷积神经网络(CNN)模型来学习特征,然而程序源代码与图像不同,更关注语句上下文信息,且漏洞源代码数据具有自身的特点。 为了解决上述问题,本文开展了基于深度学习的漏洞检测研究。 该方法具有很大潜力,因为深度学习不需要人类专家定义特征,但同时也具有挑战,因为深度学习不是为漏洞检测这种应用而产生的。
基于逻辑推理的漏洞检测方法将源代码进行形式化描述,然后利用数学推理、证明等方法验证形式化描述的一些性质,从而判断程序是否含有某种类型的漏洞。 基于逻辑推理的漏洞检测方法由于以数学推理为基础,因此分析严格,结果可靠。 但对于较大规模的程序,将代码进行形式化表示本身是一件非常困难的事情。 基于中间表示的漏洞检测方法没有上述局限性,适用于分析较大规模程序,因此得到了更为广泛的应用。 本文针对基于中间表示的源代码漏洞检测方法开展研究。 依据对中间表示的分析技术,漏洞检测方法可以分为4类:基于代码相似性的漏洞检测、基于符号执行的漏洞检测、基于规则的漏洞检测以及基于机器学习的漏洞检测。
应用于漏洞检测的机器学习技术目前主要涉及前两种,下面按照是否需要人类专家定义特征分为基于传统机器学习方法和基于深度学习方法两类,并分别对其进行介绍。 传统的机器学习方法通过人工定义特征属性,然后采用机器学习方法,如支持向量机、k近邻等进行分类。 基于传统机器学习的漏洞检测方法包括两类:针对特定漏洞类型的方法和漏洞类型无关的方法。 针对特定漏洞类型的方法前提是借助专家知识(如漏洞原理)将漏洞分为不同类型,而某种类型的漏洞,通过机器学习技术学习漏洞模式。