本篇论文提出了一种新的漏洞源代码数据集——DIVERSEVUL,并通过爬取安全问题网站、提取修复漏洞的提交和源代码等方法进行构建。该数据集包含18,945个脆弱函数,覆盖了150个CWE(软件漏洞分类)和330,492个非脆弱函数,来自7,514个提交。与之前的数据集相比,该数据集涵盖了更多的项目。此外,作者还分析了使用深度学习检测软件漏洞所面临的挑战和有前途的研究方向。他们评估了11种模型架构,属于4个家族,结果表明深度学习在检测漏洞时仍存在高误报率、低F1分数和难以检测硬CWE等问题。同时,作者还提出了大型语言模型(LLMs)和针对特定源代码的预训练目标是未来的研究方向,可以提高漏洞检测性能。
方法描述
该研究旨在收集高质量的漏洞修复提交,并关注来自真实世界的项目。他们选择了从安全问题中收集数据,因为这些反映了社区开发人员和安全分析师提供的高质量标签。首先,他们识别了29个安全问题网站,并从中缩小到具有最多git系统提交的两个网站。然后,他们从这些网站中爬取了问题标题、正文以及相关git提交URL。由于开发者的讨论可能会引用漏洞修复提交和引入漏洞的提交,因此他们使用两种启发式方法来排除引入漏洞的提交。首先,他们排除所有在包含关键词“introduced”和“first included”的评论中提到的commit URL;其次,他们手动检查至少更改了10个函数的所有提交,并排除那些引入漏洞的提交。最后,他们保留了剩余的提交作为他们的数据集。
接下来,他们解析git提交URL以提取项目和提交ID。然后,他们克隆了项目并从这些项目中提取提交。接着,他们在提交中识别与C/C++相关的代码文件,并提取了这些文件中发生变化的函数以及未发生变化的函数。他们将被修改函数的先前版本标记为脆弱,而修改后的版本则标记为非脆弱。他们还将相关代码文件中的未受影响函数标记为非脆弱。像之前的工作一样,他们通过MD5哈希值去重函数,并在去重前不归一化代码。他们在处理函数时跟踪唯一MD5集合。他们先处理所有脆弱函数,然后再处理非脆弱函数。如果函数的MD5已经存在于这个集合中,则不会再次包括该函数。总共,他们从797个项目中收集了7,514个提交,导致18,945个脆弱函数和330,492个非脆弱函数,涵盖了150个CWE(软件弱点分类)。
对于提及CVE编号的问题标题,他们查询National Vulnerability Database API以获取问题和相应提交的CWE信息。对于带有开发者注释的漏洞类别的问题,他们手动将其映射到最流行的25个CWE中。大约85%的数据可以映射到150个CWE类别。他们没有专门处理层次化的CWE。根据NVD数据库的查询结果,一个CVE编号可能映射到多个CWE。
方法改进
本研究的方法改进在于其数据采集过程更加全面和精确。作者们不仅考虑了安全问题本身,还考虑了提交的提交记录,从而能够更好地捕捉漏洞修复的过程。此外,他们使用了多种启发式方法来排除引入漏洞的提交,从而提高了数据的质量。
解决问题
本研究解决了从实际项目中收集高质量漏洞修复提交的问题。他们的方法可以帮助研究人员更好地理解漏洞修复的过程,并提供更准确的漏洞修复模型。同时,他们的数据集也可以用于评估漏洞修复工具的效果。
论文实验
本文主要介绍了使用不同模型架构和数据集对C/C++代码中的漏洞检测性能的影响,并通过实验结果得出了一些结论。
在实验中,作者选择了四种不同的模型架构,包括GPT-2家族的三个模型(GPT-2 Base、CodeT5 Base和NatGen)、以及RoBERTa家族的一个模型(CodeBERT)。同时,作者还使用了四个数据集,包括Devign、REVEAL、BigVul和CrossVul,以及一个由这些数据集中项目合并而成的数据集(Previous+ DIVERSEVuL)。
通过对这些模型在测试集上的表现进行比较,作者得出了以下结论:
-
当训练数据量较大时,大型语言模型比基于图神经网络的REVEAL模型表现更好。具体来说,在训练数据量较大的情况下,LLM模型的表现要优于REVEAL模型,而在训练数据量较小的情况下,REVEAL模型则表现更好。
-
在LLM模型中,T5 Base模型在漏洞检测任务上表现最好。这表明,具有编码器-解码器结构的模型可能更适合于漏洞检测任务。
-
在预训练模型方面,仅使用自然语言处理任务的模型(如CodeBERT、GraphCodeBERT和CodeGPT)与使用预训练模型的模型(如CodeT5和NatGen)相比,没有显著提高漏洞检测性能。
-
在预训练任务方面,使用特定于代码的任务(如CodeT5和NatGen)可以显著提高漏洞检测性能,而使用自然语言处理任务的模型则无法达到同样的效果。
-
对于相同的训练数据集,收集更多的数据集并不能进一步提高模型的性能。
综上所述,本文的实验结果表明,选择适当的模型架构和预训练任务对于提高C/C++代码中的漏洞检测性能非常重要。此外,收集更多的数据集并不能总是带来更好的性能提升。
文章优点
- 该论文提出了一种新的C/C++漏洞源代码数据集DIvERSEVuL,并使用该数据集研究了各种深度学习架构在检测软件漏洞方面的有效性。
- 通过比较不同的模型架构和训练数据量,该论文得出了许多有价值的结论,例如:使用大型语言模型(如RoBERTa、GPT-2和T5)可能比使用基于结构特征的图神经网络更有效;预训练任务对于提高性能非常重要等。
- 论文还探讨了一些挑战和限制,例如:模型需要大量的训练数据才能达到最佳效果;模型的泛化能力仍然有限,难以处理未见过的项目等。
方法创新点
- 该论文提出了一个新的C/C++漏洞源代码数据集DIvERSEVuL,该数据集是目前最大的、最多样化的数据集之一。
- 该论文使用了多种深度学习模型来检测软件漏洞,并比较了它们的效果。
- 该论文还提出了一些新的思路和方向,例如:开发针对代码理解的任务特定预训练技术,以进一步提高模型性能。
未来展望
- 该论文提出的DIvERSEVuL数据集为后续的研究提供了有价值的基础资源,可以用于探索更多关于深度学习模型在软件漏洞检测中的应用。
- 该论文提出的一些新思路和方向值得进一步深入研究和实践,例如:如何更好地设计和实施针对代码理解的任务特定预训练技术,以及如何解决模型泛化能力不足的问题。
- 该论文所涉及的挑战和限制也需要更多的研究和探索,以便更好地理解和应对这些问题。