Slopsquatting:AI 幻觉作为供应链攻击
Source: Dev.to
每五个 AI 生成的代码示例中,就有一个推荐了不存在的包。
攻击者正在 npm 和 PyPI 上注册这些虚构的名称,并植入恶意软件。这个现象称为 slopsquatting,且已经在发生。
什么是 slopsquatting?
- Typosquatting 利用人类的拼写错误进行投机。
- Slopsquatting 利用 AI 幻觉进行投机。
该术语由 Seth Larson(Python 软件基金会的 Security Developer‑in‑Residence)创造,用于描述一种特定攻击:
Register the package names that LLMs consistently fabricate, then wait for developers to install them on an AI’s recommendation.
证据
| 研究 | 范围 | 关键发现 |
|---|---|---|
| USENIX Security 2025 | 576 000 个代码样本,涉及 16 种语言模型 | • 约 20 % 的样本推荐了至少一个不存在的包。 • 幻觉可分为三类: - 51 % 完全捏造(没有真实依据)。 - 38 % 将真实包混合(例如 express-mongoose)。- 13 % 合法名称的拼写错误变体。 |
| Consistency | 重复查询(10 次) | • 43 % 的幻觉名称在每次查询中都出现 每一次。 • 58 % 出现了 多于一次。 |
含义: 攻击者 不需要 猜测 LLM 会编造哪些名称。他们只需多次提出相同问题,收集这些虚构名称并进行注册。
为什么现有防御失效
- 传统的错别字抢注会注册类似
crossenv的名称,期望有人误输入cross‑env。 - 注册表防御会标记与流行名称 过于相近 的新名称。
- 幻觉式名称完全绕过此类防御——它们是全新字符串,过滤器根本没有预料到,因为没有真实的包作为起点。
实际案例
| 包 | 生态系统 | 结果 |
|---|---|---|
huggingface-cli | PyPI | 注册为一个空占位符(没有恶意代码)。三个月内,开发者(或他们的 AI 工具)通过运行 pip install huggingface-cli 累计获得 30 000+ 自然下载。 |
unused-imports | npm | 已确认恶意;仍在 ≈ 233 次下载/周(2026 年初)。合法的包是 eslint-plugin-unused-imports。 |
react-codeshift | npm | jscodeshift 与 react-codemod 的混合体。出现在 LLM 生成的 agent‑skill 文件中并提交到 GitHub——没有人为植入。通过自动代码生成传播。 |
有效载荷 通常是 安装后脚本,用于窃取 API 密钥、云令牌和 SSH 密钥。更新的变体利用 npm 的 基于 URL 的依赖 功能,在安装时获取恶意代码,使 package.json 看起来干净。
跨生态系统视角: 8.7 % 的虚构 Python 包名实际上是有效的 JavaScript 包。攻击者可以在 npm 和 PyPI 上同时注册同一个虚构名称,以单一伪造名称捕获两个生态系统的流量。
防御措施 – 当今有效的方法
1. 锁定你的依赖
# npm / yarn / pnpm
npm ci # uses package-lock.json, fails if lockfile is out‑of‑date
# poetry (Python)
poetry lock
锁文件会固定确切的版本和校验和,这样后续出现同名的恶意包也不会影响已有的安装。
2. 安装前进行验证
- npm:
npm info <package>– 显示发布者、创建日期、每周下载量。 - PyPI: 浏览
https://pypi.org/project/<package>/– 查找最近的创建日期、缺失的 README、只有单一版本、没有 GitHub 链接 → 红色警示。 - 将名称与库的官方文档进行交叉核对。
3. 使用扫描包装器
Aikido SafeChain(开源)拦截安装命令,并根据威胁情报源对包进行验证。
curl -fsSL https://github.com/AikidoSec/safe-chain/releases/latest/download/install-safe-chain.sh | sh
# 重启终端,然后正常使用 npm/pip/yarn – SafeChain 会自动拦截
npm install some-package
免费,无需 API 令牌,仅会在每次安装时增加几秒钟的时间。
4. 为自主代理提供沙箱环境
- 在 临时容器或虚拟机 中运行安装包的 AI 编码代理。
- 在一次性 Docker 容器中的恶意 post‑install 脚本无法窃取宿主机凭证。
- 至少要限制代理的权限,使其在未获得明确批准时无法执行
npm install。
5. 为不受信任的包禁用 post‑install 脚本
npm install --ignore-scripts # 跳过所有生命周期脚本
# 之后,如有需要,可手动为已确认安全的包重新启用脚本
以牺牲少量手动设置为代价,阻断最常见的 slopsquatting 负载向量。
6. 添加 CI 关卡
- 软件组成分析 (SCA) – 在流水线中集成 OWASP Dependency‑Check 或 Dep‑Scan 等工具。
- 为每次构建生成并签署 软件物料清单 (SBOM);每个依赖都可审计。
- 若某个包 未 出现在组织批准的注册表中,构建应 失败。
规模很重要
随着 AI 编码工具从配对编程助手演进为 自主代理,能够在无人监督的情况下安装依赖,攻击面会显著扩大。以下组合:
- 一致的幻觉(高可重复性),
- 新颖、未过滤的名称,以及
- 自动的安装后执行
为 slopsquatting 攻击提供了肥沃的土壤。
TL;DR
- 锁定 依赖。
- 验证 任意 AI 推荐的包再进行安装。
- 部署类似 SafeChain 的 扫描包装器。
- 沙箱化 自主代理。
- 禁用 不可信的安装后脚本。
- 使用 SCA 与 SBOM 强制 CI 门禁。
通过分层这些控制措施,你可以显著降低意外引入恶意、由 AI 伪造的包的风险。
攻击面扩展
没有人工审查,攻击面会扩大。
读取建议并检查文档的开发者有一定防护。而在自动循环中运行npm install的 AI 代理则没有。
当前注册表防御
- 注册表仍 没有针对 slopsquatting 的自动防御。
- npm 现有的保护措施能捕获与热门包相似的名称,但 幻觉产生的名称往往与真实名称毫无相似。
- 这些是 全新字符串,任何相似性过滤器都未预料到。
反馈循环(React‑Codeshift 示例)
- LLM 幻觉出一个包名。
- AI 代理编写代码,导入这个不存在的包。
- 代码被 提交到 GitHub。
- 另一个 LLM 在其上进行训练或检索该代码。
- 幻觉进一步传播。
每一步:
- 增加下载次数,使该包看起来更可信。
- 使下一个 LLM 更可能推荐它。
谁承担风险?
无论注册表是否能跟上,风险最终落在接受 AI 包建议的开发者身上。
缓解建议
-
在安装任何 AI 推荐的包之前进行验证:
npm info <package> # or curl https://pypi.org/pypi/<package>/json检查它是否存在、它的年龄以及它的发布者。
-
对于自动化工作流:
- 安装 SafeChain 作为即插即用的包装器。
- 绝不要让 AI 代理在沙箱环境之外执行包安装。
-
记住20 % 的幻觉率:每五个建议中就可能有一个是陷阱。