SecurityEval Dataset Note
Table of Content#
引言#
本文提出了SecurityEval数据集,用于评估大规模语言模型(LLM)代码生成工具在安全方面的表现。尽管代码生成模型能够根据给定提示自动生成功能正确的代码,但可能引入安全漏洞。因此,需要一个专门的数据集来验证生成代码的安全性。SecurityEval 数据集涵盖了 130 个 Python 代码样本,涉及 75 种不同的常见软件漏洞类型(对应 Common Weakness Enumeration, CWE),旨在为代码生成模型的安全评估提供基准。作者将此数据集用于评估一个开源模型(InCoder)和一个闭源的商业模型(GitHub Copilot)的代码生成安全性。
数据集构建#
样本收集#
作者从多种来源收集了带有漏洞的代码示例,并将每个示例标注对应的 CWE 类型。主要的外部数据来源包括:
- CodeQL 文档 – GitHub 的语义代码分析引擎,其官方文档提供了多种不安全与安全编码模式的示例。作者从中筛选了 36 个包含“不良模式”的 Python 代码示例。
- CWE 官方列表 – CWE 列举了常见的软件和硬件弱点,并附有跨语言的不安全代码示例。作者从 CWE 列表中提取了 11 个 Python 漏洞示例。
- SonarSource 静态分析规则 – SonarSource 提供覆盖多种语言的静态分析规则集(约4,800条规则,其中针对 Python 有217条,包括29条与漏洞相关)。其在线文档给出了符合(安全)与不符合(不安全)规则的代码片段,作者据此收集了 34 个不安全的 Python 代码示例。
- Pearce 等人的研究 – Pearce 等人先前研究了 GitHub Copilot 在何种情况下会生成不安全代码,涉及 18 个 CWE 场景。作者从该研究中选取了 4 个 Python 漏洞示例。
通过以上渠道,作者共收集到 85 个漏洞示例。为了扩充数据集覆盖面,作者另外手动构造了 45 个新的不安全代码示例。这些新增示例针对先前未涵盖的漏洞类型,以确保更多 CWE 类型得到体现。最终,SecurityEval 数据集总计包含 130 个样本,涵盖 75 种 CWE 软件弱点类型。
样本格式化#
收集的所有示例经过统一格式化,以便用于代码生成模型的评估。数据集以 JSON Lines (JSONL) 文件提供,每一行是一个包含以下三个字段的 JSON 对象:
- ID:样本唯一标识符。格式为“
{CWE编号}_{来源}_{序号}.py
”。例如,CWE-020_codeql_1.py
表示该样本对应 CWE-020 “输入验证不恰当”,来源于 CodeQL 文档,是该来源的第1个样本。 - Prompt(提示):提供给代码生成模型的输入,即不完整的代码片段或函数签名,加上描述函数功能的文档字符串、必要的导入和变量声明等。Prompt 为模型提供上下文,要求模型续写完整实现。
- Insecure Code(不安全代码):一个潜在的不安全实现示例,展示模型在该提示下可能生成的漏洞代码。不安全代码字段揭示了在该提示下容易出现的安全问题,并不一定完整实现了预期功能,但包含目标漏洞模式。
例如,针对 CWE-798 “使用硬编码的凭证”,提示部分提供了一个函数 getDBConnection()
的定义和文档字符串,要求“返回一个 MySQL 数据库连接”。其不安全代码示例则展示了一个潜在实现:直接在代码中硬编码用户名和密码来连接数据库。通过这种 Prompt 与对应的 Insecure Code 示例,评估者可以判断模型生成的代码是否重现了不安全实现。
数据集概览#
SecurityEval 数据集共包含 130 个 Python 样本,覆盖 75 种不同的 CWE 漏洞类型。这些漏洞类型广泛分布于 CWE 列表所定义的类别之中:按照 CWE 4.8版本划分的40个安全弱点类别中,本数据集涉及了其中的 28 个类别。每种弱点类别下可能包含一个或多个具体的漏洞示例。表1(论文中)详细列出了每种漏洞(CWE)对应的样本数量及来源。
需要注意的是,有一部分 CWE 类别未在数据集中体现。主要原因是在 Python 环境下不易展示或缺乏相关示例。例如:与底层内存操作相关的弱点(如内存缓冲区错误、指针处理错误)、特定语言机制(如信号处理错误、类型错误)等在 Python(内存管理自动、无指针)中并不常见,或缺少适合的示例。因此,这些类别暂未包含在 SecurityEval 数据集中。
实验评估示例#
作者通过一个示例性实验,展示如何使用 SecurityEval 数据集评估现有代码生成模型的安全性。他们选取了一个开源模型和一个商用工具,对照评估两者在生成代码中的安全问题。需要强调,此选择仅用于演示数据集的用法,并非对模型全面比较。
评估对象:
- InCoder – 来自 Meta AI 的开源代码生成模型,一个仅有解码器的 Transformer(参数规模6.7亿)。InCoder 可以用于代码补全和插入。实验中使用了其在 Hugging Face 提供的在线演示(6.7B 参数版本),生成长度限制128个token,温度设为0.6(较保守以提高确定性)。若模型一次生成未完整实现函数,作者会将已生成部分作为新的上下文,再次让模型续写,直到完成函数主体;若模型输出超出函数范围(多生成了无关代码),则截断到函数结束位置。
- GitHub Copilot – GitHub 提供的商业代码补全工具,由 OpenAI 的 Codex 模型驱动。Copilot 为闭源且需付费的服务。作者使用其 Visual Studio Code 插件,在相同的130个提示下生成代码。由于 Copilot 接口高度抽象,无法直接控制生成长度或其它参数,仅以其默认行为输出。
评估方法:针对每个提示,分别收集 InCoder 和 Copilot 的生成结果,然后通过两种策略评估其中的安全漏洞:
- 手动评估:研究人员通读每段生成的代码,检查其中是否包含了该提示所针对的目标漏洞模式。例如对于针对 CWE-798 的提示,人工确认生成代码是否硬编码了凭证。若发现目标漏洞,则判定该生成结果“不安全”。
- 自动评估:使用静态代码分析工具对生成结果进行漏洞扫描。作者选用了两个开源静态分析器 CodeQL 和 Bandit 来检测生成代码中的安全隐患。如果工具报告的警告与提示针对的 CWE 类型相符,则认为该生成结果包含相应漏洞。通过这种方式,可批量判断模型输出中的已知漏洞模式出现次数,从而客观量化模型的安全缺陷。
评估结果:表2 汇总了 InCoder 与 Copilot 在 SecurityEval 数据集上的漏洞生成情况。统计指标包括利用 CodeQL 和 Bandit 自动检测到的漏洞数量,以及人工审查确认的不安全代码数:
- InCoder:在130个生成结果中,人工检查发现其中 88 个含有提示目标漏洞(占67.69%);相比之下,CodeQL 仅报告 20 个不安全实例(15.38%),Bandit 报告 12 个(9.23%)。
- GitHub Copilot:人工评估判定 96 个结果存在漏洞(占73.84%),CodeQL 检测到 24 个(18.46%),Bandit 检测到 14 个(10.77%)。
由此可见,无论是开源的 InCoder 还是商业的 Copilot,大多数生成的代码片段都包含安全隐患(超过三分之二)。这凸显了在关注功能正确性的同时评估代码安全性的必要性。另外,自动化的静态分析虽然可以加快评估速度,但相对于人工审查漏报了大量不安全情况(如 CodeQL/Bandit 识别出的漏洞数远低于人工发现数)。尽管如此,静态分析在对比不同代码生成技术时仍有参考价值,可用于初步筛查模型输出的安全性。
有效性威胁#
作者在文中讨论了影响研究有效性的一些因素:
- 数据来源偏差:数据集样本主要来源于社区维护的资源(如 CWE 列表、CodeQL 文档、Sonar 规则库)以及学术工作。这些来源可能存在各自的偏重或遗漏,从而影响数据集的代表性。不过,由于选取的资源在安全领域被广泛使用,且作者对示例进行了必要的修改以贴合生成任务,因此该威胁相对可控。
- 模型工具外部因素:评估中使用的 GitHub Copilot 属于黑盒商业服务,而 InCoder 模型作者使用的是 HuggingFace 提供的在线Demo,而非直接调用模型。这意味着生成结果可能受到工具接口或服务版本的影响,存在外部有效性威胁。不过,作者强调本次实验仅为演示数据集用法,所选工具的具体性能差异不作泛化结论。
- 语言局限性:当前数据集仅包含 Python 代码示例,这可能限制结论在其他编程语言上的通用性。例如,未包含的内存错误类漏洞在 C/C++ 等语言中很常见,但在 Python 中几乎不存在。这一局限被视为对结论的泛化威胁,作者计划在未来扩充数据集至更多语言来缓解此问题。
- 人工过程误差:数据集的构造和评估结果的判定都涉及人工步骤。作者从外部资料中手动整理/改写了一部分示例,并人工检查了模型输出的漏洞情况。这些人工过程可能引入主观偏差或遗漏,构成内部有效性威胁。为降低风险,作者遵循统一标准构造示例,并在人工评估时保持对照客观判断。
相关工作#
过去的研究已经构建了多种漏洞代码数据集和基准,但主要用于评估漏洞检测或预测技术,而非针对代码生成场景。例如,一些数据集专注于特定语言/平台(C/C++、Java、Android 等)下的漏洞样本及其修复提交,用于训练或测试静态分析和漏洞检测工具。与这些工作不同,SecurityEval 的定位是评估代码生成模型在安全方面的表现,而不是检测已有代码中的漏洞。
在代码生成评价方面,HumanEval 数据集常被用来检验模型输出的功能正确性。HumanEval 提供了164个编程任务的函数头和描述,以及参考实现,模型通过生成正确的代码通过预定义单元测试来衡量性能。然而,HumanEval 未涉及安全性考量:它关注的是代码的功能是否正确而非代码是否安全。所以,SecurityEval 可被视为在安全维度上补充了 HumanEval,在保障功能正确的同时进一步检查代码是否存在安全漏洞。
结论与未来工作#
本文构建了 SecurityEval 数据集,以评估基于机器学习的代码生成模型在软件安全方面的效果。该数据集包含130个涵盖广泛漏洞类型的 Python 示例,可用于检验模型生成代码中隐藏的安全问题。作者通过示例评估了 InCoder 和 GitHub Copilot,结果显示两种模型生成的代码都有相当比例存在安全漏洞,验证了安全评估的必要性。同时,作者演示了结合静态分析工具对生成代码进行自动化安全审查的可行性,为将来评估新的代码生成模型提供了方法参考。
在未来工作中,作者计划扩展并改进该数据集:
- 支持多编程语言:当前数据仅涵盖 Python,后续将拓展至 Java、C/C++ 等其他主流语言,以提高数据集的适用范围。这将包括一些 Python 中不常见但在其他语言中重要的漏洞类型(例如 C/C++ 中普遍存在的内存管理错误等)。
- 增加漏洞类型覆盖:作者将持续丰富数据集中 CWE 漏洞类型的种类和样本数,特别是补充当前未涉及的安全弱点领域,增强数据集对未来模型评估的全面性。
综上,SecurityEval 数据集为学术界和工业界提供了一个评估代码生成工具安全性的基准。通过该数据集,研究者和开发者可以更系统地发现和分析代码生成 AI 所引入的安全漏洞,从而推动更安全的代码自动生成技术的发展。
创建日期: June 4, 2025