想象一下,在编程过程中,你乐于助人的人工智能助手让你导入一个名为 securehashlib 的包。它听起来很真实,看起来也很真实。你信任你的这位硅基副驾驶。于是你运行了 pip install securehashlib。
恭喜你。你刚刚为你的软件栈——甚至可能为你公司的基础设施——打开了一个后门。这个包直到昨天才存在,而攻击者是在上周根据人工智能产生的幻觉注册了它。
欢迎来到“幻觉占位”(Slopsquatting)的世界。如今,软件供应链有了些“想象中的朋友”,而它们想要的是你的 root 权限。
1. 友好编程神器的梦想
多年来,我们一直梦想着拥有一个人工智能结对程序员:一位耐心、随时待命的专家,它了解每一个 API、每一种正则表达式语法,以及在 Flask 中编写速率限制器的每一种方法。现在我们拥有了它。像 GPT-4 Turbo、Copilot 和 Cursor 这样的工具正在改变代码的编写方式。正如 Andrej Karpathy 那句著名的称呼 \[1\],“氛围编程”(Vibe coding),让开发者可以描述他们的意图,然后让人工智能完成剩下的工作。
但每个梦想都有其阴暗面。在这种情况下,问题不仅仅是人工智能有时会出错,而是**它会以一种特定的、系统性的、可被武器化的方式出错**。
大语言模型(LLM)不仅仅会产生事实性幻觉,它们还会产生依赖项幻觉——那些听起来应该存在但实际上并不存在的包名、库和模块。而攻击者们正在虎视眈眈。
2. “幻觉占位”(Slopsquatting)的出现
拼写错误抢注(Typosquatting)早已不是什么新闻:用户将 react-router 错输为 react-ruter,而一些有“进取心”的黑客早已抢注了这个拼写错误的名称并植入了恶意负载。“幻觉占位”则有所不同,它不是用户的失误,而是人工智能的幻觉。
这个术语由 Seth Larson 创造,并由 Andrew Nesbitt \[2\] 推广开来,指的是故意注册那些被大语言模型反复提及但不存在的包名。这些幻觉产生的名称会出现在人工智能生成的代码、文档和教程中。如果你复制粘贴了这些代码,或者过于信任依赖项管理器,你就会安装攻击者的恶意负载。
这并非只是理论。一项实验发现,一个名为“huggingface-cli”的幻觉包——在没有任何代码、README 文件或 SEO 优化的情况下上传——在三个月内被下载了超过 30,000 次。\[3\]
3. 研究:一场被量化的危机
在论文《我们为你准备了一个包!》(“We Have a Package for You!”)\[4\] 中,研究人员用超过五十万个提示词测试了 16 种不同的大语言模型。他们发现:
- 19.7% 的建议包名实际上并不存在。
- 开源模型产生幻觉的比例(21.7%)远高于商业模型(5.2%)。
- GPT-4 Turbo 的幻觉率最低(3.59%)。
- CodeLlama 模型的幻觉率超过 33%。
- 观察到了超过 205,000 个独特的幻觉包名。
- 在后续测试中,43% 的幻觉包在每次运行时都会重复出现,58% 的幻觉包在十次运行中重复出现超过一次。
- 8.7% 的幻觉 Python 包实际上是有效的 npm(JavaScript)包。
- 积极的一面是,GPT-4 Turbo 和 DeepSeek 能够在 75% 的情况下**正确识别出它们刚刚生成的幻觉包名**。
在另一项名为《导入幻影》(“Importing phantoms”)\[5\] 的研究中,研究人员测试了不同模型和编程语言中幻觉包的普遍性差异。
他们发现:
- 所有被测试的模型都会产生幻觉包,幻觉率从 0.22% 到 46.15% 不等。
- 编程语言的选择显著影响幻觉率:JavaScript 的平均包幻觉率最低(14.73%),而 Python(23.14%)和 Rust(24.74%)则更高。
- 在同一语言中,模型的选择可能导致幻觉率出现**一个数量级**的差异。
- 较大的模型通常幻觉较少,但**专用于编码的模型可能更容易产生包幻觉**。
4. 为什么“幻觉占位”很重要
这不仅仅是一个小众的学术问题。“幻觉占位”代表了一种**可扩展的、低成本的攻击面**,它利用了现代开发工作流程中的一个关键盲点。攻击者不需要破解你的防火墙,他们只需要预测你的 AI 助手的下一个创造性失误。
以下因素加剧了这个问题:
- 对 AI 工具的信任:许多开发者假设 AI 生成的代码是正确的,而没有去验证包名。
- “氛围编程”的兴起:开发者现在只需描述他们想要什么,然后让 AI 来实现。这意味着他们可能永远不会手动输入或验证所使用的包名。一些工具甚至会自动安装这些包,无需开发者确认。
- 易于利用:任何人都可以在 PyPI 或 npm 等平台上注册一个幻觉包名——无需任何黑客技术。
5. 我们可以做些什么?
研究也带来了一些希望:GPT-4 Turbo 和 DeepSeek 能够以约 75% 的准确率自我检测出幻觉包。这很有前景。但希望并非策略。
A. 实用的第一步:自动化依赖项审计
像 Mend SCA 和 Renovate 这样的工具正是为了解决这个问题。
Mend SCA 会扫描你技术栈中的每一个开源依赖项,标记已知漏洞,并在可疑或恶意包进入生产环境之前向你发出警报。
Renovate 通过自动化版本升级、强制使用锁文件和验证哈希值来安全地保持你的依赖项更新——从而阻止攻击者偷偷植入被投毒的更新或假冒的包。
B. 其他应采取的缓解措施:
- 提示词设计:鼓励开发者明确指定已知的安全库。
- 模型调优:降低“温度”(temperature)可以减少幻觉。控制冗余度(verbosity)也有同样效果。
- 一个很有前景的方向是将应用安全工具直接嵌入到 AI 代码助手中,在幻觉包和其他漏洞进入你的项目之前就将其捕获。这正是 Mend 正在积极探索和开发的——让“设计即安全”的 AI 编码成为现实。
6. 结论与思考
有一个名为 arangodb 的良性 RubyGem 包,它的描述写道:“不要使用这个!这可能是一个恶意 gem,因为你没有检查 ChatGPT 为你编写的代码所引用的 gem 是否真实存在。” 在撰写本文时,它已被安装了 2000 多次。这段描述听起来既像是一个警告,也像是一篇悼词。
“幻觉占位”印证了一个更广泛的真理:当我们把越来越多的认知劳动委托给机器时,我们继承的不仅是它们的生产力,还有它们的易错性。这是一个早期预警信号,表明人工智能生成的软件带来的**不仅仅是生产力的提升**,还有新的攻击面。
我们面临的挑战不是要抑制我们机器的想象力,而是要确保它们的梦想不会成为我们的噩梦。
信任,但别忘了 pip freeze。