2026 年 3 月 31 日,安全团队 StepSecurity 发现,JavaScript 生态中最流行的 HTTP 客户端库 axios 的 npm 仓库账号被攻击者劫持,攻击者发布了两个恶意版本:axios@1.14.1和axios@0.30.4,这两个版本会植入跨平台远程访问木马(RAT),实现对用户设备的完全控制。
这是一次高度精密的供应链攻击,攻击者提前 18 小时完成恶意依赖的预部署,同时针对 axios 的 1.x 现代分支和 0.x legacy 分支发布恶意版本,覆盖绝大多数用户群体,并且攻击完成后会自动销毁痕迹,极大增加了事后排查的难度。
二、攻击技术细节
1. 攻击时间线
plain-crypto-js@4.2.0 | ||
plain-crypto-js@4.2.1 | ||
axios@1.14.1 | ||
axios@0.30.4 |
2. 攻击流程
账号劫持:攻击者窃取了 axios 核心维护者
jasonsaayman的 npm 账号凭证,将账号邮箱修改为攻击者控制的 ProtonMail 邮箱,绕过了项目正常的 GitHub Actions CI/CD 发布流程,手动发布了恶意包。依赖注入:恶意的 axios 版本本身没有任何恶意代码,而是额外添加了一个从未在代码中使用的 "幽灵依赖"——
plain-crypto-js@4.2.1,这个依赖的唯一作用是触发 postinstall 脚本。木马投放:当用户执行
npm install时,npm 会自动执行plain-crypto-js的 postinstall 脚本,该脚本会根据用户的操作系统(Windows/macOS/Linux),从攻击者的 C2 服务器下载对应平台的 RAT 木马,在后台运行。痕迹销毁:脚本执行完成后,会自动删除自身的恶意文件,将提前准备的干净的 package.json 覆盖掉恶意的包配置,使得用户事后检查 node_modules 时,完全无法发现攻击痕迹,仅会留下一个看似正常的
plain-crypto-js目录。
3. 攻击指标(IOC)
axios@1.14.1axios@0.30.4、plain-crypto-js@4.2.1 | |
sfrclak.com,IP:142.11.206.73,地址:http://sfrclak.com:8000/6202033 | |
/Library/Caches/com.apple.act.mondWindows: %PROGRAMDATA%\\wt.exeLinux: /tmp/ld.py | |
jasonsaayman(被劫持)、nrwise(攻击者小号) |
三、对 OpenClaw 的影响分析
1. 依赖关联分析
OpenClaw 作为 Node.js 生态下的个人 AI 助手项目,其本身并未直接依赖 axios,但它的多个核心功能依赖的第三方 SDK 会间接依赖 axios,且这些依赖的版本范围完全覆盖了本次的恶意 axios 版本:
Slack 集成依赖:OpenClaw 直接依赖的
@slack/web-api@^7.15.0,其自身的依赖声明为axios: ^1.12.0,允许所有 >=1.12.0 且 < 2.0.0 的 axios 版本,恶意的axios@1.14.1完全符合该范围。其他平台 SDK:OpenClaw 内置的飞书、Line 等平台的集成 SDK,同样存在类似的宽松 axios 版本依赖,同样会拉取到恶意版本。
版本锁缺失:OpenClaw 当前的
package.json中,并未通过overrides或resolutions锁定 axios 的具体版本,也没有对 axios 的版本进行强制覆盖。
2. 风险场景
(1)全新安装用户
如果用户在本次攻击事件发生后,全新安装 OpenClaw,npm/yarn/pnpm 等包管理器会自动解析依赖树,拉取 axios 的最新兼容版本,也就是恶意的axios@1.14.1,从而自动执行恶意脚本,植入 RAT 木马,导致用户设备被完全控制,所有本地凭证、环境变量、密钥都可能被窃取。
(2)存量用户更新 / 重装
已经安装了 OpenClaw 的存量用户,如果执行了npm install、npm update或者重新安装依赖的操作,且没有锁定依赖版本,同样会拉取到恶意的 axios 版本,触发攻击。
(3)CI/CD 环境风险
如果 OpenClaw 的 CI/CD 流水线没有禁用 postinstall 脚本,或者没有锁定依赖版本,流水线在执行依赖安装时会直接感染,导致 CI/CD 的密钥、部署凭证被窃取。##
四、修复与防护措施
1. 紧急修复步骤
锁定 axios 安全版本,将 axios 降级到攻击前的安全版本:
# 针对 1.x 分支用户npm install axios@1.14.0# 针对 0.x 分支用户npm install axios@0.30.3添加依赖覆盖,在 package.json 中添加 overrides 配置,强制所有依赖链中的 axios 都使用安全版本:
{"overrides": {"axios": "1.14.0" },"resolutions": {"axios": "1.14.0" }}清理恶意残留,删除可能存在的恶意依赖目录:
rm -rf node_modules/plain-crypto-js禁用脚本安装,重新安装依赖时禁用 postinstall 脚本:
npm install --ignore-scripts2. 风险排查
如果已经安装了受影响的版本,需要执行以下排查:
# 检查是否存在恶意版本npm list axios | grep -E "1\.14\.1|0\.30\.4"ls node_modules/plain-crypto-js根据操作系统检查木马残留文件。
如果确认已经感染,不要尝试原地清理! 需要从干净的备份重建系统,并立即旋转所有本地的凭证:npm 令牌、云账号密钥、SSH 密钥、CI/CD 密钥、环境变量中的所有敏感信息。
3. 长期防护
在 CI/CD 流水线中默认启用
--ignore-scripts,禁止自动执行依赖的 postinstall 脚本,从根源上阻断此类攻击的执行路径锁定所有依赖的版本,使用
package-lock.json、yarn.lock或者pnpm-lock.yaml,避免自动拉取最新的未知版本在网络层阻断攻击者的 C2 服务器通信:
echo"0.0.0.0 sfrclak.com" >> /etc/hostsiptables -A OUTPUT -d 142.11.206.73 -j DROP本文基于 StepSecurity 团队的公开分析报告整理,旨在帮助开源社区用户快速了解事件影响并采取防护措施。
参考资料:
[1] StepSecurity — Axios Supply Chain Attack Analysis
[2] npm Advisory — axios Malicious Versions
夜雨聆风