学习可迁移表达进行跨软件项目的漏洞函数检测

如今,机器学习技术也被广泛的应用到了软件安全漏洞检测领域。但是,有监督的机器学习技术在软件漏洞检测的应用上效果大打折扣。究其原因,是因为在软件开发阶段的早期,由于没有足够的漏洞数据样本用于训练模型,所训练出来的模型性能不稳定而导致的。在这种情况下,研究者们不得不依赖于手工提取特征的方法,希望提取尽可能有效的特征来弥补训练数据不足造成的对分类器性能的不良影响。 在机器学习领域,这种由于训练数据的不足导致所训练的分类器不稳定的问题被称为 “冷启动”问题。我们的工作就是针对这个问题设计。

(图1. Bi-LSTM 框架)

我们通过设计一套bidirection LSTM网络(简称Bi-LSTM,框架如图.1所示),让其能够自动的学习抽象表达。这种由深度学习算法提取的抽象表达,不同于人工提取的特征,往往能够捕捉到隐含的,内在的模式。我们通过处理源代码数据使其成为合乎深度学习算法的输入形式。首先,我们提取源代码的抽象语义树,并通过深度优先遍历算法将树型数据转化为文本向量同时保证树的结构信息得意部分保留。接着,我们采用了Word2Vec算法,将文本向量转化为数值向量并保持原有的语义信息。通过以上步骤,我们可以将原代码转化为数值向量。接着我们通过使用相关的软件项目中的一些历史数据作为源,用来训练Bi-LSTM,以解决训练数据不足的问题。通过源项目中的历史数据的训练来初始化Bi-LSTM的参数,让网络学习到历史数据中漏洞的模式 (如图.2 所示)。

(图.2 Bi-LSTM Pre-training)

在目标软件项目上,由于漏洞数据非常有限,所以可以将这些漏洞数据作为网络的输入,并将网络的倒数第二层的输出作为提取的高级的,抽象的特征 (如图.3 所示)。

(图3. 可迁移表达学习)

最后将有限的漏洞数据及其网络提取的特征再训练分类器(比如训练一个随机森林分类器)用来检测没有标记数据上的漏洞(图.4 所示)。

(图4. 进一步分类得出结果)

实验证明,我们所提出的网络结构能够很好的学习源项目中漏洞数据的模式,从而使得网络自动提取的抽象特征和人工提取的特征相比,有更好的泛化能力。即使使用有限的标记数据,这些特征也可以帮助训练出更为稳定的分类器用于检测漏洞。

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180905G0YXVT00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券