1.常用数据集
1.1.Big-Vul
论文地址:A C/C++ Code Vulnerability Dataset with Code Changes and CVE Summaries
该数据集存储为csv格式。包含了漏洞行号信息,详细参考github地址。
1.2.Reveal
Reveal本为一个DLVD(Deep Learning Vulnerbility Detection)方法,可以参考Reveal。而作者收集了一个数据集。从Linux Debian Kernel 和Chromium的vulnerabilitiy fixed patches中构造。
论文地址:Deep Learning based Vulnerability Detection:Are We There Yet?
包含2个json,vulnerables.json和non-vulnerables.json。json的key包括
- code:源代码内容
- hash
- project
- size
遗憾的是,该数据集不包括漏洞行号信息。
1.3.FFMPeg+Qemu
又称Devign数据集
数据集为一个function.json,包括4个key。
- project:FFmpeg或者Qemu
- commit_id
- target:0或者1,是否有漏洞
- func:一个函数的代码内容,包括函数定义那一行
遗憾的是,该数据集也不包括漏洞行号信息。
1.4.D2A
论文地址:D2A: A Dataset Built for AI-Based Vulnerability Detection Methods Using Differential Analysis
github地址:D2A
数据集下下来为pickle文件,需要注意的是,这里的标记并不是简单的将一个function标为0或1,而是有一个trace,记录bug触发的路径,会涉及到多个function。
以libtiff Sample Dataset为例,加载2020-09-10_libtiff_labeler_1.pickle文件,打开发现是一个dict,有下面几个key
- id:值为libtiff_d888dddf8807829fc0f9f3bbdb0a64871c29b05b_1
- label:值为1,该文件全是标记为1的数据
- label_source:auto_labeler
- bug_type:PULSE_MEMORY_LEAK
- project:libtiff
- bug_info:为1个dict,key包括
- qualifier:bug信息
- file:源文件
- procedure
- line
- column
- url
- adjusted_bug_loc
- bug_loc_trace_index
- versions
- sample_type:before_fix
- trace:为1个list,记录该fix涉及到的function行号
- functions:记录bug trace的function完整的代码
- commit
- compiler_args:为dict,记录每个文件用什么编译器编译
- zipped_bug_report:由Infer产生的原始bug报告。
论文给出的示例如下:
{
"id": "httpd_9b3a5f0ffd8ec787cf645f97902582acb3234d96_1",
"label": 1,
"label_source": "auto_labeler",
"bug_type": "BUFFER_OVERRUN_U5",
"project": "httpd",
"bug_info": {
"qualifier": "Offset: [0, +oo] Size: 10 by call to ...",
"loc": "modules/proxy/mod_proxy_fcgi.c:178:31",
"url": "https://github.com/apache/httpd/blob/..."
},
"versions": {
"before": "545d85acdaa384a25ee5184a8ee671a18ef5582f",
"after": "2c70ed756286b2adf81c55473077698d6d6d16a1"
},
"trace": [
{
"description": "Array declaration",
"loc": "modules/proxy/mod_proxy_fcgi.c:178:31",
"func_key": "modules/proxy/mod_proxy_fcgi.c@167:1-203:2",
}
],
"functions": {
"modules/proxy/mod_proxy_fcgi.c@167:1-203:2": {
"name": "fix_cgivars",
"touched_by_commit": true,
"code": "static void fix_cgivars(request_rec *r, ..."
}
},
"commit": {
"url": "https://github.com/apache/httpd/commit/2c70ed7",
"changes": [
{
"before": "modules/proxy/mod_proxy_fcgi.c",
"after": "modules/proxy/mod_proxy_fcgi.c",
"changes": ["177,1^^177,5"]
}
]
},
"compiler_args": {
"modules/proxy/mod_proxy_fcgi.c": "-D_REENTRANT -I./server ...",
},
"zipped_bug_report": "..."
}
1.5.其它
2.数据集质量研究
在ICSE 23关于漏洞数据集的paper Data Quality for Software Vulnerability Datasets中,调研的数据集如下表所示:
数据集 | 标注来源 | function数量 | 漏洞function占比 |
---|---|---|---|
Big-Vul | CVE databas | 188636 | 5.78% |
Devign | 开发者标注 | 27318 | 45.61% |
D2A | 工具标注 | 1295623 | 1.44% |
Juliet | 合成 | 253002 | 36.77% |
作者统计了可能导致标注不准确的原因:
-
Irrelevant code change: 数据集标注器假设漏洞修复(vulnerability-fix)所涉及的代码是易受攻击的代码(function)。然而,漏洞修复commit可能不一定只包括修复补丁。可能还存在非功能性更改,如样式更改、重构和代码迁移,可能会混淆数据标记过程。比如FFMpeg中libswscale/swscale.c的commit仅仅是将常量变成定义的宏。
-
Cleanup changes: 漏洞修复可能包括增加、删除或者修改变量,这些是与漏洞修复相关的功能更改,但是它们并没有指示触发行的位置。
-
Inaccurate vulnerability fix identification: 如果标注器无法识别漏洞修复,那么随后的代码片段自然不会是漏洞。像Big Vul这样从外部漏洞报告中跟踪漏洞修复的数据集可能会在这个过程中引入错误。比如
-
作者发现Chromium项目的大多数漏洞报告都被不正确地跟踪,因为这个存储库不是通过GitHub自然托管的。
-
而此外,有些标注器(Devign和D2A)试图直接从提交commit历史记录中识别漏洞修复的数据集,这个过程同样可能导致错误标注。D2A用静态分析工具Infer标注数据集同样可能引入错误。
-
对于来源自真实环境的数据集,作者的分析结果如下:
数据集 | Irrelevant | Cleanup | Inaccurate |
---|---|---|---|
Big-Vul | 25% | 28.1% | 46.9% |
Devign | 42.9% | 21.4% | 35.7% |
D2A | 0 | 0 | 100% |
-
Devign由于引入人工校验,所以不准确度相对低,但是其数据量也很小。
-
Big-Vul的主要问题是从commit中提取了不相关的code change,尤其是来自Chromium的commit,36%的entry都来自Chromium。
-
D2A所标注的commit大部分都不是真正的漏洞commit。
除了对数据集的准确性评估,作者还评估了数据集独特性(存不存在重复样本)、一致性(存不存在标签冲突的样本)、完整性问题。