本论文相关内容
- 论文下载地址——Web Of Science
- 论文中文翻译——Vulnerability Dataset Construction Methods Applied To Vulnerability Detection A Survey
- 论文阅读笔记——Vulnerability Dataset Construction Methods Applied To Vulnerability Detection A Survey
文章目录
前言
本篇文章也是一篇综述性文章,主要论述了当前用于基于深度学习的漏洞检测的漏洞数据集的一些发展现状以及研究方向,不错的文章,值得一读。下面就是本篇论文的精读笔记!
应用于漏洞检测的漏洞数据集构建方法
摘要
本文首先指出,目前基于AI的漏洞检测系统侧重于设计各种AI模型以提高漏洞检测的准确性,而忽略了设计高效的AI漏洞检测模型最基本的问题:
- 缺乏足够的高质量漏洞数据
- 没有统一的标准化构建方法来满足不同漏洞检测模型的标准化评估
针对以上问题,本文主要研究如何利用数据挖掘和数据处理技术生成漏洞数据集,以促进漏洞发现,并对此领域的研究挑战和潜在研究方向提出了一些看法。
I. 引言
作者首先指出了一些关于漏洞危害老生常谈的问题,同时表明如今的机器学习技术为源代码漏洞检测提供了一个新的研究方向,基于机器学习漏洞检测技术的性能依赖于AI模型训练的优劣,而AI模型的训练又依赖于高质量的漏洞数据集,但是目前的数据集通常不能满足全部的需求。针对这一问题,本文做出如下贡献:
- 分析漏洞数据集构建的困难,并总结解决方案
- 总结过去十年在这一领域的所有最新研究,并分析流行漏洞数据集的优缺点
- 讨论需要在现有数据集中解决的一些问题,并描述对这些问题的潜在看法
II. 问题及解决方案
目前所使用的漏洞数据集几乎全部从以下数据库或方法中获得:
- 美国国家漏洞数据库NVD
- 丹麦漏洞数据库Secunia、SecurityFocus
- 中国国家信息安全漏洞共享平台CNVD
- 中国国家安全漏洞数据库CNNVD和NSFocus
- 手动注入漏洞
- 代码重写构建
尽管这些数据集以各种方式保存了基本信息、特征和安全漏洞解决方案等属性,但在构建数据集方面仍存在许多挑战。
A. 数据源可靠性问题
因为不同数据库对于漏洞的描述和规范不同,所以对于同一个漏洞,会导致多源漏洞数据集中的数据冗余或错误。相关统计结果如图1所示,可以发现NVD与其他漏洞数据库之间的匹配率不超过40%。
不仅对同一漏洞的描述不同,而且对于受同一漏洞影响的软件版本通常也不同,统计结果如表1所示,可以看到,NVD和SecurityFocus中受CVE-2018-20242漏洞影响的软件版本不同。
所以,导致数据源不可靠问题的原因通常包括:
- 同一漏洞描述规范和信息不对称
- 同一漏洞影响的软件版本范围不一致
- 同一漏洞的不同漏洞风险级别
那么究竟哪个漏洞数据库的漏洞更可靠、更适合训练模型,就需要手动检查,但这样不仅带来了巨大的人工消耗,而且还带有一定的主观性。所以为不同数据源中的同一漏洞制定统一的描述和检索规范非常重要。
B. 缺少多源数据
为了更好满足训练模型的需求,我们需要使用多个数据源的数据,但是通常这并不能实现,原因如下:
- 生成的数据集将不可避免地引入空值
- 数据源中缺少部分易受攻击的数据
- 不同数据源之间存在数据维度差异
为了解决漏洞数据集的不完整性问题,Rostami等人提出一种有监督的机器学习方法,以填充大多数漏洞样本中缺失的网络攻击行为分类值(ATT&CK)。但是此方法仍有一定的局限性:
- 无法学习数据集中未包含的分类特征
- 由于攻击行为的复杂性和部分通用性,对其建模很困难
C. 特征
漏洞样本包含的特征越多,对该漏洞的描述就越全面,也就有利于分辨代码是否包含漏洞。但是目前的漏洞数据仅收集漏洞的源代码和正常代码,缺乏对漏洞的全面描述,这同时又是一个两难的问题:
- 漏洞特征不足难以确定代码是否包含漏洞
- 漏洞特征过多会显著的降低模型的性能
虽然Xiao等人将漏洞代码与补丁代码以哈希值的形式存储,可以快速准确地识别代码重用漏洞,但是并没有解决所有类型漏洞的问题。所以如何选择漏洞最有特点的特征又不降低模型性能是目前需要研究的问题。
D. 粒度
高质量的数据集应该包含多个级别的粒度,如:
- 文件
- 类
- 函数
目前的漏洞数据集都是以函数作为基本粒度级,因为其可以缓解模型学习过多的正常代码而导致无法识别漏洞的情况。但是函数级粒度仍有存在一些局限性:
- 只能找到漏洞函数,无法精确定位与漏洞直接相关的代码
- 无法处理跨函数问题
综上,作者认为漏洞数据集的粒度应以代码片段为主,其中包含易受攻击和非易受攻击的代码语句。此思路已有具体的实现,如Li等人使用程序间程序切片技术提取漏洞相关语句并构建数据集,此方法的优点包括:
- 缓解了漏洞挖掘的跨函数问题
- 改进的程序切片技术可以处理源代码以生成语句粒度数据集
E. 数据集大小
要训练一个完美的漏洞检测模型,理想情况下漏洞数据集应做到:
- 包含全部类型的漏洞
- 漏洞数据集的数量足够大
但是,在真实世界的漏洞数据源几乎不可能同时做到以上两点,所以为了解决这个问题,目前正在研究开发人工漏洞合成数据集,具体做法包括:
- 向现有程序中注入漏洞
- 通过人工制作漏洞程序
目前已有对于这个思路的具体实现,比如:
- Gavitt等人通过修改四个真实世界程序(base64、md5sum、uniq、who)的源代码,一次自动插入多个漏洞,生成了数据集LAVA-M。该数据集已广泛用于漏洞检测工具的性能评估。
- Wang等人提出了一种改进的过采样技术,该技术在源代码级别修改关键语句以生成一组合成补丁数据,从而与基于NVD的数据集形成混合数据集。
经过实验表明,以上方法合成的漏洞数据集均可以提高漏洞检测模型识别漏洞的准确性。
III. 现有最先进的漏洞数据集
现有的漏洞数据集主要来自于:
- 开源漏洞库
- 软件项目库
- 合成的漏洞数据集
- 混合数据集
本文总结了一些流行的漏洞数据集,如表II所示。主要从以下几个维度进行分析:
- 数据集的源
- 粒度
- 是否已发布
- 漏洞类型
- 是否有对应的修补程序
- 标记方法
A. 真实世界程序漏洞数据集
1 D2A
D2A数据集是由Zheng等人结合提交历史差异分析和静态分析工具的方法生成的数据集,D2A的数据样本来自于程序间分析,并基于此漏洞数据集训练了漏洞识别模型CMA。
此数据集的优点包括:
- 保留了更多细节,如错误类型、位置、跟踪和解析器输出
- 保留了用于编译相关源文件的编译器参数,有助于动态分析漏洞
此数据集的缺点包括:
- 缺少修补程序信息
- 执行相邻版本差异分析时,可能会对其进行错误标记
- 某些函数位置的更改或无效提交可能会导致差异分析错误
- 该数据集的质量受到模型可靠性的限制
2 CVEfixes
CVEfixes漏洞数据集由Bhandari等人提出,此数据集根据常见弱点枚举(CWE)类型定义的类别对漏洞进行分类,同时引入CVSS严重性分数作为漏洞的度量。
此数据集的优点包括:
- 能够对多类漏洞预测问题进行更全面的研究
此数据集的缺点包括:
- 其数据来源相对单一,仅从NVD获取漏洞数据
- 需要进行额外的检查
3 Ponta et al.
Ponta等人手动收集了关于开源软件漏洞及其修复的代码语句级数据,涵盖205个不同的项目,包括NVD尚未索引的漏洞,以及从软件供应商获得的漏洞数据。具体包括:
- 包括29个没有CVE标识符的漏洞
- 46个已分配CVE标识符但尚未在NVD中发布的漏洞
此数据集的优点包括:
- 漏洞标签的准确性很高
- 粒度更精细,直到语句级别
此数据的缺点包括:
- 数据集构建过程缺乏自动化,维护和更新工作量很大
- 数据量很小,很难满足漏洞检测模型的训练需求
4 CPG-based dataset
Guan等人提出了一种基于代码属性图(CPG)构建漏洞数据集的方法,以生成基于CPG的高质量数据集。与基于源代码的漏洞数据集相比,基于CPG的数据集只保留了源代码的代码属性图。
此数据集的优点包括:
- 降低数据维度
- 更完整地保留了关键代码的语义信息
- 显著降低了噪声
- 数据集具有图结构,有助于促进图神经网络在漏洞挖掘领域的应用
此数据集的缺点包括:
- 数据集的质量依赖于静态程序切片技术
- 无法跨文件提取语义信息
- 只能为四种漏洞类型生成代码切片
- 缺乏通用性
5 CrossVul
CrossVul数据集是由Nikitopoulos等人提出,此数据集主要包括:
- 易受攻击的代码
- 从开源软件库Git提交中检索到的补丁提交
此数据集的优点包括:
- 通过训练自然语言处理模型来发现与漏洞补丁相关的提交消息,有效地扩展了漏洞数据集的特征
此数据集的缺点包括:
- 只针对易受攻击的文件进行拆分和标记,而不是在函数中
- 数据集的粒度过于粗糙,包含漏洞的整个文件被直接标记为易受攻击,很难达到良好的模型训练效果
B. 人工合成的漏洞数据集
1 Juliet
Juliet是由软件保障度量和工具评估(SAMATE)项目创建,从预定义模式生成的合成漏洞数据集,作为静态分析工具的评估度量。
此数据集的优点包括:
- 数据量很大
从数据集的缺点包括:
- 缺乏多样性
- 此数据集的度量在某些情况下不可靠,且缺乏公平性和公正性
C. 混合漏洞数据集
1 PatchDB
PatchDB是一个包含补丁信息的大规模混合数据集,主要包含:
- NVD索引的经验证的安全补丁
- 从外部获取的大量补丁信息
- 通过改进的过采样技术从现有样本中自动生成的额外合成数据集
常见CWE漏洞类型和编程语言相关的现有漏洞数据集的分布如图2所示,可以看到其分布不均匀,这表明,现有的漏洞数据集几乎不能满足跨语言通用漏洞检测模型的训练要求。而且,使用最广泛的C/C++编程语言也未涵盖所有类型的漏洞。所以说,如何解决漏洞挖掘模型在评估测试中的适用性,是未来需要研究的问题。
通过以上分析可以看到,没有一个数据集符合真正基准数据集的标准。
IV. 挑战和机遇
A. 基准数据集
通过回顾现有的漏洞数据集研究,发现目前的漏洞数据集主要有以下几点局限性:
- 缺乏可扩展性
- 无法横向评估模型之间的不同性能
- 数据源单一
- 大多数数据源只包含C/C++开源项目,不够全面
一个好的漏洞数据集应满足以下几点:
- 具有多种数据源
- 足够大的数据量
- 全面的漏洞特征
- 均匀分布的漏洞类型
- 频繁更新的数据集
综上,一个标准化和规范化的基准数据集应具有的特点包括:
- 根据多层次检测粒度进行精心定制
- 包含少量合成和大量真实代码样本,用于定性和定量评估和比较
B. 自动化数据集标记框架
当我们拥有一个基准数据集后,还要对其打标签,目前的标记方法主要包括:
- 依赖安全专家的事先知识来确定样本的正确标记
- 假设所有收集的样本都正确标记
如果依赖安全专家标记,效率会非常低,如果假设所有的样本都被正确标记,显然也不合理。基于此,作者认为未来应该研究基于AI模型的自动漏洞数据标记与人类审查相结合,对于提高漏洞数据集的质量可能更为实用。
C. 安全和非安全提交
现如今的项目都是很多人一起来维护,那么如何从若干人的项目分支提交中准确区分修补程序和非易受攻击的修改代码信息,甚至是失败的修补程序,也是未来的一个研究热点问题。
V. 结论
本文主要讨论了以下几个问题:
- 漏洞数据集构建中面临的问题
- 回顾应用于AI漏洞检测的数据集的相关研究
- 展示基于真实世界程序的漏洞数据集和合成漏洞数据集的趋势,并分析了它们的优缺点
本文的目的是促进安全领域的学者尽快达成统一的漏洞数据集构建标准和规范。
总结
本篇论文也并没有什么技术上需要总结的内容,目前已经读了两篇综述性文章,下面就该读一读真正写技术的文章了。下面论文精度笔记见!