2026年3月31日,全球最流行的 JavaScript HTTP 客户端库 Axios 遭遇了一起高度复杂的供应链攻击。攻击者并未直接修改 Axios 的源代码,而是巧妙地通过 npm 生态系统机制植入后门。本文将完整复盘该事件的时间线、攻击技术、影响范围及应急处置措施。

📅 事件关键时间线

攻击者计划缜密,整个攻击过程在约 24 小时内完成:

时间 (UTC) 事件
2026-03-30 05:57 攻击者发布诱饵包 plain-crypto-js@4.2.0(干净版本)
2026-03-30 23:59 更新 plain-crypto-js4.2.1,植入恶意 postinstall 脚本
2026-03-31 00:21 利用被入侵的 Axios 维护者账号发布恶意版本 axios@1.14.1
2026-03-31 01:00 发布第二个恶意版本 axios@0.30.4(针对旧版 0.x 分支)
2026-03-31 03:20 npm 官方撤下两个恶意版本

🛠️ 攻击技术深度解析

本次攻击是一次教科书级的供应链攻击,精妙之处体现在多个层面。

1. 劫持源头

攻击者通过社会工程学或其他未知手段,成功获取了 Axios 主要维护者 jasonsaayman 的 npm 账户权限,包括一个长期有效的经典(classic)访问令牌。他们随即更改了账户关联的邮箱为攻击者控制的 ProtonMail 地址(ifstap@proton[.]me),锁定了合法所有者。

2. 发布机制

恶意版本 axios@1.14.10.30.4 是通过被劫持的账户,直接使用 npm CLI 手动发布的幽灵发布。这些版本并未通过项目的 GitHub 仓库,因此不存在对应的代码提交、标签或发布分支,绕过了正常的 CI/CD 流程。

3. 投毒手法——注入隐藏依赖

被污染的 Axios 版本本身代码是安全的,其唯一变化是在 package.json 中新增了一个运行时依赖:plain-crypto-js。该包经过精心伪装:

  • 命名模仿:模仿知名加密库 crypto-js,使用相似的名称和描述降低警惕。
  • 先建信誉:提前 18 小时发布干净的 4.2.0 版本,使 4.2.1 看起来像一次正常更新。
  • 隔离账户:发布该恶意包的账户 nrwise@proton.me 为一次性账户,增加了调查难度。

4. 载荷投递——SILKBELL 投递器

当开发者安装被污染的 Axios 版本时,npm 会自动安装 plain-crypto-js 并触发其 postinstall 脚本。该脚本名为 SILKBELL,是一个投递器(dropper),会连接 C2 服务器 sfrclak[.]com:8000,根据受害者操作系统下载对应的第二阶段 RAT 载荷:

操作系统 载荷类型
Windows PowerShell 后门(VBScript 伪装 + 注册表持久化)
macOS 二进制木马 WAVESHAPER.V2
Linux Python 后门

5. 反取证设计

  • 自我删除:载荷执行后,投递脚本立即删除自身。
  • 替换 package.json:用一个干净的、预先准备好的 package.json 存根替换原始的恶意 package.json,彻底抹除攻击痕迹。

🌍 影响范围与归因

  • 影响面巨大:Axios 每周下载量超过 3 亿次,广泛存在于约 80% 的云环境和开发工具链中。尽管恶意版本仅在线约 3 小时,但受其版本范围影响的系统仍可能自动拉取。根据 Wiz 报告,受影响环境中约有 3% 的系统成功执行了 RAT
  • 幕后黑手:谷歌威胁情报小组(GTIG)等多个安全机构高度确信,此次攻击是由 UNC1069(与朝鲜有关的威胁组织)发起的。该组织以攻击加密货币交易所和软件开发者著称。
  • 关联事件:此次 Axios 事件是 2026 年 3 月针对开源项目的一波连环供应链攻击的一部分,同期还有针对 OpenAI、Trivy 等项目的类似攻击,被认为出自同一组织之手。

💡 应急处置与修复建议

如果您的系统在攻击窗口期(2026-03-31 00:21 ~ 03:20 UTC)运行过 npm install,请立即采取以下行动

1. 检查与修复

  • 版本排查
    npm list axios
    grep -A1 '"axios"' package-lock.json