
3亿周下载的HTTP库被投毒!axios供应链攻击完整复盘
2026-03-31 | 供应链安全 | npm | 网络安全
npm install 或 npm update,请立刻检查你的项目——你可能已经中招。
3亿次周下载。
这不是某个小众库的数字,这是 axios —— 全球最流行的 JavaScript HTTP 客户端库,无数前端、后端项目的网络请求基石。
而今天,2026年3月31日,这个库的两个版本被悄无声息地投了毒:
axios@1.14.1axios@0.30.4
一、发生了什么?事件全景还原
事件时间线
| 时间 | 事件 |
|---|---|
| 攻击前约18小时 | plain-crypto-js@4.2.0 作为"干净包"预先发布,建立npm历史 |
| 2026-03-30 23:59 UTC | plain-crypto-js@4.2.1 含恶意代码发布 |
| 约 00:21 UTC | axios@1.14.1 被推送至 npm |
| 约 01:00 UTC | axios@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.exe | PowerShell + VBScript |
| macOS | /Library/Caches/com.apple.act.mond | Mach-O RAT |
| Linux | /tmp/ld.py | Python 后门 |
毁尸灭迹
攻击完成后,恶意代码会 自动清理所有痕迹:
- 删除
setup.js(恶意脚本本身) - 删除
package.json(含 postinstall 钩子的版本) - 将
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_modules 和 package-lock.json,重新安装。
情况B:已经执行了 npm install(可能已触发恶意代码)
第一步:重建干净环境
rm -rf node_modules package-lock.json npm install axios@1.14.0
第二步:轮换所有凭证
- npm token
- API 密钥(AWS、Github、CICD 等)
- SSH 私钥
- 云服务商凭证
第三步:检查持久化文件
| 平台 | 检查命令 |
|---|---|
| macOS | ls -la /Library/Caches/com.apple.act.mond |
| Linux | ls -la /tmp/ld.py |
| Windows | dir "%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
本文仅供安全研究和应急响应参考,请勿用于非法用途。
夜雨聆风