AI编码的隐患:开发者需警惕的LLM助手安全风险

本文深入分析AI代码生成工具在软件开发中的安全风险,涵盖常见漏洞类型、平台配置问题及开发阶段威胁,并提供了包括代码审查和安全提示在内的综合防护方案,帮助开发者安全使用AI编程助手。

易受攻击的AI生成代码

当大型语言模型生成代码时,可能包含错误或安全漏洞。毕竟,这些模型是在互联网公开数据上训练的——包括数千个低质量代码示例。最近一项Veracode研究发现,主流AI模型现在生成的代码编译成功率达到90%,而不到两年前这一数字还不到20%。然而代码安全性并未改善——45%仍包含OWASP Top-10列表中的经典漏洞,过去两年几乎没有变化。该研究覆盖了上百个流行LLM和Java、Python、C#、JavaScript代码片段。

因此,无论LLM是用于Windsurf的"代码补全"还是Loveable的"氛围编码",最终应用都必须经过彻底的漏洞测试。但实践中很少发生:根据Wiz研究,20%的氛围编码应用存在严重漏洞或配置错误。

以女性专属交友应用Tea为例,该应用在两次重大数据泄露后声名狼藉。不过这个应用早于氛围编码时代。虽然Tea的失误是否归咎于AI将由法院判定,但在Enrichlead初创公司案例中,AI确实是罪魁祸首。其创始人在社交媒体上吹嘘平台代码100%由Cursor AI编写,“零手写代码”。上线仅几天后,就被发现充满新手级安全漏洞——允许任何人访问付费功能或修改数据。在创始人未能使用Cursor将代码提升到可接受安全标准后,项目被关闭。但他并未气馁,随后开始了新的基于氛围编码的项目。

AI生成代码中的常见漏洞

尽管AI辅助编程仅存在一两年,但已有足够数据识别其最常见错误:

  • 缺乏输入验证:未清理用户输入中的额外字符,导致XSS和SQL注入等经典漏洞
  • 硬编码密钥:API密钥和其他密钥直接硬编码到网页中,在代码中对用户可见
  • 客户端认证:认证逻辑完全在客户端实现,在浏览器中运行的网站代码中,可轻易修改绕过检查
  • 日志错误:从写入日志时过滤不足,到完全缺少日志记录
  • 危险函数:AI模型优化以最短方式输出代码解决问题,但最短方式通常不安全。教科书示例如对用户输入使用eval函数进行数学运算,这为生成应用中任意代码执行打开了大门
  • 过时依赖:AI生成代码常引用旧版库、进行过时或不安全API调用,甚至尝试导入虚构库。后者特别危险,因为攻击者可创建具有"合理"名称的恶意库,AI代理会将其包含在实际项目中

在系统研究中,作者扫描了AI生成代码中MITRE CWE Top 25列表包含的弱点。最常见问题包括CWE-94(代码注入)、CWE-78(操作系统命令注入)、CWE-190(整数溢出)、CWE-306(缺少认证)和CWE-434(无限制文件上传)。

CWE-94的显著案例是最近Nx平台入侵事件,攻击者通过窃取可发布新产品版本的令牌,成功对流行开发工具进行木马化。令牌窃取利用了简单AI生成代码片段引入的漏洞。

危险提示

开发者中著名的"完全按照规范完成"说法也适用于AI助手工作。如果创建函数或应用的提示模糊且未提及安全方面,生成易受攻击代码的可能性急剧上升。专门研究发现,即使像"确保代码遵循安全代码最佳实践"这样的一般备注,也能将漏洞率降低一半。

然而最有效方法是使用详细、特定语言的安全指导,引用MITRE或OWASP错误列表。Wiz Research的大量此类安全指令可在GitHub上获取;建议通过claude.md、.windsurfrules或类似文件将其添加到AI助手的系统提示中。

修订期间的安全性退化

当AI生成代码通过后续提示反复修订时,其安全性会恶化。最近研究让GPT-4o修改先前编写代码达40次,研究人员每轮后扫描每个版本的漏洞。仅五次迭代后,代码包含的关键漏洞比初始版本多37%。研究测试了四种提示策略——其中三种各有不同侧重点:(i)性能、(ii)安全性、(iii)新功能;第四种用不清晰提示编写。

当提示专注于添加新功能时,出现158个漏洞——包括29个关键漏洞。当提示强调安全编码时,数量显著下降——但仍包括38个新漏洞,其中7个为关键漏洞。

有趣的是,“注重安全"的提示导致加密相关功能中错误百分比最高。

忽略行业背景

在金融、医疗和物流等行业,应用开发期间必须考虑技术、组织和法律要求。AI助手不知道这些约束,此问题常被称为"缺少深度”。因此,当地或行业法规规定的个人、医疗和财务数据存储和处理方法不会反映在AI生成代码中。例如,助手可能编写数学上正确的计算存款利息函数,但忽略监管机构强制执行的舍入规则。医疗数据法规通常要求详细记录每次访问尝试——AI不会自动在适当详细级别实现。

应用配置错误

漏洞不仅限于氛围代码本身。通过氛围编码创建的应用通常由缺乏经验的用户构建,他们要么根本不配置运行时环境,要么根据同一AI的建议配置,导致危险错误配置:

  • 应用所需数据库创建时具有过宽的外部访问权限,导致如Tea/Sapphos的泄露,攻击者甚至不需要使用应用即可下载或删除整个数据库
  • 内部企业应用在无认证情况下公开可访问
  • 应用被授予访问关键数据库的提升权限,结合AI生成代码漏洞,简化了SQL注入和类似攻击

平台漏洞

大多数氛围编码平台直接在自有服务器上运行从提示生成的应用程序。这将开发人员绑定到平台——包括暴露于其漏洞和依赖其安全实践。例如,7月在Base44平台发现的漏洞允许未经认证的攻击者访问任何私有应用。

开发阶段威胁

开发者计算机上具有广泛访问权限的助手本身就存在风险:

  • CurXecute漏洞允许攻击者命令流行AI开发工具Cursor在开发者机器上执行任意命令
  • EscapeRoute漏洞允许在开发者磁盘上读写任意文件
  • 恶意MCP服务器让AI代理通过Postmark发送和接收电子邮件,同时将所有通信转发到隐藏地址
  • Gemini命令行界面中的漏洞在开发者简单要求AI助手分析新项目代码时允许任意命令执行
  • Amazon的Q Developer扩展短暂包含清除开发者计算机所有数据的指令
  • Claude Code代理漏洞允许通过DNS请求从开发者计算机渗出数据
  • 自主AI代理Replit删除了正在开发项目的主数据库,因为它认为数据库需要清理
  • 源代码注释中的提示注入促使Windsurf开发环境自动将恶意指令存储在其长期记忆中,允许其数月内从系统窃取数据
  • 在Nx入侵事件中,使用Claude、Gemini和Q的命令行工具搜索可从受感染系统窃取的密码和密钥

如何安全使用AI生成代码

通过组织和技术措施组合,可显著降低AI生成代码的风险水平:

  • 使用优化SAST工具在编写时自动审查AI生成代码
  • 将所有AI环境的系统提示中嵌入安全要求
  • 由经验丰富的人类专家执行详细代码审查,辅以专业AI驱动安全分析工具提高效率
  • 培训开发人员编写安全提示,更广泛地为他们提供AI安全使用的深入教育
comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计