Is Your AI-Generated Code Really Safe? Evaluating Large Language Models on Secure Code Generation with CodeSecEval
- 标题:您的 AI 生成的代码真的安全吗?基于 CodeSecEval 对LLMs代码生成的安全性进行评估
- 摘要:*【Background】大语言模型(LLMs)在代码生成和代码修复方面取得了显著进展,为新手和经验丰富的开发人员带来了便利。然而,LLMs 使用来自开源代码库(如GitHub)中未经审查的数据进行训练,这增加了无意中传播安全漏洞的风险。【Status of research】尽管有大量研究在探索代码 LLMs 的安全性,但在全面解决其安全特性方面仍存在空白。【Methodology】在本研究中,我们旨在提供一项全面的研究,以精准评估并增强代码 LLMs 的安全性。为支持我们的研究,我们引入了 CodeSecEval,这是一个精心策划的数据集,专为处理 44 种关键漏洞类型而设计,包含 180 个不同样本。CodeSecEval 为代码模型在代码生成和代码修复这两个关键任务的自动评估奠定了基础,尤其强调安全性。【Experimental results】我们的实验结果显示,当前模型在代码生成和修复过程中经常忽视安全问题,导致生成易受攻击的代码。为此,我们提出了不同的策略,利用漏洞感知信息和不安全代码的解释来缓解这些安全漏洞。此外,我们的研究结果表明,某些漏洞类型特别影响模型的性能,从而影响其在实际应用中的有效性。【Research significance】*基于这些发现,我们相信本研究将对软件工程领域产生积极影响,激励开发出改进的训练方法,推动更安全、可靠的模型部署。
- 关键词:大语言模型(LLMs)、代码生成(Code Generation)、代码修复(Code Repair)、安全性(Security)、数据集(Dataset)
- 项目地址:???
1. Introduction – 问题陈述
-
LLMs生成的代码具有安全问题
LLMs(如PALM、LLaMA、GPT-4和 Claude 3)通常在来自开源代码库(如GitHub)的数据上进行训练,它们可能无意中学习并复制包含软件故障、漏洞和安全隐患的代码。2022 年的开源安全与风险分析(OSSRA)报告强调,在分析的 2049 个代码库中,81% 至少包含一个漏洞,其中 49% 存在高风险漏洞。
- Pearce 等人表明,Copilot 生成的代码大约 40% 是不安全的 (Asleep at the keyboard? assessing the security of github copilot’s code contrib utions)
- Khoury 等人发现 ChatGPT 生成的 21 个程序中只有 5 个是最初安全的 (How Secure is Code Generated by ChatGPT?)
- Perry 等人发现,使用 AI 助手的参与者编写的代码显著地比未使用助手的参与者编写的代码更不安全 (Do users write more insecure code with AI assistants?)
-
现有研究的局限性
-
大多数研究倾向于只关注少数 LLMs 或有限的漏洞类型
-
在探索或充分验证生成更安全代码的策略方面存在不足,忽视了LLMs 修复不安全代码的能力可作为提高代码安全性的重要方面
-
现有用于评估代码安全性的数据集存在显著的限制,例如规模小、部分或不可执行的代码,甚至缺少不安全/安全代码示例。并且通常依赖基于规则的静态分析工具,而这些工具已被证明不够准确,或者依赖手动检查,这仅适用于小范围的样本集,可能忽略代码的正确性。
【现有用于评估代码安全性的数据集】CyberSecEval、SecurityEval、LLMSecEval
-
-
针对现有研究的局限性,文章设立的研究目标
- 更准确地识别当前代码 LLM 在代码生成和代码修复中的安全漏洞
- 提供减轻这些任务相关安全风险的策略
-
本文贡献
- 精心策划代码数据集CodeSecEval,包含 180 个样本,涵盖 44 种关键漏洞类型。该数据集相较现有资源有显著改进,使代码安全分析的评估更加高效和自动化
- 通过对七个最先进的 LLMs 进行广泛评估,揭示了其在代码生成和修复过程中普遍忽视安全考量的问题。对模型的漏洞进行了详细批评,深入揭示了其局限性
- 设计并验证了有效的策略,通过整合漏洞意识信息和不安全代码解释来增强生成或修复代码的安全性。这些策略旨在显著减轻漏洞,为更安全的模型训练方法和更安全的程序部署实践提供了宝贵的见解
PAE - “精确自动评估”,CG - “代码生成”,CR - “代码修复”
2. Related Work – 相关工作
-
LLMs的安全问题
现有研究存在的主要局限包括: (1) 大多仅关注少数 LLMs或特定漏洞类型;(2) 未充分探讨生成或修复安全代码的有效策略;(3) 依赖不够精确的安全工具(如 CodeQL)或手动评估,但可能忽略代码整体正确性。这些局限性突显了在代码安全研究中,LLMs 领域仍需更多探索。
-
代码安全性的数据集
【代码修复】
-
QuixBugs 包含转译为 Python 和 Java 的程序,每个程序包含一个单行错误。尽管具有相关性,该数据集规模较小,仅包含 40 个实例。
-
Big-Vul包含 91 种不同漏洞类型的 3,754 个代码漏洞,均提取自 348 个 Github 项目。
-
CVEfixes 通过使用通用弱点枚举(CWE)类型并结合 CVSS 严重性评分,提供了漏洞的全面分类。该数据集包含 18,249 个文件和 50,322 个函数,包括修复前后的代码。由于缺少测试用例,从安全角度对模型生成的修复代码进行自动评估面临挑战。
【代码生成】
-
SecurityEval 包含 130 个 Python 代码样本,涵盖 75 种漏洞类型。
-
LLMSecEval 提供 150 个实例,覆盖 18 种类型
-
CyberSecEval 提供了 1,916 个实例,涵盖 50 种类型。
-
CodeSecEval 涵盖了广泛的关键漏洞类型,并为每个数据实例提供了详细属性,支持精确的自动评估。通过使用 CodeSecEval,旨在更准确地调查最先进 LLM 在代码生成和修复方面的能力,同时提出有效策略,以提高这两项任务的安全性。
3. CodeSecEval*
-
Introduction
CodeSecEval 包含 44 种漏洞类型的 180 个样本,为评估 Python 语言的代码安全性提供了一个强大的框架。
CodeSecEval 显著特点在于包含可执行的安全和不安全代码,并引入了测试用例,便于使用 Pass@k 指标进行自动且精确的评估。数据集为每个实例设置了六个独特属性,具体如下:
- ID:每个数据实例的唯一标识符,也指示特定的漏洞类型。例如,“CWE434_03”表示一个 CWE-434 漏洞类型的样本。
- Problem:一个描述中等复杂度编程问题的说明,需解决该问题。
- Insecure Code:展示指定漏洞的不安全代码示例。
- Secure Code:解决指定漏洞的安全代码示例。
- Test:一组测试用例,用于验证代码的功能正确性和安全性,封装在名为“check”的函数中。
- Entry_Point:需实现的函数名称。
基于所处理漏洞的特征和使用的资源,CodeSecEval 进一步划分为以下两个不同的子集:
-
SecEvalBase:该子集使用 SecurityEval 数据集构建,SecurityEval 聚合了来自四个外部来源的实例。原始 SecurityEval 数据集并未包含“Secure Code”、“Test”和“Entry_Point”的注释,其“不安全代码”实例通常不完整,需要额外的上下文,如辅助函数或特定配置,以确保功能的完整性。因此,SecEvalBase 的实例选择基于完成不安全代码的可行性,并为缺