今天分享的论文是《A C/C++ Code Vulnerability Dataset with Code Changes and CVE Summaries》
开源数据集和脚本:https://github.com/ZeoVan/MSR_20_Code_Vulnerability_CSV_Dataset
这是知名数据集Big-Vul的原论文。
本文从开源的Github项目中收集了一个大型的C/C++代码漏洞数据集,即Big-Vul。本文爬取了公共的通用漏洞披露(Common Vulnerabilities and Exposures, CVE)数据库以及与CVE相关的源代码仓库。具体来说,本文从CVE数据库中收集了漏洞的描述性信息,例如CVE编号、CVE严重程度评分和CVE摘要。利用CVE信息及其相关的已发布Github代码仓库链接,本文下载了所有的代码仓库,并提取了与漏洞相关的代码变更。总体而言,Big-Vul包含3754个代码漏洞,涵盖91种不同的漏洞类型。所有这些代码漏洞均从348个Github项目中提取而来。所有信息都以CSV格式存储。本文将代码变更与CVE描述性信息进行了关联。因此,本文的Big-Vul可用于各种研究主题,例如检测和修复漏洞、分析与漏洞相关的代码变更。Big-Vul在Github上公开可用。
漏洞检测和修复一直是软件行业的核心关键活动。未检测到的漏洞可能会被黑客利用,给用户造成巨大损失。例如,一种新的Windows欺骗漏洞(CVE-2020-0601)被发现,它可以影响数百万台Windows计算机。黑客可以利用该漏洞在用户连接受影响的软件时解密机密信息。最近,安全漏洞检测已成为研究界关注的重要课题。然而,由于缺乏现成的数据集,大多数研究仅针对某些类型的漏洞进行检测。
受此需求启发,本文从通用漏洞披露(CVE)数据库和开源项目中精心整理了一个大型的C/C++漏洞数据集,即Big-Vul。首先,本文爬取了公共的CVE数据库,收集了CVE的所有可用描述性信息,例如CVE编号、CVE严重程度评分、CVE摘要以及指向受影响产品的参考链接。其次,通过CVE参考链接,本文深入挖掘了具有git开源仓库的相关产品。利用CVE编号,本文识别出与漏洞相关的代码提交,并提取了相关的代码变更。总体而言,本文的Big-Vul包含从348个开源项目中收集的3754个代码漏洞,涵盖91种不同的漏洞类型。本文将代码变更与CVE(包括描述性信息)进行了关联。本文的数据集Big-Vul能够支持对漏洞进行以下关键分析,但不限于:
(1)深入分析不同漏洞的特征以及与漏洞相关的代码变更;
(2)改进代码漏洞的检测和修复。
与现有工作不同,Big-Vul具有以下关键特性:
1. Zhou等人通过使用安全相关关键词过滤GitHub上的提交构建了一个漏洞数据集。与他们的数据集不同,Big-Vul是通过利用并关联CVE数据库、项目错误报告和代码提交构建的,这有助于提高识别与漏洞相关的代码变更提交的准确性。此外,他们没有标记漏洞类型,并且只发布了部分数据集。
2. Ponta等人手动整理了一个包含CVE编号和代码提交ID的Java漏洞数据集。本文的Big-Vul包含更多的CVE信息,包括21个特征,例如代码变更、CVE摘要和安全评分。而且,本文的数据集中有3754个漏洞,而他们的数据集中只有624个漏洞。
3. VulinOSS主要包含与项目元数据相关的漏洞信息,例如发布版本和代码指标。本文的Big-Vul更以代码为中心。本文处理了项目的源代码及其相关的代码提交,以提取易受攻击的函数及其相应的修复方法。
本文的主要贡献如下:
1. 数据集:本文收集并发布了一个大型数据集,其中包含从CVE数据库和开源项目仓库中获取的代码变更和CVE摘要。
2. 使用脚本的收集过程:本文发布了数据收集方法以及支持脚本。
通过以下五个步骤构建了Big-Vul数据集:
1. 步骤S1:本文爬取了CVE数据库中的所有漏洞条目,例如每个漏洞的描述性信息。具体来说,本文使用BeautifulSoup2创建了一个脚本,用于解析CVE Details的网页,并按年份遍历页面。对于每个CVE条目,本文收集了以下信息:访问复杂度、是否需要身份验证、可用性影响、保密性影响、CWE编号、CVE编号、CVE摘要、完整性影响、发布日期、安全评分、更新日期和漏洞分类。
2. 步骤S2:本文自动筛选出具有公开可用Git仓库参考链接的CVE条目。本文只保留那些具有清晰固定遍历路径、能够指向实际代码提交的Git仓库。在本文的数据集中,本文主要关注Github仓库以及一些拥有自己Git服务器的热门产品,例如谷歌安卓。例如,在处理与谷歌Chrome相关的条目时,CVE参考链接会引导本文至特定的桌面稳定频道更新页面,如2020年3月31日的页面。该页面包含CVE及其相关的错误ID。本文检索了错误ID及其对应的CVE。然后,本文使用错误ID从Github上的Chrome镜像仓库中识别相关的代码提交。一些大型热门产品,如Chrome和安卓,可能有自己的包含安全信息的发布页面,而其他一些产品可能会直接将代码仓库链接作为参考链接关联到CVE数据库。本文根据最终指向代码仓库的页面的不同结构,开发了不同的爬取策略。
3. 步骤S3:每个提交都被视为项目的一个小版本。本文使用提交ID请求项目的提交历史记录,并将每个小版本映射到相应的CVE条目。对于每个相关提交,本文提取修复漏洞前后的代码变更。最后,本文利用代码变更信息恢复方法的易受攻击版本。因此,本文为一个项目收集了以下信息:带有修复方法的易受攻击方法以及其他非易受攻击的方法。
上述所有详细信息,如每个项目的名称和CVS的详细信息,都以结构清晰的CSV格式存储,并且源代码函数被压缩成一个文件包。该数据集以及用于构建它的脚本在GitHub上公开提供。
数据描述
Big-Vul数据集包含2002年至2019年的CVE条目的详细信息。本文为每个CVE条目收集了21个特征。下表描述了每个CVE特征及其在CSV文件中对应的列名。本文的Big-Vul数据集以逗号分隔值(CSV)格式发布。本文还提供了示例代码,展示如何处理和分析本文的数据。
Big-Vul数据集涵盖了348个不同的项目,这些项目与4432个唯一的代码提交相关联。这4432个代码提交包含了对91种CWE类型的3754个漏洞的代码修复。本文使用以下图表来展示Big-Vul。
上图展示了Big-Vul中C/C++代码提交数量最多的10个不同项目中,包含漏洞修复的提交数量。具体来说,谷歌Chrome的提交数量最多,即1518个用于修复漏洞的提交。Linux的提交数量位居第二,为927个,谷歌安卓的提交数量位居第三,为376个。上述三个产品(谷歌Chrome、Linux和谷歌安卓)的提交数量占从348个产品中收集的总提交数量的63.65%。前10个项目总共有3399个代码提交,占Big-Vul中收集的总提交数量的76.69%。
上图展示了代码提交数量最多的前10种CWE类型的代码提交数量。前三种CWE类型——CWE-119(内存缓冲区操作边界限制不当)、CWE-20(输入验证不当)和CWE-125(越界读取)——都与C/C++代码中的数据管理有关,占总提交数量的33.94%。
上图展示了前10个项目中前5种CWE类型的漏洞数量。不同类型的CWE在不同项目中占主导地位的情况有所不同。本文发现,提交数量最多的三种CWE类型,即CWE-119(内存缓冲区操作边界限制不当)、CWE-20(输入验证不当)和CWE-125(越界读取),也出现在每个前10的项目中。对于谷歌Chrome来说,CWE-119和CWE-20是主要类型,而CWE-125是Tcpdump和Radare2产品的主要CWE类型
下表展示了本文的Big-Vul在代码函数层面的更多统计信息。本文识别出了与91种CWE类型的漏洞相关的4432个代码提交。对于给定的带有相关提交的易受攻击函数,本文保留了该函数的易受攻击版本及其修复漏洞的代码变更。总体而言,本文在Big-Vul中获得了8143个修改文件、11823个易受攻击函数和253096个非易受攻击函数。
此外,本文还想研究易受攻击函数在不同项目中的分布情况。下图展示了提交数量最多的前10个项目中每个项目的易受攻击函数数量。具体来说,谷歌Chrome、Linux和谷歌安卓是易受攻击函数数量最多的前三个项目。它们分别有4932个、2140个和1224个易受攻击函数,占Big-Vul中易受攻击函数总数的70.17%。
Big-Vul数据集可用于许多与漏洞相关的研究领域,例如深入理解CVE和代码变更、以代码为中心的漏洞检测以及漏洞修复补丁的识别。
1. CVE和代码变更的深度分析:收集到的CVE编号、CVE摘要和其他一些详细的CVE信息,有助于使用文本挖掘和自然语言处理技术对漏洞的关键特征进行深度分析。此外,本文收集的代码变更可用于提取代码特征,并更深入地了解漏洞是如何修复的。而且,详细的CVE信息与其相应的代码变更相关联,这使得结合CVE信息和代码进行任何分析成为可能。对CVE文本描述、相关代码变更及其关系的分析,有助于为解释漏洞的可能代码修复方法的研究做出贡献,从而改进漏洞检测。
2. 以代码为中心的漏洞检测:在软件工程的发展过程中,开发新功能的需求与检测漏洞之间一直存在着矛盾。为了使开发人员从手动漏洞检测这一繁琐耗时的任务中解脱出来,人们开展了自动漏洞检测的研究。本文的Big-Vul数据集包含漏洞修复的代码变更,因此可用于在不同层面(如文件、函数和行层面)对代码修复进行建模。利用这些以代码为中心的信息,研究人员可以抽象出代码漏洞的特征来定义规则,甚至可以训练神经网络模型来学习代码特征以检测漏洞。
3. 漏洞修复补丁的识别:对于开源项目,由于其代码仓库和提交日志是公开的,在漏洞修复与修复后的安全版本发布之间的时间间隔内,项目中的漏洞可能会受到安全攻击。在这种情况下,拥有一个以自动识别漏洞修复补丁为目标的代码变更跟踪系统,来帮助开发人员管理版本发布就显得尤为重要。借助代码变更信息,本文的Big-Vul可用于漏洞修复补丁识别的研究。
局限性
在本文的Big-Vul数据集中,CSV文件有306行,与Chrome项目相关的行中,部分CVE的描述性信息缺失,例如CVE编号、CWE编号等。这是因为本文使用谷歌官方发布的错误报告中的错误ID作为关键词,在GitHub上检索Chrome镜像仓库并提取相关的修复提交信息。其中有少量错误ID没有被分配CVE编号。因此,本文无法将这些条目映射到CVE数据库。一旦这些条目被分配了CVE编号、CWE编号或其他重要特征,本文将用相关信息更新本文的数据集。
相关工作
先前的研究已经创建了几个现有的漏洞数据集。Zhou等人通过使用安全相关关键词过滤GitHub上的提交,收集了一个C语言漏洞数据集。然后他们手动检查每个提交是否存在漏洞。Ponta等人通过手动检查可用信息并提取相应的修复提交,监控国家漏洞数据库(NVD)和50多个不同的项目特定网站以获取新的漏洞披露信息。Gkortzis等人通过从NVD数据库爬取数据并记录数据库中的项目版本信息,收集了一个数据集。然后他们将项目版本映射到在相应项目仓库中找到的版本引用(提交标签和分支)。
做个总结:
本文提出了一个C/C++代码漏洞数据集Big-Vul,其中包含CVE编号、CVE严重程度评分、CVE摘要、小版本、代码变更等重要信息。本文的Big-Vul数据集是从通用漏洞披露数据库和官方项目错误报告中收集而来的,这意味着就映射到CVE描述性信息的代码变更是否真的与漏洞相关而言,本文的数据集是准确的。由于包含了漏洞相关修复前后的小版本,本文的数据集可通过提取这两个小版本之间的代码变更,用于进行与漏洞相关的研究。
在未来的工作中,本文将尝试挖掘更多使用其他问题跟踪和源代码控制管理系统(如Mercurial、Subversion、JIRA和Bugzilla等)的仓库,而不仅仅局限于Git,以使本文的数据涵盖更多项目、更多漏洞类型和更多编程语言。