Axios 供应链投毒事件深度复盘
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-js 至 4.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.1 和 0.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