事件概况
| 属性 | 信息 |
|---|---|
| 事件类型 | npm供应链投毒(账户劫持) |
| 受影响包 | axios@1.14.1、axios@0.30.4 |
| 恶意依赖 | plain-crypto-js@4.2.1 |
| 植入载荷 | 跨平台远控木马(WAVESHAPER.V2) |
| 周下载量 | ~1亿(npm生态 Top 10) |
| 攻击时间 | 2026年3月31日 00:21 - 03:15 UTC |
| 威胁归因 | UNC1069 / Sapphire Sleet(朝鲜关联) |
| 归因来源 | Google Threat Intelligence、Microsoft Threat Intelligence |
2026年3月31日,全球使用最广泛的JavaScript HTTP客户端库之一——Axios,遭遇了一次高度复杂的供应链投毒攻击。攻击者通过劫持Axios核心维护者jasonsaayman的npm账户,连续发布两个携带恶意依赖的版本,利用npm的postinstall钩子机制在开发者执行npm install时静默部署远控木马。
该事件的影响规模堪比2021年的ua-parser-js投毒事件和event-stream事件,是有史以来针对npm Top 10包的最复杂供应链攻击之一。
攻击时间线
| 时间 (UTC) | 事件 |
|---|---|
| 3月30日 05:57 | 攻击者发布无害的 plain-crypto-js@4.2.0(伪装为crypto-js) |
| 3月30日 23:59 | 发布恶意版本 plain-crypto-js@4.2.1(含RAT投放器) |
| 3月31日 00:21 | 使用被劫持账户发布 axios@1.14.1(注入恶意依赖) |
| 3月31日 01:00 | 发布 axios@0.30.4(同样注入恶意依赖) |
| 3月31日 ~03:15 | npm团队下架两个恶意版本 |
| 4月1日 | Google/Microsoft公开威胁归因 |
从恶意版本发布到下架,窗口期约3小时。在此期间执行过npm install且项目依赖axios的开发者和CI/CD管道均面临感染风险。
攻击链分析
第一阶段:账户劫持
攻击者获取了Axios核心维护者jasonsaayman的npm账户凭据,并将账户关联邮箱修改为攻击者控制的ifstap@proton.me。这使攻击者获得了向axios包发布新版本的权限。
第二阶段:恶意依赖注入
攻击者没有直接修改axios的源码,而是采用了更隐蔽的方式——在package.json的dependencies中添加了一个看似无害的加密库依赖:
{
"dependencies": {
"plain-crypto-js": "^4.2.1"
}
}
plain-crypto-js是攻击者预先注册的恶意包,名称模仿了广泛使用的crypto-js库。该包在4.2.0版本中不含恶意代码(用于规避npm审核),在4.2.1版本中才植入恶意载荷。
第三阶段:RAT投放
plain-crypto-js@4.2.1的package.json中包含postinstall钩子:
{
"scripts": {
"postinstall": "node setup.js"
}
}
setup.js是一个4.2KB的混淆Node.js脚本,使用XOR加密(密钥:OrDeR_7077)隐藏真实逻辑。执行后根据操作系统类型下载并运行对应的远控载荷:
macOS:
- 下载RAT到
/Library/Caches/com.apple.act.mond - 通过AppleScript和
/bin/zsh执行 - 伪装为macOS系统服务
Windows:
- 复制PowerShell到
%PROGRAMDATA%\wt.exe - 释放
.ps1和.vbs脚本到临时目录 - 建立持久化机制
Linux:
- 下载Python投放器到
/tmp/ld.py - 通过
nohup python3后台执行
第四阶段:反取证
载荷部署完成后,投放器执行三步清理:
- 删除自身(
setup.js) - 删除恶意
package.json - 将预置的干净存根
package.md重命名为package.json,其中版本号标记为4.2.0
这一手法造成版本号不匹配,使安全扫描工具误判为安全版本,显著增加了检测难度。
C2基础设施与IOC
网络指标
| 类型 | 值 |
|---|---|
| C2 域名 | sfrclak.com |
| C2 IP | 142.11.206.73 |
| C2 端口 | 8000 |
| 载荷URL | http://sfrclak.com:8000/6202033 |
| 回连域名 | packages.npm.org(伪装为npm官方) |
回连路径(按平台)
- macOS:
packages.npm.org/product0 - Windows:
packages.npm.org/product1 - Linux:
packages.npm.org/product2
文件哈希
| 包名 | SHA-1 |
|---|---|
| axios@1.14.1 | 2553649f2322049666871cea80a5d0d6adc700ca |
| axios@0.30.4 | d6f3f62fd3b9f5432f5782b62d8cfd5247d5ee71 |
| plain-crypto-js@4.2.1 | 07d889e2dadce6f3910dcbc253317d28ca61c766 |
本地感染痕迹
| 平台 | 路径 |
|---|---|
| macOS | /Library/Caches/com.apple.act.mond |
| Windows | %PROGRAMDATA%\wt.exe |
| Linux | /tmp/ld.py |
威胁归因
Google Threat Intelligence Group将此次攻击归因于UNC1069,Microsoft Threat Intelligence将其归因于Sapphire Sleet,两者均指向朝鲜关联的以经济利益为动机的威胁组织。
该组织此前已有多次针对开发者和加密货币行业的供应链攻击记录。此次攻击中部署的后门被标记为WAVESHAPER.V2,是该组织已知工具集的升级版本。
检测与排查
快速自查
# 检查是否安装了恶意版本
npm ls axios | grep -E "1\.14\.1|0\.30\.4"
# 搜索恶意依赖(存在即确认感染)
find . -path "*/plain-crypto-js" -type d 2>/dev/null
# 检查lockfile
grep "plain-crypto-js" package-lock.json yarn.lock pnpm-lock.yaml 2>/dev/null
感染痕迹扫描
# macOS
ls -la /Library/Caches/com.apple.act.mond 2>/dev/null
# Linux
ls -la /tmp/ld.py 2>/dev/null
# Windows (PowerShell)
# Test-Path "$env:PROGRAMDATA\wt.exe"
网络层检测
在防火墙/SIEM中检查是否存在以下连接:
- 出站连接到
142.11.206.73:8000 - DNS解析
sfrclak.com - HTTP请求
packages.npm.org/product[0-2]
修复与加固
立即修复
# 降级到安全版本
npm install axios@1.14.0
# 或
npm install axios@0.30.3
# 在package.json中锁定版本,防止自动升级
# "axios": "1.14.0" (去掉^前缀)
如已感染
- 假设完全沦陷 —— 开发机上的所有凭据、密钥、Token均应视为泄露
- 轮换所有密钥 —— 包括npm token、Git凭据、云服务密钥、数据库密码、API密钥
- 检查CI/CD —— 审查构建管道是否拉取过恶意版本,检查构建产物完整性
- 终端取证 —— 保留感染痕迹后重装系统
长期防御
依赖管理策略:
- 使用lockfile锁定依赖版本,避免自动拉取最新版
- 配置npm最小发布年龄策略(建议7天以上)
- 使用
npm install --ignore-scripts禁用postinstall钩子,再手动审查
供应链安全工具:
- 部署Socket.dev、Snyk或Mend等SCA工具监控依赖变更
- 在CI中集成依赖审计:
npm audit - 启用npm的2FA强制策略
组织层面:
- 建立关键依赖清单,监控其维护者账户异常
- 制定供应链安全事件响应预案
- 定期审计
node_modules中的postinstall脚本
总结
Axios投毒事件再次印证了软件供应链安全的脆弱性:一个维护者账户的沦陷,就能影响全球数百万项目。攻击者选择在深夜发布、使用名称伪装、实施反取证清理,展现了国家级APT组织在供应链攻击中的高度专业化。
对于使用npm生态的开发团队,这不是"是否会遇到"的问题,而是"何时遇到"的问题。锁定依赖版本、禁用自动脚本执行、部署依赖监控,是当前最务实的防御策略。
参考链接
- The Hacker News: Axios Supply Chain Attack Pushes Cross-Platform RAT
- StepSecurity: axios Compromised on npm - Malicious Versions Drop RAT
- Microsoft Security Blog: Mitigating the Axios npm supply chain compromise
- Google Cloud Blog: North Korea-Nexus Threat Actor Compromises Axios NPM Package
- SOCRadar: Axios npm Hijack 2026 - Everything You Need to Know