Page 99 - 《软件学报》2020年第11期
P. 99
段旭 等:基于代码属性图及注意力双向 LSTM 的漏洞挖掘方法 3415
数量,则误报率(FPR)、漏报率(FNR)、查全率(TPR)、查准率(P)和 F1 分数(F1)的计算方法如下:
FP
FPR = (9)
FP TN+
FN
FNR = (10)
TP + FN
TP
TPR = (11)
TP + FN
TP
P = (12)
TP + FP
××
2 PTPR
F 1 = (13)
+
PTPR
从公式(9)可见,误报率表示所有不存在漏洞的样本中被错误判定为存在漏洞的样本的比例,误报率越低,则
模型检测效果越理想.从公式(10)可见,漏报率表示所有存在漏洞的样本中被错误判定为不存在漏洞的样本的
比例,漏报率越低,则模型检测效果越理想.从公式(11)可见,查全率表示所有存在漏洞的样本中被正确判定为存
在漏洞的样本的比例,查全率越高,则模型检测效果越理想.从公式(12)可见,查准率表示所有被判定为存在漏洞
的样本中,确实存在漏洞的样本的比例.从公式(13)可见,F1 分数表示查全率和查准率的调和平均值,其综合考虑
了查全率和查准率,F1 分数越高,则模型检测效果越理想.
(3) 数据准备
软件保障参考数据集(software assurance reference dataset,简称 SARD)是由美国国家标准与技术研究院维
护的漏洞数据集,该数据集中包含了不同代码形式(源代码或二进制代码)、不同语言(C、Java、Python 等)、不
同漏洞类型(缓冲区错误、资源管理错误、注入等)的漏洞数据,每条数据以源文件或二进制文件的形式进行存
储,供研究人员和软件安全保障工具开发人员对测试工具进行评估.在 SARD 的每个源文件中包含一个坏函数
(bad function)和多个好函数(good function):坏函数中存在特定的漏洞;而好函数以不同方式修复了坏函数中存
在的漏洞,其可以视作打完补丁的代码.由于好函数与坏函数的代码差异较少,因此该数据集可以很好地评估模
型对类间差异小问题的适应能力以及对漏洞特征不明显的漏洞的检测能力.
由于本方法的目的是挖掘代码中是否存在漏洞,但同样具有漏洞的代码会根据漏洞类型的不同具有较大
的差异,导致神经网络预测准确率下降,因此,本文选择在 SARD 中收集特定类型的漏洞数据.使用该特定类型漏
洞数据独立地对神经网络进行训练,并实现对该类型的漏洞进行挖掘.对于不同类型的漏洞,则需使用相应类型
的漏洞数据训练不同的神经网络,从而实现对不同类型漏洞的挖掘.具体地,本文在 SARD 中收集 C/C++语言
的、源代码形式的缓冲区错误(buffer error)和资源管理错误(resource management error)类型的漏洞数据进行实
验.这两类漏洞是 C\C++中较为常见的两类漏洞,并且在 SARD 中对于这两类漏洞有足够的数据以支持模型训
练.本方法以函数为单位进行漏洞检测,因此对上述数据集中的源代码文件提取出源文件中的好函数和坏函数,
将好函数作为负样本标注为“0”,代表该函数不存在漏洞;将坏函数作为正样本标注为“1”,代表该函数存在漏洞.
以函数为单位构建“SARD 缓冲区错误数据集”和“SARD 资源管理错误数据集”.
3.2 实验结果与分析
首先,本文选取 Flawfinder 和 RATS 作为基于规则的静态漏洞挖掘方法基线,与本方法一起作为实验对象进
行对比实验.Flawfinder 和 RATS 是两个基于规则的源代码漏洞挖掘工具,它们维护一个内建的 C/C++常见漏洞
数据库,该数据库中记录漏洞代码模式,Flawfinder 和 RATS 通过词法分析在目标程序中对漏洞代码模式进行匹
配,从而挖掘目标程序中的漏洞.Flawfinder 和 RATS 既可以对 C 语言源程序进行检测,也可以对 C++语言源程
序进行检测,因此对于它们的实验,在完整的 SARD 缓冲区错误数据集和 SARD 资源管理错误数据集上进行.其
中,SARD 缓冲区错误数据集和 SARD 资源管理错误数据集的源文件数量以及编码后的坏函数和好函数数量见
表 1.由于静态分析工具 Joern 无法对其中一些源文件进行正确解析,导致编码后的函数数量略微少于数据集中
的源文件数量.需要注意的是,由于 Flawfinder 和 RATS 能够直接通过对程序源代码进行扫描从而检测漏洞,其