2026年3月30日,全球流行的 HTTP 客户端库 Axios 在 NPM 官方仓库遭到供应链攻击。攻击者通过劫持主要维护者的账号,发布了带有恶意代码的 1.14.1 和 0.30.4 版本。这些版本植入了一个名为 plain-crypto-js 的恶意依赖,通过安装脚本在 Windows、macOS 和 Linux 系统中植入远程访问木马(RAT),并具备极强的自毁和伪装能力。开发者若已安装上述版本,应视系统已被完全入侵,需立即采取降级版本、清理恶意文件及更换所有凭证的补救措施。
攻击手法:精准的账号劫持与流程绕过
攻击者并非通过常规的自动化流水线(CI/CD)发布版本,而是采用了更直接的手段:
- 账号劫持:攻击者控制了 Axios 核心维护者的 NPM 账号,将关联邮箱修改为匿名邮箱,并利用泄露的 Access Token 手动发布了受损版本。
- 绕过验证:由于是手动发布,这些版本缺少 GitHub Actions 的加密签名(OIDC 信任发布机制),且在 GitHub 源码仓库中找不到对应的提交记录或标签。
- 预先部署:恶意依赖项
plain-crypto-js在 Axios 受损版本发布前 18 小时就已上传至 NPM,旨在规避安全扫描器对“全新包”的警报。
恶意载荷:跨平台木马与证据清理
受损的 Axios 版本引入了名为 [email protected] 的依赖。该包在 Axios 源码中从未被引用,其唯一目的就是执行恶意安装脚本。
核心威胁:该恶意依赖包含一个
postinstall钩子,一旦开发者运行npm install,木马就会自动触发,无需任何额外的代码调用。
1. 针对不同操作系统的攻击
木马会检测宿主系统并分发不同的二次载荷:
- macOS:下载二进制文件并伪装成苹果系统路径
/Library/Caches/com.apple.act.mond(模仿活动监视器守护进程)。 - Windows:将 PowerShell 副本重命名为
wt.exe以实现持久化,并通过隐藏窗口运行木马脚本。 - Linux:下载并运行 Python 编写的木马载荷
/tmp/ld.py。
2. 隐蔽与自毁机制
为了逃避取证分析,恶意脚本在执行后会进行“清道夫”作业:
- 删除自身:删除安装脚本文件
setup.js。 - 篡改配置:删除包含恶意钩子的
package.json,并用一个干净的备份文件替换。 - 伪装流量:与远程控制服务器(C2)通信时,在请求头中加入
packages.npm.org前缀,使流量看起来像正常的 NPM 注册表通信。
如何判断是否受影响?
您可以运行以下命令检查项目是否引用了受污染的版本:
- 检查 Axios 版本:
npm list axios | grep -E "1\.14\.1|0\.30\.4" - 检查残留目录:
即便脚本已自毁,但恶意包的文件夹可能依然存在。检查是否存在
node_modules/plain-crypto-js目录。 - 检查系统症状:
- macOS: 检查是否存在文件
/Library/Caches/com.apple.act.mond - Linux: 检查是否存在文件
/tmp/ld.py - Windows: 检查是否存在文件
%PROGRAMDATA%\wt.exe
- macOS: 检查是否存在文件
紧急响应方案
如果您确认安装了受影响的版本,请务必假设您的系统、环境变量和所有访问凭据均已泄露。
版本降级:
- 1.x 用户请强制降级至 1.14.0。
- 0.x 用户请强制降级至 0.30.3。
- 在
package.json中使用overrides或resolutions锁定版本。
清理环境:
- 删除
node_modules和package-lock.json。 - 运行
npm install --ignore-scripts以防止安装期间再次触发恶意脚本。
- 删除
更换凭据(最关键):
- 立即更改所有在开发机或 CI/CD 环境中接触过的密钥:包括 AWS、GCP、Azure 凭证,NPM 发布令牌,SSH 私钥以及
.env文件中的敏感信息。
- 立即更改所有在开发机或 CI/CD 环境中接触过的密钥:包括 AWS、GCP、Azure 凭证,NPM 发布令牌,SSH 私钥以及
封禁风险域名:
- 在网络层拦截恶意 C2 域名:
sfrclak.com。
- 在网络层拦截恶意 C2 域名:
经验教训:增强供应链安全
- 启用
--ignore-scripts:在 CI/CD 流水线中,建议默认使用npm ci --ignore-scripts,仅在确实需要时手动开启脚本权限。 - 监控依赖变更:对于像 Axios 这种周下载量过亿的基础库,任何非预期的依赖新增都应触发最高级别的安全预警。
- 验证发布来源:优先使用具有 OIDC 签名(Trusted Publisher)的包版本,避免手动发布的非校验版本。