大模型的幻觉给AI编程带来安全威胁
CBISMB
责任编辑:邹大斌
ISMB
时间:2025-04-15 08:57
大模型 幻觉 AI编程助手 AI LLM
大型语言模型(LLM)驱动的代码生成工具的兴起正在重塑开发者编写软件的方式——同时在这个过程中引入了新的软件供应链风险。
这些 AI 编程助手,就像大型语言模型一样,也会出现“幻觉”。它们会推荐包含不存在的软件包的代码。
安全和学术研究人员发现,AI 代码助手会编造包名。在最近的一项研究中,研究人员发现,商业模型建议的软件包中约有 5.2% 不存在,而开源或公开可用模型的这一比例为 21.7%。
运行这些代码时,导入不存在的包应该会导致错误。但不法分子意识到,他们可以利用这种幻觉来谋取私利。
他们所要做的就是创建一个恶意软件包,使用幻觉出的包名,然后将这个恶意包上传到 PyPI 或 npm 等软件包注册表或索引中进行分发。此后,当 AI 编程助手再次幻觉出这个被利用的包名时,安装依赖项并执行代码的过程就会运行恶意软件。
这种重复出现的情况似乎呈现出双峰模式——一些幻觉出的包名在重新运行提示时会反复出现,而另一些则完全消失——这表明某些提示可靠地产生了相同的幽灵包。
正如安全公司 Socket 最近指出的,去年研究这一问题的学术研究人员发现,重复运行相同的幻觉触发提示十次,结果是 43% 的幻觉包每次都重复出现,而 39% 的幻觉包则再也没有出现。
利用幻觉出的包名是一种“typosquatting”(利用拼写错误进行域名抢注)的形式,即利用常见术语的变体或拼写错误来欺骗人们。
“我们正处于从生态系统层面看待这一问题的非常早期阶段。”Larson说,“如果没有 LLM 提供商提供更多的透明度,很难甚至可能无法量化因 LLM 幻觉而发生的尝试安装次数。使用 LLM 生成的代码、包和信息的用户应该在将这些信息投入使用之前,将 LLM 的输出与现实进行双重检查,否则可能会产生现实世界的后果。”
Larson 表示,开发者尝试安装不存在的包可能有多种原因,包括拼写错误、错误地安装内部包而没有检查这些名称是否已在公共索引中存在(依赖混淆)、包名和模块名不一致,等等。
“我们正在见证开发者编写代码方式的真正转变。”安全公司 Socket 的首席执行官 Feross Aboukhadijeh说,“随着 AI 工具成为许多人的默认助手,‘氛围编码’(vibe coding)不断发生。开发者提示 AI,复制建议,然后继续。或者更糟的是,AI 代理自行安装推荐的包。”
“问题是,这些建议的代码往往包括听起来真实但不存在的幻觉包名。我亲眼见过这种情况。你将其粘贴到终端中,安装失败——或者更糟的是,它没有失败,因为有人正好占用了那个确切的包名。”
Aboukhadijeh 表示,这些虚假的包看起来可能非常真实。
“当我们进行调查时,有时会发现看起来很真实的 README 文件、虚假的 GitHub 仓库,甚至是可疑的博客,这些都让这个包看起来很真实。”他说,并补充说 Socket 的安全扫描会发现这些包,因为它们分析代码的工作方式。
“更糟糕的是,当你在谷歌上搜索这些被滥用的包名时,你经常会得到谷歌自己生成的 AI 摘要,自信地赞扬这个包,说它有用、稳定、维护良好。但它只是鹦鹉学舌地重复包自己的 README,没有任何怀疑,没有任何背景。对于急于求成的开发者来说,它给人一种虚假的合法性。”
“我们生活在一个什么样的世界啊:AI 幻觉出的包被另一个过于乐于助人的 AI 验证并盖章认可。”
Aboukhadijeh 指出,在今年 1 月,谷歌的 AI 概述(它用 AI 生成的文本回答搜索查询)建议了一个恶意的 npm 包 @async-mutex/mutex,这个包是利用拼写错误来假冒合法的 async-mutex 包的。
他还提到,最近一个使用名字“_Iain”的威胁行为者在一个暗网论坛上发布了一份剧本,详细说明如何使用恶意的 npm 包构建基于区块链的僵尸网络。
Aboukhadijeh 解释说,_Iain“自动化地创建了数千个拼写错误的包(许多针对加密货币库),甚至使用 ChatGPT 大规模生成听起来真实的实际包名变体。他分享了视频教程,指导他人如何发布这些包,以及如何通过图形用户界面在受感染的机器上完成任务。这是攻击者利用 AI 加速软件供应链攻击的一个明显例子。”
Larson 表示,Python 软件基金会一直在努力减少包滥用,他补充说,这样的工作需要时间和资源。
“Alpha-Omega 赞助了我们的 PyPI 安全与安全工程师 Mike Fiedler 的工作,以减少 PyPI 上恶意软件的风险,例如通过实施一个报告恶意软件的程序化 API,与现有的恶意软件报告团队合作,以及为顶级项目实施更好的拼写错误抢注检测。”他说。“PyPI 的用户和包管理器的用户应该检查他们正在安装的包是一个现有的知名包,名称中没有拼写错误,并且在安装之前已经审查了包的内容。更好的是,组织可以在自己的组织内镜像 PyPI 的一个子集,从而对哪些包可供开发者使用拥有更大的控制权。”