研究解读 · 小互解读

你让 AI 写代码,它推荐的软件其实不存在:黑客用同一个名字放好了病毒

57.6 万样本、16 个模型实测:19.7% 的 AI 推荐包是幻觉,43% 会反复生成同一假名。
速览
  • 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)明显下降,安全与能力之间有真实权衡。
1老问题

拼错名字骗你装错包,这招仓库早就防住了

装一个软件包,本来是开发者每天做几十遍的动作:一行 pip installnpm install,从公共仓库把别人写好的代码拉进自己的项目。攻击者很早就盯上了这个动作。

最老的一招叫错别字抢注(typosquatting):注册一个和知名包只差一两个字符的假名字,比如把广受欢迎的 cross-env 注册成 crossenv,赌你手一滑打错、把恶意代码装进来。这套路存在了几十年,PyPI、npm 这些中心化仓库早就建了防护名单来拦它。crossenv 这种和 cross-env 只差一个连字符的名字,一眼就能看出像手滑,仓库直接拦下。

打个比方

跟有人抢注 faceboook.com(多打一个 o)来蹭你输错网址的流量,是同一个套路。看着眼熟,其实是李鬼。仓库的黑名单,就是专门盯这种一眼像打错字的假名。

2新威胁

AI 一张嘴就编出以假乱真的包名,旧防线根本认不出来

AI 编程助手改变了这个威胁模型。它为了给出统计上最像样的答案,会一本正经地编出一个根本不存在的包名,听起来又特别合理。攻击者只要摸清某个模型爱编哪些假名,抢先在仓库里注册同名的恶意包就行。这就是 slopsquatting。

术语

Slopsquatting 由 AI slop(AI 生成的垃圾内容)加 typosquatting(错别字抢注)拼成,2025 年 4 月由 Python 软件基金会(PSF)安全常驻开发者 Seth Larson 提出,经 Ecosyste.ms 创建者 Andrew Nesbitt 发到 Mastodon 后传开。它属于包混淆攻击(package confusion attack)这一大类,泛指所有靠骗开发者装错包来搞破坏的手法,错别字抢注和蹭 AI 幻觉都是它下面的具体打法。

关键在于,AI 编的假名不是简单错别字,仓库现有的防护名单完全认不出来。同一套黑名单,对老套路和新套路给出的是两种结果:

旧套路 · 错别字抢注

crossenvcross-env 只差一个连字符,字符距离极小,一眼像手滑打错。仓库黑名单直接命中,拦截。

新套路 · AI 幻觉抢注

cross-env-extendedmpn install cross-env file 听着像正经的扩展包,却和任何真实包都不完全对应。黑名单认不出,放行混入。

更麻烦的是,把生成的包名拿去和已知包名单做交叉比对这种笨办法也不管用:攻击者可能早就把幻觉包注册进了仓库,用来比对的名单本身就被污染了。

3真实案例

已经真实发生过:一个空包被下载了 1.5 万次

这不是纸上谈兵。2023 年底到 2024 年初,安全公司 Lasso Security 的研究员 Bar Lanyado 做了一次验证:他发现好几个大模型都反复幻觉出同一个不存在的 Python 包 huggingface-cli,于是真的去 PyPI 把这个名字注册了,包里是空的、没有任何恶意代码,纯做实验。

2023.12 – 2024.02
研究员发现多个大模型反复推荐同一个不存在的包 huggingface-cli
抢注
在 PyPI 上注册这个空壳包,不放任何恶意代码,只为验证会不会有人真的装
3 个月内
这个空包被真实下载 超过 15,000 次
混进大厂
阿里巴巴的开源项目 GraphTranslator 把它写进了官方 README 的安装说明

包是空的都能三个月骗来上万次下载,还进了大公司的官方文档。要是包里装的是恶意代码,感染早就顺着依赖链铺开了。(来源:The Register 2024-03-28)

4核心机制

为什么这些假包名值得攻击者蹲守:AI 会反复编出同一个名字

一次幻觉不可怕,可怕的是同一个模型对同一个问题会反复编出同一个假名。研究团队随机抽了 500 个曾触发幻觉的提示词,每个各问同一个模型 10 次,记录那个假包名被重新生成了几次。

核心机制

结果是明显的两极分化:43% 的幻觉包名 10 次全部命中,39% 一次都不再出现,58% 至少重复出现 1 次以上。大多数幻觉是稳定、可复现的行为:换个时间、换一次会话再问,同一个假名照样冒出来。对攻击者来说,一个稳定复现的假名就是可以提前蹲守、批量抢注的靶子。

10 次全部命中
43%
时中时不中(1–9 次)
18%
10 次全不再现
39%
分布明显往 0 次和 10 次两端聚集:幻觉要么稳定复现、要么彻底不再现,中间地带很少。稳定复现的那一半,正是攻击者能利用的部分。

这些假包名长什么样

研究还量了这些假名和真实包名到底有多像,用的是 Levenshtein 距离(编辑距离)。它衡量把一个名字改成另一个最少要动几个字符,距离小说明两个名字长得像、可能是手滑,距离大就是压根不沾边的两个词。

距离 1–2 简单手滑
13.4%
距离 3–5 近义变体
37.9%
距离 ≥6 基本不沾边
48.6%
近一半的幻觉假名和任何真实包都差了 6 个字符以上,根本不是打错字,而是模型凭空造出来的全新名字。

再加上 81% 的独特假名只在 16 个模型里的某一个身上出现,等于每个模型都有自己一套独家幻觉。攻击者盯上哪个模型,就能收割用那个模型的开发者。

模型认得出自己编的假包吗

研究还测了模型能不能识别幻觉包。把真假包名混在一起问模型「这是不是一个有效的 Python 包」,GPT-4 Turbo、GPT-3.5、DeepSeek 三个模型识别自己幻觉的准确率都在 75% 以上。模型对自己的生成模式有一种隐含的自我认知,这一点为后面「让模型自己复核」的缓解手段留了口子。

5模型差异

开源模型的幻觉率是商业模型的 4 倍,但没有谁能幸免

同样是写代码,选哪个模型,踩坑概率差很多。这项研究一共生成了 576,000 个代码样本、220 多万个包引用,整体幻觉率 19.7%。拆开看,商业模型和开源模型差了大约 4 倍。

商业模型 平均
5.2%
GPT 系列等闭源模型
开源模型 平均
21.7%
CodeLlama / DeepSeek 等

具体到单个模型,GPT-4 Turbo 幻觉率最低,只有 3.59%;开源里表现最好的 DeepSeek 也要 13.63%。

GPT-4 Turbo 商业最佳
3.59%
GPT-3.5
5.76%
DeepSeek 开源最佳
13.63%
整体平均
19.7%
开源模型平均
21.7%

两个设置也会放大幻觉:温度(temperature,控制随机性的参数)调得越高,幻觉越多,在最高温下开源模型甚至编出的假包比真包还多;即便如此,最高温的 GPT-4(8.9%)仍比 GPT-3.5(31.8%)低近 4 倍。另外,问到训练截止之后才冒出来的新话题时,幻觉率平均比老话题高 10%。对包名准确性敏感的生产环境,选商业模型本身就能把这一层风险压掉一大截。

6缓解手段

有办法治,但要在「安全」和「代码质量」之间做权衡

研究团队测了几种缓解手段,把幻觉从「生成后再筛」往「生成前就防」挪,效果一层比一层好。

最基础的是生成后拿真实包名单交叉过滤,但前面说过这招会被攻击者污染名单,属于被动补救。往前一步的两种是生成前干预:RAG(检索增强生成)让模型回答前先查一份真实包清单、把结果塞进提示词再作答,相当于开卷考试先发一张权威参考表;自我复核(self-refinement)则让模型生成完自己判断一遍包名真假,觉得不对就重写,最多重来 5 次。再往上是微调(fine-tuning)和多方法组合(ensemble,把上面几招叠在一起用)。

下面这张图可以切换两个开源模型,看五种手段各把幻觉率压到多少:

基线 不处理
16.14%
RAG 开卷
12.24%
自我复核
13.04%
微调
2.66%
多方法组合
2.40%
DeepSeek 幻觉率从 16.14% 一路压到 2.4%,降幅约 85%,比任何一个 GPT 模型都低。
基线 不处理
26.28%
RAG 开卷
13.40%
自我复核
25.51%
微调
10.27%
多方法组合
9.32%
CodeLlama 从 26.28% 压到 9.32%,降幅约 64%。自我复核对它几乎没用,因为它倾向把包都判成有效,认不出自己的错。
权衡

微调降幻觉的幅度最大,代价是代码本身的可运行质量跟着掉。用 HumanEval 的 pass@1(模型一次写出的代码能不能真跑通、通过测试,越高越靠谱)来量,DeepSeek 微调后 pass@1 从 51.4% 掉到 25.3%,CodeLlama 从 19.6% 掉到 16.4%。想更安全,就得接受代码能力打折。RAG 和自我复核降幻觉没微调猛,但不怎么伤代码质量,是更平衡的折中。

模型原始 pass@1微调后 pass@1
DeepSeek51.4%25.3%
CodeLlama19.6%16.4%
口径提醒:本节所有数字都出自学术论文 arXiv:2406.10279(USENIX Security 2025)对代码包幻觉的实测。VentureBeat 原文里另有一组「幻觉率 50%–82%、GPT-4o 最低 23%」的数据,那是一项医学临床决策场景的对抗性幻觉研究,和代码包幻觉不是同一口径,两者不能混用。
7威胁面

AI 写的代码越来越多,这个漏洞口子只会越开越大

这条攻击路径的威胁面正在快速变大,因为越来越多代码是 AI 帮着写的。

40%+
开发者估计自己提交的代码里含 AI 辅助的比例,且预计还会涨
72%
试过 AI 编程工具的人里,每天都在用的比例
85%
开源生态里漏洞平均存活时间的增幅
49% / 14%
NPM / PyPI 漏洞报告里,来自蓄意恶意包的占比

开源生态本身的安全账也在变差。一项分析了 10 种语言、31,267 个漏洞样本的研究发现,报告漏洞数量以每年 98% 的速度增长,远超软件包总数 25% 的年增速。

报告漏洞数 年增
98%
软件包总数 年增
25%
漏洞增长的速度快过生态本身扩张近 4 倍,攻击面在实打实地拉大。

更值得盯的是恶意来源占比:这些漏洞报告里,NPM 生态有 49% 来自蓄意上传的恶意包,PyPI 也有 14%。仓库里的坑,相当一部分是有人故意挖的。AI 幻觉包,正好给这类蓄意攻击又开了一扇门。

8怎么办

普通开发者现在就能做的两件事

这套攻击钻的是信任的空子:开发者默认 AI 推荐的包都是真的,装之前不核实。堵这个口子,两件事成本几乎为零。

1
装包前先去官方仓库核实
把 AI 推荐的每个包名,去 PyPI 或 npm 官网搜一下,确认它真实存在、下载量和维护记录正常,再往项目里放。别拿到名字就直接 pip install
2
给团队上自动化核验加监控
在 CI/CD 流程里加一道包名核验,比对可信的「已知好包」清单;同时监控异常的安装行为。别只靠「AI 推荐的就该信」这一层,让恶意包在真正进生产前就被拦下。

再叠一层前面提到的:对包名准确性要求高的场景,选商业模型,或用做过 RAG、微调处理的模型,能把这一层风险再压低一截。

这条攻击闭环,靠「幻觉可复现」转起来
幻觉持久可复现 攻击者能提前蹲守 开发者问 AI 写代码 AI 幻觉出假包名 攻击者抢注同名 下个开发者被推荐 装上,恶意代码入库 感染扩散依赖链
同一个假名会被同一个模型反复生成,攻击者提前抢注,下一个开发者又被推荐同一个名字,闭环因此能持续转动。持久可复现,正是它比随机错误危险的地方。
一个持久的幻觉,对想利用这个漏洞的攻击者更有价值,让这条幻觉攻击路径成为一个更可行的威胁。 论文《We Have a Package for You!》,USENIX Security 2025
本文基于 VentureBeat 客座文章(作者 Zac Amos,2026-07-11)编译整理。核心量化数据出自学术论文 arXiv:2406.10279《We Have a Package for You! A Comprehensive Analysis of Package Hallucinations by Code Generating LLMs》(USENIX Security 2025);开源漏洞增长数据出自 arXiv:2506.12995;真实案例来自 The Register(2024-03-28)与 Lasso Security;术语来源为 PSF 安全常驻开发者 Seth Larson。各项数字以对应原始研究为准。