乐于分享
好东西不私藏

3亿周下载的HTTP库被投毒!axios供应链攻击完整复盘

3亿周下载的HTTP库被投毒!axios供应链攻击完整复盘

3亿周下载的HTTP库被投毒!axios供应链攻击完整复盘

2026-03-31 | 供应链安全 | npm | 网络安全


⚠️ 紧急提示:如果你在最近24小时内执行过 npm installnpm update,请立刻检查你的项目——你可能已经中招。

3亿次周下载。

这不是某个小众库的数字,这是 axios —— 全球最流行的 JavaScript HTTP 客户端库,无数前端、后端项目的网络请求基石。

而今天,2026年3月31日,这个库的两个版本被悄无声息地投了毒:

  • axios@1.14.1
  • axios@0.30.4

一、发生了什么?事件全景还原

事件时间线

时间事件
攻击前约18小时plain-crypto-js@4.2.0 作为"干净包"预先发布,建立npm历史
2026-03-30 23:59 UTCplain-crypto-js@4.2.1 含恶意代码发布
约 00:21 UTCaxios@1.14.1 被推送至 npm
约 01:00 UTCaxios@0.30.4 被推送(距1.14.1约39分钟后)
随后不久Socket.dev 等安全厂商检出披露

账户劫持

攻击者获取了 axios 主要维护者 jasonsaayman 的 npm 账户。这两个恶意版本在官方 GitHub 没有任何对应 tag,正常的发布流程被完全绕过。

更令人震惊的是,攻击者甚至将维护者的账户邮箱改为了 ifstap@proton.me,导致官方维护团队一度表示"无法撤销攻击者的权限"。


二、他们是怎么做到的?攻击链深度解析

攻击手法:postinstall 钩子 + 双层混淆

恶意代码通过 npm 的 postinstall 生命周期钩子自动执行。一旦你运行了 npm install axios@1.14.1,恶意代码就会在安装过程中悄然运行。

攻击者使用了 双层混淆技术

第一层:反转 Base64

let E = x.split("").reverse().join("").replaceAll("_", "=");
let S = Buffer.from(E, "base64").toString("utf8");

第二层:XOR 密码

const _trans_1 = function(x, r) {
  const E = r.split("").map(Number);
  return x.split("").map((x, r) => {
    const S = x.charCodeAt(0), a = E[7 * r * r % 10];
    return String.fromCharCode(S ^ a ^ 333);
  }).join("");
};

三平台通杀 payload

平台持久化路径攻击方式
Windows%PROGRAMDATA%\wt.exePowerShell + VBScript
macOS/Library/Caches/com.apple.act.mondMach-O RAT
Linux/tmp/ld.pyPython 后门

毁尸灭迹

攻击完成后,恶意代码会 自动清理所有痕迹

  1. 删除 setup.js(恶意脚本本身)
  2. 删除 package.json(含 postinstall 钩子的版本)
  3. package.md 重命名为 package.json(恢复"干净"版本)
⚠️ 注意:事后查看 node_modules/plain-crypto-js/,看起来就是一个普通的 crypto-js 复制,几乎看不出任何异常!

三、你中招了吗?快速自查指南

立刻执行以下命令

步骤1:检查 axios 版本

npm list axios 2>/dev/null | grep -E "1\.14\.1|0\.30\.4"

步骤2:检查 lock 文件

grep -A1 '"axios"' package-lock.json | grep -E "1\.14\.1|0\.30\.4"

步骤3:检查恶意依赖

ls node_modules/plain-crypto-js 2>/dev/null && echo "⚠️ 已中招!"

自查结果判断

检查结果状态应对措施
三项均无输出✅ 安全建议执行预防性降级
有版本输出或发现 plain-crypto-js❌ 已中招立即进入修复流程
最近执行过 npm install 但不确定⚠️ 可疑按已中招处理

四、如何修复?应急响应四步法

情况A:尚未执行 npm install(仅 package.json 被修改)

# 立即降级到安全版本
npm install axios@1.14.0

# 或针对 0.x 版本
npm install axios@0.30.3

然后删除 node_modulespackage-lock.json,重新安装。

情况B:已经执行了 npm install(可能已触发恶意代码)

1
重建环境
2
轮换凭证
3
检查后门
4
确认安全

第一步:重建干净环境

rm -rf node_modules package-lock.json
npm install axios@1.14.0

第二步:轮换所有凭证

⚠️ 最重要:如果你的机器上运行过这次安装,假设所有凭证已泄露,立即轮换:
  • npm token
  • API 密钥(AWS、Github、CICD 等)
  • SSH 私钥
  • 云服务商凭证

第三步:检查持久化文件

平台检查命令
macOSls -la /Library/Caches/com.apple.act.mond
Linuxls -la /tmp/ld.py
Windowsdir "%PROGRAMDATA%\wt.exe"

五、如何防范?供应链安全最佳实践

1. 锁定依赖版本(最重要)

不要再用 latest^x.x.x 这种模糊版本号:

"axios": "1.14.0"  // 精确版本,不允许自动升级

2. 使用安全扫描工具

# npm audit(内置)
npm audit

# Socket.dev(推荐)
npx socket npm install axios

# Snyk
npx snyk test

3. 启用 pnpm 防护

pnpm 10+ 默认阻止依赖包的生命周期脚本执行:

# pnpm 默认阻止 postinstall
pnpm install

4. npm token 最小权限

为不同项目使用不同的 npm token,并设置细粒度权限。

5. 定期审计依赖

npm audit
npx npm-check-updates -t minor

写在最后

这不是2026年的第一起 npm 供应链攻击,也不会是最后一起。

从 Apifox 到 LiteLLM 再到今天的 axios,攻击者已经将目光瞄准了开发者日常依赖的基础设施。你信任的 npm install,可能正在安装一个木马。

不要等到中招才后悔。现在就打开你的项目,执行上面的自查命令。如果你在公司负责技术团队,请将这篇文章转发给同事——一次转发,可能就能阻止一次潜在的入侵。
安全不是事后补救,而是日常习惯。

参考来源:
  • StepSecurity: axios Compromised on npm
  • Socket.dev: Supply Chain Attack on Axios
  • The Hacker News: axios Supply Chain Attack

本文仅供安全研究和应急响应参考,请勿用于非法用途。