
这是一起典型的 npm 供应链攻击(supply chain attack),针对的是 npm 上下载量极高的 HTTP 客户端库 axios(每周下载量超过 1 亿次)。攻击者通过劫持 axios 主要维护者(jasonsaayman)的 npm 账号,在 2026 年 3 月 31 日发布了两个恶意版本:
这两个版本会自动引入一个此前不存在的恶意依赖包 [email protected]。该恶意包利用 npm 的 postinstall 钩子,在 npm install 时静默执行恶意代码(setup.js),属于典型的“安装器恶意软件”(installer malware)。
恶意行为细节:
- 使用两层混淆(反向 Base64 + XOR 加密)隐藏 payload,动态加载 fs、os、execSync 等模块,绕过静态分析。
- 根据操作系统投放不同 payload:
- macOS:下载 C++ RAT 二进制文件,伪装成系统缓存进程,每 60 秒向 C2 服务器(sfrclak.com:8000)回传主机信息,支持远程命令执行。
- Windows:伪装成 Windows Terminal,执行隐藏 PowerShell 脚本。
- Linux:在 /tmp 目录投放 Python RAT。
- 执行后自毁痕迹(删除 setup.js、修改 package.json 等),安装后在 node_modules 中几乎看不到明显恶意文件,必须检查 lockfile 才能发现。
- 此外,还发现另外两个包(@shadanai/openclaw 和 @qqbrowser/openclaw-qbot)也嵌入了相同恶意 payload。
根因:维护者 npm 账号被入侵(邮箱改为匿名 Proton Mail),绕过项目正常的 GitHub Actions OIDC 可信发布流程,直接用 npm CLI 手动发布。攻击者提前 ~18 小时预埋了 plain-crypto-js 包,整个攻击在 39 分钟内同时污染 1.x 和 0.x 分支,最大化影响使用 caret 范围(^)的项目的破坏面。Socket Security 的 AI 扫描器在恶意包发布后 6 分钟就检测到异常。
目前 npm 已移除恶意版本,axios 官方正在调查并修复发布流程。
解决方案(立即执行)
- 快速自查(所有项目必须做):
- 运行命令:npm ls axios 和 npm ls plain-crypto-js
- 打开 package-lock.json(或 yarn.lock / pnpm-lock.yaml),搜索 1.14.1、0.30.4 或 [email protected]
- 检查所有 feature branch 和 open PR
- 立即修复受影响项目:
- 删除 node_modules 文件夹和 lockfile
- 在 package.json 中固定 axios 版本(不要使用 ^ 或 ~):
JSON "axios": "1.14.0" // 或更早的已知安全版本(如 1.7.x 系列)
- 重新运行 npm install(或 yarn / pnpm install)
- 提交更新后的 lockfile
- 如果怀疑已执行恶意代码:
- 假设主机已感染:立即旋转所有凭证(npm token、云服务密钥、GitHub token 等)
- 检查系统 IOC:
- macOS:/Library/Caches/com.apple.act.mond
- Windows:%PROGRAMDATA%\wt.exe、%TEMP%\6202033.*
- Linux:/tmp/ld.py
- 使用杀毒软件或 EDR 工具全盘扫描
- 建议重装受影响机器(尤其是 CI/CD 服务器)
- 长期预防措施(强烈推荐):
- 固定所有依赖版本,避免自动升级到 latest
- 在 CI/CD 中集成依赖安全扫描工具(如 Socket Security、npm audit、Dependabot + Socket)
- 为维护者启用 npm 2FA、短期 token、严格发布权限
- 使用 Socket for GitHub(免费)在 PR 阶段自动阻挡恶意依赖
- 开发者笔记本安装 Socket Firewall(免费)实时阻挡恶意 postinstall
- 优先考虑使用原生 fetch API,减少不必要第三方依赖
文末引用链接:
建议所有使用 axios 的项目立即检查并固定版本,供应链攻击的破坏力极强,早发现早处理可大幅降低风险。
|