理解AI生成代码的安全风险
作者:Andrew Stiefel, Endor Labs
AI编码助手正在改变开发者的游戏规则。它们为繁忙的工程团队提供速度、便利性以及填补知识空白的方式。仅需几行自然语言,开发者就能生成完整的功能、脚本或配置——通常比从头编写更快。
但对开发者方便的工具可能悄悄为安全团队制造混乱。
最近一项研究发现,即使开发者使用最新的基础AI模型,62%的AI生成代码解决方案仍包含设计缺陷或已知安全漏洞。根本问题在于AI编码助手本质上不理解应用程序的风险模型、内部标准或威胁态势。这种脱节引入了系统性风险——不仅是不安全的代码行,还包括逻辑缺陷、缺失的控制措施以及不一致的模式,这些都会随着时间的推移侵蚀信任和安全性。
理解AI编码助手如何引入风险是治理其安全使用的第一步。
风险一:训练数据中不安全模式的重复
当今的基础大语言模型(LLM)在庞大的开源代码生态系统中进行训练,通过模式匹配进行学习。如果训练集中频繁出现不安全模式(例如字符串拼接的SQL查询),助手就会轻易产生这种模式。(确实如此——SQL注入是漏洞的主要原因之一)。
因此,如果开发者要求助手“按ID查询用户表”,模型可能会返回一个教科书式的SQL注入缺陷,因为该模式在GitHub仓库中出现了数千次:
|
|
风险二:忽略安全上下文的优化捷径
当提示模糊时,LLM会优化为通过结果的最短路径,即使这意味着使用过于强大或危险的函数。模型没有被激励进行安全推理——它因解决任务而受到奖励。这通常会导致有效的捷径,但会打开关键的安全问题。
以评估用户提供的数学表达式为例。模型可能会快速响应eval(expression)
,因为这一行代码解决了问题。但它也为远程代码执行打开了大门。
风险三:必要安全控制的遗漏
类似地,许多漏洞不是开发者(或AI助手)编写“坏代码”的结果。它们来自缺失的保护措施,如验证步骤、访问检查或输出编码,这些有助于防止常见弱点。AI可能会无意中遗漏防护措施,因为它不了解代码背后的风险模型。
API端点尤其棘手,因为它们接受用户输入。AI编码助手会提供一个接受输入而不验证、清理或授权负载的端点,仅仅因为提示从未说过需要这样做。
风险四:引入微妙的逻辑错误
当然,一些最危险的AI生成缺陷根本不像缺陷。它们出现在逻辑、边缘案例和业务上下文之间的裂缝中。它们也更难发现,因为代码看起来正确,甚至可能通过一些基本检查。
根据调优方式,AI编码助手可能或多或少偏向新颖响应。这可以改进输出,但也意味着它们在提供建议时更可能重写代码。例如,AI助手可能会交换一个检查用户角色的函数,使用if user.role == "admin"
而不是if "admin" in user.roles
。代码对单角色用户有效,但当用户有多个角色时会失败,导致某些工作流中的过度许可访问。
如何保持领先
AI编码助手功能强大,但它们不是安全工具。安全使用它们的最佳方法是通过正确的制衡来增强开发流程:
- 培训开发者安全提示。提示现在是代码设计规范。教导开发者不仅如何使用AI编码助手,还包括如何具体指导它们。
- 更早集成安全反馈。等到拉取请求或CI流水线就太晚了,因此与开发者合作,使用MCP服务器为AI编码助手提供安全洞察。
- 支持安全代码审查。人工审查仍然是最重要的检查,但随着审查增加,疲劳也会增加。考虑增强安全代码审查的方法。
AI编码助手通过将不受信任的代码引入环境,改变了漏洞进入代码库的方式。安全和工程团队必须合作,更早地捕获风险。
延伸阅读
- 《LLM生成代码的安全与质量:多语言、多模型分析》
- 《LLM安全代码生成的综合研究》
- 《我们能信任大语言模型生成的代码吗?跨多样LLM的上下文学习、安全模式和代码评估框架》
- 《人工智能生成代码有害:安全高质量代码生成的路线图》
- 《深入探讨大语言模型代码生成错误:什么和为什么?》