代码模型会以可预测的方式幻觉出不存在的包名(19.7% 的代码,且其中 43% 的名字反复出现),这让攻击者能抢先用恶意载荷注册它们。防御之道:在安装之前,验证每一个 AI 建议的包确实存在且合法。
想象一下,你让一位助手去五金店帮你买一颗螺丝,而它不但没有承认自己不知道该买哪种,反而编造出一个听起来无比可信的品牌名:「Kraften M8 螺丝」。你毫不怀疑地跑去询问。结果发现,早就有人精准预判了这个编造,用这个名字开了一家店,还在盒子里塞满了炸药。把这一幕搬到软件世界,从 2025 年起它就有了名字:slopsquatting。你的 AI 编造出一个不存在的库,而攻击者抢在你之前注册它,往里面塞进恶意代码。这是辅助编程时代带来的最优雅、最悄无声息的供应链攻击手法,而你团队里几乎没人知道它的存在。
幻觉不再是笑话,它变成了攻击面
多年来我们把 AI 的幻觉当成一则有趣的轶事:模型编造了一句引言、一个数据、一个日期。恼人,却无害。可一旦落到代码上,幻觉的性质就变了。当一个模型写下 `import requestz` 而不是 `requests`,或者编造出一个从未存在过的 `pandas-utils-pro`,它不是在讲笑话:它是在签一张别人可以兑现的支票。因为不同于一句假引言,一个包名是一个地址。而地址是可以被人占据的。当幻觉在 npm 或 PyPI 上拥有了一个可注册的通讯地址那一天,它就不再是一个风格错误,而变成了一扇门。
硬数据:将近每 5 段代码就有 1 段推荐了幽灵包
一项在 USENIX Security 2025 上发表的研究,以工业规模量化了这一点:来自 16 个不同模型生成的 223 万份代码样本。结果是你应该贴在显示器上的那种:19.7% 的样本中至少包含一个被幻觉出来的包——一个根本不存在的包。而不同模型家族之间的偏差是惊人的:开源模型编造包的比例高达 21.7%,而商业模型只有 5.2%。翻译过来:模型每向你递出一个依赖,将近五次里就有一次递给你的是一个不存在的。再乘以每天在「AI 写的,那肯定存在」这种盲目信任下执行的数百万次 `pip install` 和 `npm install`,你就得到了这个攻击面。
真正危险的不是它会编造:而是它总是编造同一个
如果幻觉是随机噪声,这个攻击就不可行:攻击者得随机注册数百万个名字才能碰对一个。让这件事变成真实威胁的,是另一个发现:43% 被幻觉出来的名字会在所有运行中反复出现。这不是噪声,这是一个签名。面对相同的提示,模型倾向于一次又一次地编造出同一个假名。这对攻击者来说是金矿:他只需要观察模型编造什么,留下那些反复出现的名字,用恶意载荷把它们注册下来,然后等待。他不需要黑进任何东西。是你亲手替他布好了陷阱,而你自己的 agent 用你构建流程的权限把它装了进来。来自 Python Software Foundation 的 Seth Larson 给这个模式起了名字:slopsquatting——typosquatting 的表亲,只不过这次犯错的不是你的手指,而是你的模型。
为什么用 agent 编程会放大风险,而不是遏制它
一个人类开发者看到建议里出现 `import fastapi-turbo`,通常会挑一下眉:「这玩意存在吗?」一个自主 agent 不会挑眉。你对它说「让它跑起来」,它撞上一个失败的 import,而它被训练出的本能就是解决问题:执行 `install`,如果这个包存在(因为攻击者注册了它),它就毫无阻力地装上、继续往下走。让 agent 编程如此神奇的那个循环——尝试、失败、修正、继续——恰恰就是跨过唯一那道保护我们的屏障:人类的怀疑。agent 越自主,幻觉与 `install` 之间的眼睛就越少。没有验证的自主不是速度,而是关着大灯冲向悬崖的速度。
教训:在 AI 时代,对一个名字的信任是一个安全决策
你可以带走并分享的思维框架是这样的:AI 建议的一个包名不是一个事实,而是一个假设。而任何一个将要用你构建流程权限去执行代码的假设,都值得在执行之前——而不是之后——被验证。具体的行动可以浓缩成一句话:在安装任何模型建议的依赖之前,先确认这个包确实存在、确实是你以为的那个、并且不是上周才诞生、毫无历史的。一个带固定哈希的 lockfile、一份依赖 allowlist,再加上两秒钟瞄一眼「这个包有年头有下载量,还是周二才冒出来的?」,就能彻底瓦解这个攻击。你不需要一道 AI 防火墙:你需要的是不再把模型的输出当成圣旨。顺便说一句,这正是把 demo 和产品区分开来的那种纪律——我们在「27% 的数学」里聊过这件事。
我们怎么看
在 NeuralOS,我们从一个令人不适的公理出发:AI 是一位才华横溢的合作者,也是一个偶尔说谎的家伙,我们必须同时为这两面来设计。因此我们把安全想成不是最后贴上去的一层,而是整栋建筑赖以建立的地基。这块地基里有些部分已经是实实在在的东西了:密钥在每一条日志里都按值被脱敏,凭证存活在一个按租户加密、永不暴露给模型的 Vault 里。另一些则是已经声明的方向,而非已兑现的承诺:沿着同一条思路,我们创建并免费送出了 Sentinel,一个开源的代码安全守护者,在 bug 抵达生产环境之前就把它逮住。我们没法阻止一个模型幻觉出一个名字——没人能,这是系统的物理规律。但我们确实在一块一块地、并对「哪些已存在、哪些仍在路上」保持诚实地,去筑起那道横在幻觉与你的构建之间的护城河:让 agent 已经不再拥有的那份怀疑,由平台替你一点点保有。因为在不必成为程序员就能用 AI 构建的时代,你的优势不是更快地去信任:而是让验证不再只依赖于你的一片好意。