Slopsquatting:AI 幻觉作为供应链攻击

发布: (2026年3月5日 GMT+8 14:48)
9 分钟阅读
原文: Dev.to

Source: Dev.to

每五个 AI 生成的代码示例中,就有一个推荐了不存在的包。
攻击者正在 npmPyPI 上注册这些虚构的名称,并植入恶意软件。这个现象称为 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 2025576 000 个代码样本,涉及 16 种语言模型• 约 20 % 的样本推荐了至少一个不存在的包。
• 幻觉可分为三类:
 - 51 % 完全捏造(没有真实依据)。
 - 38 % 将真实包混合(例如 express-mongoose)。
 - 13 % 合法名称的拼写错误变体。
Consistency重复查询(10 次)• 43 % 的幻觉名称在每次查询中都出现 每一次
• 58 % 出现了 多于一次

含义: 攻击者 不需要 猜测 LLM 会编造哪些名称。他们只需多次提出相同问题,收集这些虚构名称并进行注册。

为什么现有防御失效

  • 传统的错别字抢注会注册类似 crossenv 的名称,期望有人误输入 cross‑env
  • 注册表防御会标记与流行名称 过于相近 的新名称。
  • 幻觉式名称完全绕过此类防御——它们是全新字符串,过滤器根本没有预料到,因为没有真实的包作为起点。

实际案例

生态系统结果
huggingface-cliPyPI注册为一个空占位符(没有恶意代码)。三个月内,开发者(或他们的 AI 工具)通过运行 pip install huggingface-cli 累计获得 30 000+ 自然下载
unused-importsnpm已确认恶意;仍在 ≈ 233 次下载/周(2026 年初)。合法的包是 eslint-plugin-unused-imports
react-codeshiftnpmjscodeshiftreact-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‑CheckDep‑Scan 等工具。
  • 为每次构建生成并签署 软件物料清单 (SBOM);每个依赖都可审计。
  • 若某个包 出现在组织批准的注册表中,构建应 失败

规模很重要

随着 AI 编码工具从配对编程助手演进为 自主代理,能够在无人监督的情况下安装依赖,攻击面会显著扩大。以下组合:

  • 一致的幻觉(高可重复性),
  • 新颖、未过滤的名称,以及
  • 自动的安装后执行

slopsquatting 攻击提供了肥沃的土壤。

TL;DR

  1. 锁定 依赖。
  2. 验证 任意 AI 推荐的包再进行安装。
  3. 部署类似 SafeChain扫描包装器
  4. 沙箱化 自主代理。
  5. 禁用 不可信的安装后脚本。
  6. 使用 SCASBOM 强制 CI 门禁

通过分层这些控制措施,你可以显著降低意外引入恶意、由 AI 伪造的包的风险。

攻击面扩展

没有人工审查,攻击面会扩大。
读取建议并检查文档的开发者有一定防护。而在自动循环中运行 npm install 的 AI 代理则没有。

当前注册表防御

  • 注册表仍 没有针对 slopsquatting 的自动防御
  • npm 现有的保护措施能捕获与热门包相似的名称,但 幻觉产生的名称往往与真实名称毫无相似
  • 这些是 全新字符串,任何相似性过滤器都未预料到。

反馈循环(React‑Codeshift 示例)

  1. LLM 幻觉出一个包名。
  2. AI 代理编写代码,导入这个不存在的包。
  3. 代码被 提交到 GitHub
  4. 另一个 LLM 在其上进行训练或检索该代码。
  5. 幻觉进一步传播

每一步:

  • 增加下载次数,使该包看起来更可信。
  • 使下一个 LLM 更可能推荐它

谁承担风险?

无论注册表是否能跟上,风险最终落在接受 AI 包建议的开发者身上

缓解建议

  • 在安装任何 AI 推荐的包之前进行验证

    npm info <package>
    # or
    curl https://pypi.org/pypi/<package>/json

    检查它是否存在、它的年龄以及它的发布者

  • 对于自动化工作流:

    • 安装 SafeChain 作为即插即用的包装器。
    • 绝不要让 AI 代理在沙箱环境之外执行包安装
  • 记住20 % 的幻觉率:每五个建议中就可能有一个是陷阱。

0 浏览
Back to Blog

相关文章

阅读更多 »