这篇文章通过结合漏洞源代码和汇编代码的特征实现了一个漏洞检测系统。实现步骤如下:(1)从源代码和汇编代码中提取代码切片;(2)通过提出的代码对齐算法对这些片断进行对齐;(3)对齐的代码切片被转换为矢量,并输入到基于超融合的深度学习模型中。
1 提出问题
一些使用单一代码表征的方法,仅从源代码中提取漏洞相关特征,在检测一些漏洞时表现不稳定,导致漏报(如数组越界访问)。
2 解决方案
2.1 提出方法
融合了汇编代码和源代码的信息来预测结果。使用多模态混合融合策略来进行网络搭建。首先通过早期融合将汇编代码片和源代码片段结合起来。然后,这些混合片断,连同源代码片断和汇编代码片断被送入三个单独的网络中。最后,这三个网络的结果被用来通过后期融合给出最终决定。
2.2 主要贡献
文章的主要贡献如下:
- 通过融合汇编代码和源代码漏洞的特征来提高漏洞检测性能。
- 提出一种在源代码和汇编代码之间快速对齐数据片的数据对齐算法。
- 收集了一个由源代码和汇编代码组成的漏洞数据集,该数据集可用于训练和验证所提出的基于多模态融合的漏洞检测方法。
3 系统设计
3.1 系统概述
基本定义:
定义1(源代码切片)。源代码切片Si是一个语义相关的多行源代码的片段,表示为Si=(si1, si2, si3,…, sin),其中sij(1 ≤ j ≤ n)是Si中的第j行。
定义2(汇编代码切片)。汇编代码切片Di是一个语义相关的多行汇编代码片段,表示为Di=(di1, di2, di3,…, din),其中dij(1 ≤ j ≤ n)是Di中的第j行。
该系统分为训练和测试两个阶段。训练阶段分为以下5个步骤:
- 源代码处理。根据漏洞候选特征提取源代码切片,添加标签。
- 程序编译。通过GCC编译器编译源代码得到对应的汇编代码。
- 汇编代码处理。利用代码切片对齐算法提取源代码切片对应的汇编代码切片,并添加标签。
- 向量表示。将源代码切片、汇编代码切片和混合代码切片转化为向量。
- 模型训练。使用上述生成的数据训练网络模型。
测试阶段前4个步骤与训练阶段一致,第5步输出漏洞检测结果(即”0“或”1“)。
3.2 网络模型
后期融合模型:这三个网络的决定可能是不同的。因此在系统的最后,这些决定要通过一个投票层来获得最终结果。在这一层中采用了多数投票。众所周知,晚期融合模型通常比单一模型得到的结果更好,它可能避免单个模型中的错误决定。
3.3 代码对齐算法
整个算法可以归纳为三个阶段:(1)生成伪代码;(2)收集匹配的汇编代码的候选集;(3)寻找最佳匹配。
- 使用IDA Pro从汇编代码中生成伪代码pe_code(即算法中的第3行),其中pe_code中的每个语句Pi对应于汇编代码中的几行语句diu, . . . ,diw。
- 搜索与sik相匹配的候选汇编代码语句集(即算法的第4-9行)。对于每个Pi,如果它的语句类型(如循环语句和赋值语句)与sik相同,那么对应的汇编代码片段diu, . . . , diw被认为是sij的候选匹配。
- 使用匈牙利算法从候选集D′i中获得一个片断(di1, . . . ,dij)。它被认为是Si的潜在匹配对象,并被合并到Di中。使用字符串和整数常量,函数和库调用,以及函数声明信息来计算Di和Si之间的相似性。如果这个相似度大于一个阈值,就认为Di是Si对应的汇编代码片段。否则,重复这一阶段,直到找到一个满意的匹配(即算法中的第11-16行)。
4 实验
4.1 数据集
实验采用软件保障参考数据集(SARD)。这些代码在Windows X64上用GCC进行编译,得到相应的汇编代码。随机选择80%的源代码和对应的汇编代码作为训练数据集,其余20%用于测试。
4.2 结果分析
与VulDeePecker(在源代码层面检测漏洞)和BVDetector(在汇编代码层面检测漏洞)中提出的方法进行比较。图7中展示了这些系统的训练精度和训练损失曲线,可以看出,所有被比较的系统都能快速收敛。二者平均准确率接近90%,而本系统的准确率可以达到97%。
表3列出了不同方案的标记代码片的数量。可以看出,有些漏洞可以被基于源代码的模型检测到,但不能被基于汇编代码的模型检测到。相反,有些漏洞只能被基于汇编代码的模型检测到。
以图8所示的代码片段为例,它是一个与数组越界访问有关的漏洞。基于源代码切片的系统可能会错误地将该漏洞检测为正常的指针运算,因为在计算中很难检测到越界数组访问。相比之下,使用汇编代码片的系统可以很容易地通过内存地址检测到这个漏洞。
表4和表5显示了测试集的比较结果,与其他系统相比,系统在各方面都取得了更好的结果。与VulDeePecke和BVDetector相比,基于特征融合的系统可以将F1得分提高10,同时系统的F1值也远远高于Flawfinder获得的分数。
5 个人总结
5.1 个人总结
文章提出了一个通过深度学习来检测软件中漏洞的系统,它结合了源代码和汇编代码的漏洞特征来提高漏洞检测的能力。该系统从程序的源代码和汇编代码中提取代码切片,并采用基于字符串、整数常量、函数和库调用等的代码对齐算法来对齐这些代码片,实现了一个原型并进行了系统的实验。
5.2 方法局限性
- 仅适用于C/C++程序,无法应用于其它编程语言。
- 将源代码和汇编代码漏洞特征融合并用于漏洞检测,缺乏一定的可解释性。
- 文中提出的代码对齐算法可能存在一定的误差,例如某行源程序可能对应的并不是通过该算法计算得到的那几行汇编代码。
6 原文链接
论文题目:A Vulnerability Detection System Based on Fusion of Assembly Code and Source Code
论文出处:Security and Communication Networks
原文链接:A Vulnerability Detection System Based on Fusion of Assembly Code and Source Code (hindawi.com)
项目地址:https://github.com/onstar99/VulnerabilitySystem