事件概述
axios(npm 上周下载量超过 1 亿次的核心依赖库)在最新版本中被植入恶意代码,这是一起典型的供应链安全事件。

受影响版本:axios@1.14.1、axios@0.30.4
安全版本:axios@1.14.0、axios@0.30.3

问题的关键在于:这两个受污染版本中引入了一个此前从未存在的依赖——plain-crypto-js@4.2.1。该依赖在 axios 源码中没有任何引用,其唯一作用是通过 npm 的 postinstall 钩子执行恶意代码。
苏米注:这是典型的"幽灵依赖"攻击——恶意代码不在你的业务逻辑中,甚至不在你直接引用的库里,而是藏在依赖的依赖里,安装时自动执行。
恶意行为分析
根据 Socket AI 等安全机构的分析,plain-crypto-js 本质是一个混淆的投放器(dropper),其行为链包括:
- 在运行时解密 payload 并执行指令
- 动态加载
fs、os、execSync等 Node.js 核心模块,规避静态检测 - 执行解码后的 shell 命令
- 下载并执行远程 payload(RAT,远程访问木马)
- 将恶意文件写入系统目录(如 temp、ProgramData)
- 执行完成后删除自身,并用"干净文件"覆盖痕迹
换句话说,仅执行一次 npm install axios,就可能触发完整的远程控制链路。
攻击特点
这次攻击有几个值得注意的技术特点:
- axios 本身无恶意代码:所有攻击逻辑都隐藏在传递依赖中,常规审计难以发现
- 幽灵依赖:恶意依赖不被 import,仅通过 package.json 引入
- 安装即执行:攻击发生在 postinstall 生命周期,无需代码引用
- 自我清理:恶意脚本执行后删除自身,常规检查难以追溯
- 跨平台 payload:针对 macOS / Windows / Linux 三平台分别实现
苏米注:这类攻击绕过了传统代码审计和依赖扫描手段,代表当前供应链攻击的典型演进方向——从"直接投毒"转向"依赖链注入"。
影响范围
axios 的使用范围极广,包括:
- 前端应用(React / Vue / Angular 等)
- Node.js 服务
- CI/CD 构建流程
- 内部工具链
因此,一旦依赖被污染,影响的不只是开发机,还可能扩散到构建系统和生产环境。
如何判断是否受影响

检查受影响版本
npm list axios 2>/dev/null | grep -E "1\.14\.1|0\.30\.4"
grep -A1 '"axios"' package-lock.json | grep -E "1\.14\.1|0\.30\.4"
检查恶意依赖
ls node_modules/plain-crypto-js 2>/dev/null && echo "POTENTIALLY AFFECTED"
即使该目录中的 package.json 看起来是"正常"的,也可能已经执行过攻击代码。
检查系统痕迹
# macOS
ls -la /Library/Caches/com.apple.act.mond
# Linux
ls -la /tmp/ld.py
# Windows
dir "%PROGRAMDATA%\wt.exe"
如果存在上述文件,应视为已被入侵。
踩坑记录:别忘了检查 CI/CD 流水线日志。如果任何流程曾执行过 npm install 并拉取上述版本,同样需要按入侵处理。
补救措施

1. 立即降级并锁定版本
npm install axios@1.14.0
# 或
npm install axios@0.30.3
在项目中强制锁定:
{
"dependencies": { "axios": "1.14.0" },
"overrides": { "axios": "1.14.0" },
"resolutions": { "axios": "1.14.0" }
}
2. 删除恶意依赖
rm -rf node_modules/plain-crypto-js
npm install --ignore-scripts
最佳实践:如果检测到任何 RAT 痕迹,应直接重建环境,不建议原地清理。
3. 轮换所有凭证
需要更换的凭证包括:
- npm token
- GitHub token
- 云服务密钥(AWS / GCP / Azure)
- SSH key
- CI/CD secrets
- .env 中的敏感变量
审计所有 CI/CD 流水线,凡执行过受影响版本安装的,均需更换凭证。
4. 网络层防护
在 CI/CD 中默认使用:
npm ci --ignore-scripts
以阻断 postinstall 类攻击。
可在网络层阻断 C2 通信:
iptables -A OUTPUT -d 142.11.206.73 -j DROP
echo "0.0.0.0 sfrclak.com" >> /etc/hosts
写在最后
这次 axios 事件并不是孤立事件,而是 npm 供应链攻击持续升级的体现。从早期的恶意包投放,到现在的账号劫持、依赖注入、自动清痕,攻击方式正在逐步工业化。
苏米注:对于开发者来说,需要从"信任依赖"转向"验证依赖"——锁版本、审更新、限制脚本执行,已经不再是可选项,而是基础安全要求。
相关链接:StepSecurity 详细分析报告