你让 AI 写代码,它推荐的软件其实不存在:黑客用同一个名字放好了病毒
- Slopsquatting 是一种利用 AI 编程助手幻觉出不存在的软件包名、再被攻击者抢注填入恶意代码的新型供应链攻击,2025 年 4 月由 Python 软件基金会安全常驻开发者 Seth Larson 命名。
- 学术研究实测 16 个主流代码生成模型、576,000 个代码样本,发现 19.7% 的推荐包是幻觉,商业模型平均幻觉率 5.2%、开源模型 21.7%,相差约 4 倍。
- 幻觉具有持久性:同一提示词反复问同一模型 10 次,43% 次次都生成同一个假包名,58% 至少重复出现 1 次以上,是可预测、可提前蹲守的稳定目标。
- 已有真实验证:安全研究员抢注一个被多模型反复幻觉出的假包
huggingface-cli,3 个月内被真实下载超 1.5 万次,还被写进阿里巴巴官方项目 GraphTranslator 的安装说明。 - 研究测试的缓解手段中,微调和多方法组合(ensemble)效果最好、能把幻觉率压低约 85%,但微调会让代码生成质量(pass@1)明显下降,安全与能力之间有真实权衡。
拼错名字骗你装错包,这招仓库早就防住了
装一个软件包,本来是开发者每天做几十遍的动作:一行 pip install 或 npm install,从公共仓库把别人写好的代码拉进自己的项目。攻击者很早就盯上了这个动作。
最老的一招叫错别字抢注(typosquatting):注册一个和知名包只差一两个字符的假名字,比如把广受欢迎的 cross-env 注册成 crossenv,赌你手一滑打错、把恶意代码装进来。这套路存在了几十年,PyPI、npm 这些中心化仓库早就建了防护名单来拦它。crossenv 这种和 cross-env 只差一个连字符的名字,一眼就能看出像手滑,仓库直接拦下。
跟有人抢注 faceboook.com(多打一个 o)来蹭你输错网址的流量,是同一个套路。看着眼熟,其实是李鬼。仓库的黑名单,就是专门盯这种一眼像打错字的假名。
AI 一张嘴就编出以假乱真的包名,旧防线根本认不出来
AI 编程助手改变了这个威胁模型。它为了给出统计上最像样的答案,会一本正经地编出一个根本不存在的包名,听起来又特别合理。攻击者只要摸清某个模型爱编哪些假名,抢先在仓库里注册同名的恶意包就行。这就是 slopsquatting。
Slopsquatting 由 AI slop(AI 生成的垃圾内容)加 typosquatting(错别字抢注)拼成,2025 年 4 月由 Python 软件基金会(PSF)安全常驻开发者 Seth Larson 提出,经 Ecosyste.ms 创建者 Andrew Nesbitt 发到 Mastodon 后传开。它属于包混淆攻击(package confusion attack)这一大类,泛指所有靠骗开发者装错包来搞破坏的手法,错别字抢注和蹭 AI 幻觉都是它下面的具体打法。
关键在于,AI 编的假名不是简单错别字,仓库现有的防护名单完全认不出来。同一套黑名单,对老套路和新套路给出的是两种结果:
crossenv 和 cross-env 只差一个连字符,字符距离极小,一眼像手滑打错。仓库黑名单直接命中,拦截。
cross-env-extended、mpn install cross-env file 听着像正经的扩展包,却和任何真实包都不完全对应。黑名单认不出,放行混入。
更麻烦的是,把生成的包名拿去和已知包名单做交叉比对这种笨办法也不管用:攻击者可能早就把幻觉包注册进了仓库,用来比对的名单本身就被污染了。
已经真实发生过:一个空包被下载了 1.5 万次
这不是纸上谈兵。2023 年底到 2024 年初,安全公司 Lasso Security 的研究员 Bar Lanyado 做了一次验证:他发现好几个大模型都反复幻觉出同一个不存在的 Python 包 huggingface-cli,于是真的去 PyPI 把这个名字注册了,包里是空的、没有任何恶意代码,纯做实验。
huggingface-cli包是空的都能三个月骗来上万次下载,还进了大公司的官方文档。要是包里装的是恶意代码,感染早就顺着依赖链铺开了。(来源:The Register 2024-03-28)
为什么这些假包名值得攻击者蹲守:AI 会反复编出同一个名字
一次幻觉不可怕,可怕的是同一个模型对同一个问题会反复编出同一个假名。研究团队随机抽了 500 个曾触发幻觉的提示词,每个各问同一个模型 10 次,记录那个假包名被重新生成了几次。
结果是明显的两极分化:43% 的幻觉包名 10 次全部命中,39% 一次都不再出现,58% 至少重复出现 1 次以上。大多数幻觉是稳定、可复现的行为:换个时间、换一次会话再问,同一个假名照样冒出来。对攻击者来说,一个稳定复现的假名就是可以提前蹲守、批量抢注的靶子。
这些假包名长什么样
研究还量了这些假名和真实包名到底有多像,用的是 Levenshtein 距离(编辑距离)。它衡量把一个名字改成另一个最少要动几个字符,距离小说明两个名字长得像、可能是手滑,距离大就是压根不沾边的两个词。
再加上 81% 的独特假名只在 16 个模型里的某一个身上出现,等于每个模型都有自己一套独家幻觉。攻击者盯上哪个模型,就能收割用那个模型的开发者。
模型认得出自己编的假包吗
研究还测了模型能不能识别幻觉包。把真假包名混在一起问模型「这是不是一个有效的 Python 包」,GPT-4 Turbo、GPT-3.5、DeepSeek 三个模型识别自己幻觉的准确率都在 75% 以上。模型对自己的生成模式有一种隐含的自我认知,这一点为后面「让模型自己复核」的缓解手段留了口子。
开源模型的幻觉率是商业模型的 4 倍,但没有谁能幸免
同样是写代码,选哪个模型,踩坑概率差很多。这项研究一共生成了 576,000 个代码样本、220 多万个包引用,整体幻觉率 19.7%。拆开看,商业模型和开源模型差了大约 4 倍。
具体到单个模型,GPT-4 Turbo 幻觉率最低,只有 3.59%;开源里表现最好的 DeepSeek 也要 13.63%。
两个设置也会放大幻觉:温度(temperature,控制随机性的参数)调得越高,幻觉越多,在最高温下开源模型甚至编出的假包比真包还多;即便如此,最高温的 GPT-4(8.9%)仍比 GPT-3.5(31.8%)低近 4 倍。另外,问到训练截止之后才冒出来的新话题时,幻觉率平均比老话题高 10%。对包名准确性敏感的生产环境,选商业模型本身就能把这一层风险压掉一大截。
有办法治,但要在「安全」和「代码质量」之间做权衡
研究团队测了几种缓解手段,把幻觉从「生成后再筛」往「生成前就防」挪,效果一层比一层好。
最基础的是生成后拿真实包名单交叉过滤,但前面说过这招会被攻击者污染名单,属于被动补救。往前一步的两种是生成前干预:RAG(检索增强生成)让模型回答前先查一份真实包清单、把结果塞进提示词再作答,相当于开卷考试先发一张权威参考表;自我复核(self-refinement)则让模型生成完自己判断一遍包名真假,觉得不对就重写,最多重来 5 次。再往上是微调(fine-tuning)和多方法组合(ensemble,把上面几招叠在一起用)。
下面这张图可以切换两个开源模型,看五种手段各把幻觉率压到多少:
微调降幻觉的幅度最大,代价是代码本身的可运行质量跟着掉。用 HumanEval 的 pass@1(模型一次写出的代码能不能真跑通、通过测试,越高越靠谱)来量,DeepSeek 微调后 pass@1 从 51.4% 掉到 25.3%,CodeLlama 从 19.6% 掉到 16.4%。想更安全,就得接受代码能力打折。RAG 和自我复核降幻觉没微调猛,但不怎么伤代码质量,是更平衡的折中。
| 模型 | 原始 pass@1 | 微调后 pass@1 |
|---|---|---|
| DeepSeek | 51.4% | 25.3% |
| CodeLlama | 19.6% | 16.4% |
AI 写的代码越来越多,这个漏洞口子只会越开越大
这条攻击路径的威胁面正在快速变大,因为越来越多代码是 AI 帮着写的。
开源生态本身的安全账也在变差。一项分析了 10 种语言、31,267 个漏洞样本的研究发现,报告漏洞数量以每年 98% 的速度增长,远超软件包总数 25% 的年增速。
更值得盯的是恶意来源占比:这些漏洞报告里,NPM 生态有 49% 来自蓄意上传的恶意包,PyPI 也有 14%。仓库里的坑,相当一部分是有人故意挖的。AI 幻觉包,正好给这类蓄意攻击又开了一扇门。
普通开发者现在就能做的两件事
这套攻击钻的是信任的空子:开发者默认 AI 推荐的包都是真的,装之前不核实。堵这个口子,两件事成本几乎为零。
pip install。再叠一层前面提到的:对包名准确性要求高的场景,选商业模型,或用做过 RAG、微调处理的模型,能把这一层风险再压低一截。
一个持久的幻觉,对想利用这个漏洞的攻击者更有价值,让这条幻觉攻击路径成为一个更可行的威胁。 论文《We Have a Package for You!》,USENIX Security 2025
装错软件包的老骗术升级了:从「赌你手滑打错字」到「等 AI 替你编假名字」
一项覆盖 16 个模型、57.6 万个代码样本的研究:AI 推荐的软件包近两成根本不存在,黑客抢注同名塞进病毒,已真实骗到 1.5 万次下载。
↓ 一页读完 · 有一张会动的攻击闭环图
写程序的人每天都要装「软件包」,别人写好、打包好的一段现成代码,敲一行命令就拉进自己的项目。黑客很早就盯上了这个动作。
最老的一招叫「错别字抢注」(typosquatting):注册一个跟知名包只差一两个字符的假名字,赌你手一滑打错就装错。PyPI、npm 这些公共仓库为它建了几十年的防护名单。
✘ 拦不住 AI 凭空编出、跟真包差得很远的全新假名
老名单只认「长得像打错字」的假名,认不出「听着合理、其实根本不存在」的新名字。
AI 编程助手为了给出「最像样」的答案,会一本正经地编出一个不存在的包名,这叫「幻觉」。黑客只要摸清某个模型爱编哪些假名,抢先在仓库注册同名的包、塞进病毒就行。业内给这招起了个名:slopsquatting。
跟真包只差一个连字符,字符距离极小。黑名单一眼命中,拦下。
听着像正经的扩展包,却跟任何真包都不完全对应。黑名单认不出,放行混入。
更麻烦的是:这假名不是一次性的意外,同一个模型会反复编出同一个,黑客因此能提前蹲守。
研究团队让同一个模型对同一个问题反复问 10 次,结果 43% 的假名次次都被吐出来、58% 至少再现一次,这不是随机噪音,而是能被提前蹲守的稳定靶子。整条攻击链就靠「假名会反复冒出来」转成一个闭环:
幻觉多不多,跟你选哪个模型强相关;而 AI 写的代码越来越多,这个口子只会越开越大。先把「用一个模型写 100 个软件包引用,几个是假的」摆出来看:
幻觉率数字全部出自一项学术论文的实测(arXiv:2406.10279,USENIX Security 2025),1.5 万次下载则是安全公司 Lasso Security 的真实实验,都不是厂商自吹。另有一组「50%–82%」是医学场景的研究,不是同一口径,别混用。
crossenv(假包 · 只少一个连字符)
仓库早防住了
这道防线正要失灵……
可它根本不存在,是 AI 凭空编的
AI 推荐的包近两成是编的
混进去了
能有多大事?
我早占好了
还进了阿里巴巴官方项目的安装说明
搜一眼这包真不真
- × 别拿到名字就直接装
- × 别只信「AI 推荐的就该真」