想象一下你正在盖一座房子,但你不是使用砖块和砂浆,而是使用代码来自动组装你的墙壁、窗户和安防系统。这被称为基础设施即代码 (Infrastructure as Code, IaC)。这就像是有一个机器人为你构建数字基础设施。
问题在于,如果你给机器人的蓝图不好,它可能会盖出一座门没锁、窗户对着街道、或者保险箱钥匙就贴在门前的房子。这些错误被称为**“安全异味” (security smells)**。
这篇论文的作者提出了一个重大问题:我们能否信任 AI 聊天机器人(如 GPT-4o 和 Gemini)来帮助我们安全地编写这些蓝图,或者在其中发现错误?
以下是他们的研究结果,通过简单的故事进行了解析:
1. “找错”测试(检测)
研究人员给 AI 两类任务:在短代码片段(如 Stack Overflow 上的代码)中寻找错误,以及在完整的、真实的工程文件(来自 GitHub)中寻找错误。
- “模糊请求”场景: 想象一下你问一名保安:“看看这栋房子,告诉我它是否安全。”
- 结果: AI 在识别短代码片段中的明显问题时表现尚可(成功率约为 70-80%)。但当观察完整且复杂的工程项目时,AI 会漏掉一半以上的危险缺陷。这就像保安只注意到了没锁的前门,却忽略了破碎的后窗。
- “分步执行”场景: 研究人员随后给了 AI 一个具体的清单:“第一,检查锁;第二,检查窗户;第三,寻找前任房主留下的便条。”
- 结果: 这种方法效果好得多。AI 发现错误的能力显著提升(其中一个模型的成功率接近 90%)。
- 症结所在: 即使 AI 发现了错误,它也很少提供具体的修复方案。这就像保安说:“嘿,那个窗户坏了,”但并没有递给你用来更换玻璃的工具。
2. “建造”测试(生成)
接下来,他们要求 AI 根据特定的需求从零开始创建新的蓝图,其中一些需求被设计用来诱导 AI 犯错(例如,“使用一把弱锁”或“把密码留在代码里”)。
- 结果: 这是 AI 最吃力的地方。
- 当被要求建造一座安全的房子时,AI 仅在 7% 的情况下建造了安全的房子。
- 在另外 93% 的案例中,它建造的房子带有隐藏的陷阱(安全缺陷),并且通常甚至不会提醒你这些陷阱的存在。
- 即使研究人员明确大声强调“要确保安全!”,AI 在约 80% 的情况下仍然会建造不安全的房子。
3. “模仿效应”
研究人员还检查了 AI 是否只是在模仿它之前见过的错误范例。他们发现,AI 生成的代码往往看起来更像其他 AI 生成的代码,而不是人类编写的论坛中的“正确”答案。这就像是 AI 并不是向专家学习,而是向一群都在犯同样错误的群体学习。
总结
论文的结论是,虽然 AI 是一个强大的工具,但你目前不能仅依靠它来保证你的数字基础设施安全。
- 对于发现错误: 它确实有帮助,但前提是你必须给它非常具体、循序渐进的指令。如果没有这些引导,它会错过太多危险。
- 对于编写代码: 让它从头开始编写安全代码目前风险过高。它经常盖出“门没锁”的房子,而且甚至不会提醒你。
类比: 把 AI 想象成一个速度极快、极其自信的学徒建筑师。如果你对它说“修理这个”,它可能会发现一些裂缝。但如果你要求它“建造一座堡垒”,它很可能会造出一个用纸做的锁和纸板做的城堡,而且它甚至不会告诉你这其实并不安全。你仍然需要人类专家来复核一切。
技术摘要:开发者能否依赖 LLM 进行安全的 IaC 开发?
问题陈述
基础设施即代码(IaC)对于自动化基础设施管理至关重要,但经常受到“安全异味”(security smells)的困扰——这些是表明存在不良安全实践的重复模式,例如硬编码密钥、弱加密算法和无效的 IP 绑定。尽管已存在专门的工具(如 SLIC、SLAC)来检测这些问题,但其采用率仍然较低。与此同时,开发者正越来越多地采用大语言模型(LLM)进行编码辅助。本研究旨在解决一个关键差距:缺乏关于专有 LLM(特别是 GPT-4o 和 Gemini 2.0 Flash)在有效检测现有 IaC 脚本中的安全异味以及从零开始生成安全 IaC 方面的能力实证证据。作者强调了一个特定的风险,即 LLM 可能会生成功能性代码,但却在未发出警告的情况下,无意中包含了严重的漏洞(例如,硬编码密码、不带 TLS 的 HTTP),这可能会给开发者带来一种虚假的安全感。
研究方法
本研究采用了两阶段的实证方法,涉及两个不同的数据集:Stack Overflow (SO) 代码片段和真实的 GitHub 仓库。
1. 数据集与范围
- 工具: 研究重点关注 Ansible(命令式)和 Puppet(声明式),这是最广泛使用的 IaC 工具。
- 安全异味: 评估针对九种特定的安全异味(S1–S9),包括硬编码密钥、空密码、弱加密(SHA1/MD5)、默认管理员配置、不带 TLS 的 HTTP、缺失完整性检查、无效 IP 绑定(0.0.0.0)、可疑注释以及缺失默认情况语句(default case statements)。
- Stack Overflow 研究:
- 数据: 通过关键词搜索(如“password”、“HTTP”、“TODO”)过滤了 2,569 个带有 Ansible 或 Puppet 标签的 SO 帖子。
- 地面真值(Ground Truth): 两名研究人员手动审查了代码片段,识别出 169 个不安全示例。评分者间信度很高(Cohen's kappa = 0.93)。
- GitHub 研究:
- 数据: 从最先进的文献复现包和直接 GitHub 搜索中收集了共计 21,757 个文件。
- 采样: 手动对 430 个文件(302 个来自文献,128 个来自搜索)的代表性子集进行了分类,揭示了 341 个具有安全异味的实例。
- 合成场景: 基于这 341 个不安全模式,设计了 89 个独特的合成场景,用于测试代码生成能力。
2. 实验设计
研究在两种提示条件下评估 LLM:
- 通用提示(General Prompt): 一个标准的请求,要求模型从安全角度分析代码(例如,“作为一名安全专家,请分析代码……”)。
- 引导提示(Guided Prompt): 一种结构化的、分步骤的指令,要求模型识别工具、列出异味、精确审查代码/注释,并以特定的 CSV 格式输出结果。这旨在减少冗余和幻觉。
评估任务:
- 检测: 评估模型识别所提供代码片段中现有安全异味的能力。
- 修复建议: 分析模型是提供可操作的代码修复,还是仅提供通用的建议。
- 生成: 使用 89 个合成场景提示模型生成 IaC 脚本,衡量安全输出的比例以及针对不安全模式发出警告的频率。
关键结果
安全异味检测
- Stack Overflow(小型代码片段):
- 通用提示: GPT-4o 检测到了 80% 的异味;Gemini 检测到了 71%。
- 引导提示: 性能提升至 88% (GPT-4o) 和 78% (Gemini)。
- GitHub(真实世界项目):
- 通用提示: 性能显著下降。GPT-4o 仅检测到 42%,Gemini 检测到 51% 的异味。
- 引导提示: GPT-4o 的 F1 分数从 58% 上升到 89%;Gemini 的 F1 分数从 66% 上升到 74%。
- 观察: 对于 Puppet(声明式)的检测率始终高于 Ansible(命令式/基于 YAML),这可能是由于 Puppet 严谨的结构有助于模式识别。
- 特定异味: 即使使用引导提示,“可疑注释”(S8)的检测也特别具有挑战性,而“不带 TLS 的 HTTP”(S5)则更容易被检测到。
安全代码生成
- 基准性能: 当在没有明确安全约束的情况下,提示模型为易产生漏洞的场景生成代码时,仅有 7% 的生成的脚本是完全安全的。
- GPT-4o 有 75% 的输出和 Gemini 有 56% 的输出包含安全异味,且未发出任何警告。
- 显式安全指令: 即使明确提示“生成安全代码”:
- GPT-4o 仅有 17% 的输出是完全安全的,Gemini 仅有 8%。
- 很大一部分(GPT-4o 为 44%,Gemini 为 34%)仍然包含安全异味,且没有任何随附的警告。
- 修复建议: 虽然模型经常提供通用建议(93–96%),但它们很少提供明确的代码修复(GPT-4o: 15%, Gemini: 5%)。
意义与主张
论文声称,虽然 LLM 在检测 IaC 中的安全异味方面表现出潜力(特别是在受结构化提示引导时),但它们目前无法被可靠地作为安全 IaC 开发的独立工具。
- 提示敏感性: LLM 的有效性高度依赖于提示工程。通用提示往往无法检测出复杂、真实世界仓库中的一半以上的安全问题。
- 生成风险: 最关键的发现是安全代码生成的失败率极高。模型经常生成不安全的代码,却不标记这些漏洞,即使在被明确要求要保证安全时也是如此。这表明存在开发者接收到“虚假安全感”的风险。
- 上下文局限性: 与 Puppet 的声明式严谨性相比,LLM 在处理 Ansible 的灵活性方面更为困难,并且在处理简化片段(SO)时比处理大规模项目脚本(GitHub)的表现更好。
作者得出结论,需要进一步的研究来提高 LLM 在该领域的处理能力。他们强调,开发者不应仅仅依赖 LLM 来进行安全保障,且研究界必须开发更好的提示策略和工具来减轻这些风险。作者已发布了包括 89 个合成场景在内的复现包,以促进未来的研究。
每周获取最佳 computer science 论文。
受到斯坦福、剑桥和法国科学院研究人员的信赖。
请查收邮箱确认订阅。
出了点问题,再试一次?
无垃圾邮件,随时退订。