VDSimilar
:基于漏洞和补丁代码相似性的漏洞检测
1.论文思维导图
2.摘要
利用机器学习进行漏洞检测是提高软件安全性的一个热门话题。然而,现有的工作将检测公定义为一个分类问题,这需要大量的标记数据,同时捕获语义和句法相似性。在这篇文章中,我们认为脆弱性观点中的相似性是检测脆弱性的关键。我们准备一个由漏洞和相关补丁组成的相对较小的数据集,并试图从(I)一对漏洞之间的相似性和(ii)一对漏洞和补丁之间的差异来实现安全相似性。为了实现这一点,我们建立了检测模型,利用
Siamese
网络配合BiLSTM
和注意力网络来处理源代码,提高检测的准确率。在OpenSSL
和Linux
的876个漏洞和补丁的数据集上,所提出的模型(VDSimilar
)实现了OpenSSL
的AUC
值的大约97.17%(其中注意力网络比Siamese
中的BiLSTM
贡献了1.21%),这比基于深度学习的最先进的方法更优秀
3.主要贡献
首先,包含 147 个
OpenSSL
的实际易受攻击函数和相关修补函数的数据集和Linux CVEs
,它有助于描述漏洞片段。该数据集可以在Github
上找到.(https://github.com/sunhao123456789/siamese_dataset)第二,结合
BiLSTM
和注意力网络的连体网络检测模型。该模型通过获取漏洞函数和补丁函数对,计算两个函数之间的相似度,从而检测漏洞。我们计划在这篇论文发表后发布源代码第三,在数据集上进行系统实现和评估,证明了所提模型的有效性
4.背景和相关知识
4.1 基于代码相似性的检测
- 传统方法:将程序抽象成高级表示,然后使用比较算法来寻找匹配的代码;缺点是代码的抽象会导致语义和漏洞特征的丢失,难以高精度检测漏洞
- 基于机器学习的方法:多数是基于语义和语义来寻找漏洞,但是漏洞片段只占整个易受攻击函数的一小部分,不能真正从漏洞片段本身来检测代码相似性,且基于深度学习的方法依赖大量数据集进行训练,在数据量有限的情况下无法准确检测漏洞
4.2 连体网络(Siamese Network
)
连体网络又叫孪生网络,是一种监督学习,用于度量学习。其基本结构是一个对称网络,两个对称的部分共享相同的权重,并且两部分具有相同的结构,最后使用一些功能函数将两个部分连接起来,如下图所示:
该模型有两个输入,通过两个神经网络映射到新的空间,形成输入在新的空间中的表示,最后通过损失函数的计算,来比较两个输入的相似度
5.本文方法以及实现过程
5.1 基本框架
1、数据集:对于每个CVE
,本文搜集了不同程序版本中受漏洞影响的易受攻击函数以及已经修复了漏洞的程序版本的修补函数作为一个数据集来提供脆弱性特征
2、训练检测器的度量学习模型:本文采用的是连体网络来判断代码的相似性,并将注意力网络整合到了连体网络中。对于每个CVE
,我们分为了相似对和差异对,相似对是由两个脆弱函数组成,标记为1,差异对是由一个脆弱函数和一个修补函数组成,标记为0。学习模型从相似对和差异对来计算相似性,然后在测试时,检测模型将计算测试函数和已知易受攻击函数之间的相似性来判断是否为漏洞函数。
5.2 实现细节
5.2.1 数据准备
- 漏洞和程序的集合:使用网络抓取框架
Scrapy
来获取CVE-detail
网站,并从每个CVE
描述页面中提取这些信息,同时下载相关软件的集合,然后就可以从最新受影响的易受攻击版本之后发布的所有版本中获取修补版本,最后,为每个CVE
创建一个元组,即(CVE
,软件,受影响的版本,打补丁的版本,文件名,函数名) - 提取漏洞和修补函数:对于一个
CVE
,给定上面的详细信息,通过使用LLVM
解析源代码,很容易提取一组漏洞函数和修补函数,但是为了剔除一些重复函数以及不准确的函数,我们计算从所有程序版本中获取的函数的哈希值,然后对具有相同散列值得函数进行重复性删除,然后如果一些未在受影响版本中列出的良性函数的散列值与同一CVE
的易受攻击函数的散列值相同,则它将被标记为易受攻击的。 - 为每个
CVE
准备两种性的对:相似对和差异对,这样的配对可以扩大数据量,增加模型训练的准确性
5.2.2 检测模型
采用了连体结构的检测模型,在该结构中,两个子网由嵌入层、BiLSTM
层以及注意力层组成,如下图所示:
-
嵌入层:首先将序列 X 变换成 m*s 矩阵 E,其中 s 是指单词的嵌入大小,每行表示单词的初始嵌入
-
BiLSTM
层:注意到在一个函数中,一行内或跨代码行单词之间存在相关性。因此,函数代码的表征应该考虑与词相关的词,包括前后词。受此启发,采用了BiLSTM
,BiLSTM
层将矩阵E作为输入,并产生关联的文字注释H = (h1,h2,·····,h2m)
,其中 hi 表示隐藏状态 -
注意力层:真正应该注意的漏洞片段只占整个函数的很小一部分,我们从
BiLSTM
层获得单词注释 H。然后初始化三个矩阵WQ
,WK
,WV
,以将H转换为Q,K,v
。然后我们得到输入 R 的最终表示形式:
当单词嵌入矩阵通过双向LSTM
层时,它可以很好地表示其局部特征,而注意力层从全局角度将注意力分配给局部特征,从而使我们的模型能够专注于其特征子集
-
连体模型:它以相似度对(标签y为1)和差异对(y为0)作为输入,训练的目标是最大化脆弱函数之间的相似度,同时最小化嵌入空间中脆弱函数和修补函数之间的相似度。
首先:让S(X1,X2)表示一对 {X1,X2,y} 的相似性,其计算公式如下:
其中 D 是 X1 和 X2 的欧几里得距离,由以下公式得出:
然后,该模型的损耗 L ,由以下公式计算:
且对于一个CVE
X=Xi(i = 1,2,3,·······,N),总的损耗由下公式得出:
5.2.3 漏洞检测
一旦在一组相似对和不同对上训练了检测模型,就可以使用它来计算测试函数和已知易受攻击函数之间的相似性。如果相似性高于预定义的阈值,则测试功能将被怀疑为潜在易受攻击的,并被报告以供进一步调查。下列算法描述了两个函数的比较方法:
在第1到5行,我们首先初始化整个语料库W的嵌入矩阵和函数 E1 ,E2 的嵌入矩阵。然后,根据可以作为W的索引的输入X1和X2,确定矩阵E1和E2。在第6行,BiLTSM
模型将嵌入矩阵E1和E2作为输入,并产生与正面和背面相关的语义信息。从第7行到第11行,查询矩阵Q、关键字矩阵K和值矩阵V是从矩阵h的线性映射转换而来的,然后通过缩放点积注意力计算函数 R 的最终表示,最后,使用余弦相似度计算R1和R2之间的距离,并将该值预测为输出
6.优势和不足
本方法所需要的数据集较小,主要是通过在小的数据集中以配对的方式扩大数据集的数量,且该数据集是从现实世界程序中收集的
不足体现在以下几点:
1、很多CVE
由于对数不足(本文方法中只考虑了超过5个易受攻击函数和5个修补函数的CVE
),无法用于训练模型
2、代码中仍然存在一些与安全无关的信息
3、对于模型最终的产生的效果,无法解释,即无法解释为什么能达到这样的效果,缺乏模型的可解释性