Page 100 - 《软件学报》2020年第11期
P. 100
3416 Journal of Software 软件学报 Vol.31, No.11, November 2020
不依赖 Joern 对图结构的解析,因此本文直接使用它们在源文件上进行实验.此外,本文对第 2.2 节中所述的敏感
语句切片裁剪掉的节点数量进行了统计.对于 SARD 缓冲区错误数据集,切片后比切片前的控制流图节点数量
平局减少 11.0 个;对于 SARD 资源管理错误数据集,切片后比切片前的控制流图节点数量平局减少 6.30 个.
Table 1 Amount of data in the dataset
表 1 数据集中的数据量
数据集 源文件数量 坏函数数量 好函数数量
SARD缓冲区错误 7 273 7 232 10 612
SARD资源管理错误 4 124 4 033 8 349
为对神经网络进行训练并评价预测效果,本文以 6:2:2 的比例分别将 SARD 缓冲区错误数据集和 SARD 资
源管理错误数据集划分为训练集、验证集和测试集,使用训练集对神经网络模型进行训练,并使用测试集对训
练完毕的模型的预测效果进行测试.表 2 为 Flawfinder、RATS 和本方法在 SARD 缓冲区错误数据集和 SARD
资源管理错误数据集的测试集上的对比实验结果.从对比实验数据中可见,本方法在 SARD 缓冲区错误数据集
和 SARD 资源管理错误数据集上的表现明显优于 Flawfinder 和 RATS,其在两个数据集上的 F1 分数分别达到
了 82.8%和 77.4%,并且漏报率明显低于另外两个对比工具.
Table 2 Result of comparative experiment with Flawfinder and RATS
表 2 与 Flawfinder 和 RATS 进行对比实验的结果
数据集 工具或方法 误报率(%) 漏报率(%) 查全率(%) 查准率(%) F1分数(%)
Flawfinder 56.6 44.8 55.2 39.9 46.3
SARD缓冲区错误 RATS 68.7 31.3 68.7 40.5 51.0
本方法 14.3 14.6 85.4 80.4 82.8
Flawfinder 40.7 58.4 41.6 34.1 37.4
SARD资源管理错误 RATS 33.9 63.8 36.2 35.0 35.6
本方法 14.1 18.5 81.5 73.7 77.4
本文基于实验数据进行了分析,Flawfinder 和 RATS 通过专家定义代码漏洞模式,并通过词法分析在目标程
序代码中对漏洞代码模式进行匹配从而挖掘漏洞,但预定义的模式较为单一,其难以覆盖复杂多变的真实环境,
导致挖掘的准确率降低.例如,memcpy 是 C/C++中一个较为常见的敏感库函数,其实现从源内存地址的起始位
置开始拷贝若干个字节到目标内存地址中,该函数具有 3 个参数,分别为目标地址、源地址和拷贝数据长度.在
Flawfinder 中,对 memcpy 调用是否构成漏洞的逻辑判断较为简单,当 memcpy 的参数少于 3 个、目标地址中多
次使用&运算符取地址或者拷贝数据长度未使用 sizeof 获取时,Flawfinder 将判定该 memcpy 调用构成漏洞.可
以发现,Flawfinder 仅通过正则表达式对库函数的参数进行检查,未考察程序中的数据依赖或控制依赖等语义
信息,如果拷贝数据长度虽未使用 sizeof 获取,但在上下文进行了无害检查,那么其将不构成漏洞.上述原因直接
导致了 Flawfinder 和 RATS 等基于规则的源代码漏洞挖掘工具的准确率降低.
反观本方法,在利用代码属性图考察程序语义信息的同时,构建了更为有效的神经网络模型,利用双向
LSTM 捕获代码中向前和向后的依赖,并引入注意力机制解决漏洞和非漏洞代码类间差异小的问题.基于上述
原因,本方法成功地提高了源代码漏洞挖掘的准确率,证明了其有效性.
其次,本文选取 TBCNN 作为基于学习的程序分析方法基线,与本方法一起作为实验对象进行对比实验.
TBCNN是一种基于深度学习的程序分析模型,其将程序源代码建模为抽象语法树,然后根据抽象语法树的结构
和节点类型进行基于树的卷积和池化操作,从而进行特征抽象,实现对程序进行分类.
由于 TBCNN 中用于解析源代码构造抽象语法树的工具 PyCParser 仅支持 C 语言源程序,因此对于 TBCNN
的实验在由 SARD 缓冲区错误数据集和 SARD 资源管理错误数据集中 C 语言源程序构成的子集上进行.其子
集的源文件数量以及编码后的坏函数和好函数数量见表 3.由于静态分析工具 Joern 无法对其中一些源文件进
行正确解析,导致编码后的函数数量略微少于数据集中的源文件数量.