Axios 供应链投毒事件 - 服务器全面排查指南
事件背景:2026年7月,axios 官方 npm 包被攻击者入侵,发布了
1.14.1和0.30.4两个恶意版本。安装后会自动植入plain-crypto-js@4.2.1木马包,并在系统层面释放远控木马(RAT)。
目录
- 一、核心威胁说明
- 二、Linux / Debian 系统排查
- 三、Windows Server 系统排查
- 四、各包管理器检查命令速查
- 五、发现中毒后的紧急处置
- 六、入侵指标(IOC)汇总
- 七、总结与建议
一、核心威胁说明
| 项目 | 详情 |
|---|---|
| 恶意 axios 版本 | 1.14.1、0.30.4(部分报道提及 0.30.3) |
| 被植入的木马包 | plain-crypto-js@4.2.1 |
| 恶意脚本行为 | 自动下载并安装远程访问木马(RAT) |
| 受影响平台 | Windows、macOS、Linux 全平台 |
| 安全版本 | 升级到 0.32.0、1.16.0 或更高版本 |
二、Linux / Debian 系统排查
前置条件:需要有
root权限,或至少对项目目录有读取权限。
2.1 全盘搜索恶意依赖包
这是最核心的检测方式:如果 plain-crypto-js 文件夹存在,说明木马已落地。
# 全盘搜索(推荐,最彻底)
find / -name "plain-crypto-js" -type d 2>/dev/null | grep "node_modules"
# 如果项目集中在 /home、/var/www、/opt,可以只扫这些目录(更快)
find /home /var/www /opt -name "plain-crypto-js" -type d 2>/dev/null | grep "node_modules"
# 只搜索当前目录
find . -name "plain-crypto-js" -type d 2>/dev/null | grep "node_modules"
判断标准:
- 有输出 → 存在木马包,已中毒
- 无输出 → 未发现恶意包,暂时安全
2.2 搜索被污染的锁文件
检查项目中是否引用了恶意版本的 axios:
# 全盘搜索所有锁文件中的恶意版本
grep -rE '"axios":.*(1\.14\.1|0\.30\.4)' / --include="package-lock.json" --include="yarn.lock" --include="pnpm-lock.yaml" 2>/dev/null
# 指定常见目录搜索(更快)
grep -rE '"axios":.*(1\.14\.1|0\.30\.4)' /home /var/www /opt --include="package-lock.json" 2>/dev/null
判断标准:
- 有输出 → 有项目的锁文件引用了毒版本,需进一步检查
node_modules是否实际安装了 - 无输出 → 锁文件没有毒版本记录
2.3 检查系统级木马文件
恶意脚本可能在系统目录释放后门,请务必检查以下路径:
# 检查常见的木马释放路径
ls -la /tmp/ld.py 2>/dev/null
ls -la /usr/lib/libsystemd.so 2>/dev/null
# 检查预加载配置文件(重要的后门检测点)
cat /etc/ld.so.preload 2>/dev/null
# 检查该文件指向的库是否正常
file /usr/local/lib/libsnoopy_history.so 2>/dev/null
strings /usr/local/lib/libsnoopy_history.so 2>/dev/null | grep -i snoopy
/etc/ld.so.preload 判断标准:
- 正常(安全):指向常见系统库,如
/usr/lib/x86_64-linux-gnu/libeatmydata.so或 Snoopy 审计工具 - 危险(恶意):指向
/tmp/、/usr/local/lib/下的不常见名称,或包含进程隐藏相关字符串
2.4 检查可疑网络连接
木马通常会外联 C2 服务器,查看当前活跃的网络连接:
# 查看所有 ESTABLISHED 连接(排除本地回环)
netstat -antp | grep ESTABLISHED | grep -v "127.0.0.1"
# 或使用 ss 命令(新版系统推荐)
ss -antp | grep ESTABLISHED | grep -v "127.0.0.1"
判断标准:如果存在连接到陌生海外 IP(非数据库、非第三方服务),需高度警惕。
2.5 检查计划任务持久化
攻击者可能通过 cron 做持久化:
# 查看当前用户的 crontab
crontab -l
# 查看系统级 crontab
cat /etc/crontab
# 查看定时任务目录
ls -la /etc/cron.d/
ls -la /etc/cron.daily/
ls -la /etc/cron.hourly/
2.6 使用应急扫描工具(推荐)
官方发布的自动化扫描器,可一键完成上述所有检查:
# 安装
npm install -g axios-emergency-scanner
# 扫描全系统
axios-scan / --md
# 扫描并自动修复(升级 axios 到安全版本)
axios-scan / --md --fix
# 只扫描指定目录
axios-scan /home --md
备选工具(Bash 脚本):
git clone https://github.com/morph13nd/axios-compromise-scanner.git
cd axios-compromise-scanner
chmod +x shell.sh
./shell.sh /path/to/your/projects
三、Windows Server 系统排查
前置条件:需要管理员权限(Administrator)。
3.1 检查系统级木马文件(最重要)
恶意脚本会在 ProgramData 目录释放 wt.exe 远控木马:
# 检查木马文件是否存在
Test-Path "$env:PROGRAMDATA\wt.exe"
# 如果存在,查看文件详情
Get-ChildItem "$env:PROGRAMDATA\wt.exe" | Format-List *
判断标准:
- 返回
False→ 未发现系统级木马 - 返回
True→ 立即断网,服务器已被攻陷
3.2 全盘搜索恶意依赖包
方法一:扫描所有盘符(耗时较长)
Get-PSDrive -PSProvider FileSystem | ForEach-Object {
Get-ChildItem -Path "$($_.Name):\" -Directory -Recurse -ErrorAction SilentlyContinue -Filter "plain-crypto-js"
} | Where-Object { $_.FullName -match "node_modules" }
方法二:只扫描特定盘符(推荐,更快)
# 只扫描 C 盘和 D 盘
Get-ChildItem -Path C:\,D:\ -Directory -Recurse -ErrorAction SilentlyContinue -Filter "plain-crypto-js" | Where-Object { $_.FullName -match "node_modules" }
# 只扫描 D 盘(如果项目都在数据盘)
Get-ChildItem -Path D:\ -Directory -Recurse -ErrorAction SilentlyContinue -Filter "plain-crypto-js" | Where-Object { $_.FullName -match "node_modules" }
3.3 搜索被污染的锁文件
# 全盘搜索所有锁文件中的恶意版本(较慢)
Get-PSDrive -PSProvider FileSystem | ForEach-Object {
Get-ChildItem -Path "$($_.Name):\" -File -Recurse -ErrorAction SilentlyContinue -Filter "package-lock.json"
} | Select-String -Pattern '"axios":.*(1\.14\.1|0\.30\.4)'
# 只搜索常见项目目录(更快)
$targetPaths = @("D:\Projects", "D:\wwwroot", "C:\inetpub\wwwroot", "C:\Projects")
foreach ($path in $targetPaths) {
if (Test-Path $path) {
Get-ChildItem -Path $path -File -Recurse -ErrorAction SilentlyContinue -Filter "package-lock.json" | Select-String -Pattern '"axios":.*(1\.14\.1|0\.30\.4)'
}
}
3.4 指定目录快速扫描
如果你知道项目存放在具体路径,可以用更精准的命令:
# 只扫描当前目录及其子目录
Get-ChildItem -Path . -Directory -Recurse -ErrorAction SilentlyContinue -Filter "plain-crypto-js" | Where-Object { $_.FullName -match "node_modules" }
# 扫描多个指定目录
$paths = @("D:\ProjectA", "D:\ProjectB", "C:\wwwroot")
foreach ($p in $paths) {
Get-ChildItem -Path $p -Directory -Recurse -ErrorAction SilentlyContinue -Filter "plain-crypto-js" | Where-Object { $_.FullName -match "node_modules" }
}
3.5 使用应急扫描工具(推荐)
# 安装
npm install -g axios-emergency-scanner
# 扫描整个 C 盘(根据实际情况更换盘符)
axios-scan C:\ --md
# 扫描指定目录并自动修复
axios-scan D:\Projects --md --fix
四、各包管理器检查命令速查
检查当前项目或全局已安装的 axios 版本:
| 包管理器 | 检查项目依赖 | 检查全局依赖 | 说明 |
|---|---|---|---|
| npm | npm list axios --depth=0 |
npm list -g axios |
--depth=0 只看顶层依赖 |
| cnpm | cnpm list axios --depth=0 |
cnpm list -g axios |
用法同 npm |
| yarn | yarn list --depth=0 axios 或 yarn why axios |
yarn global list axios |
yarn why 会显示完整路径 |
| pnpm | pnpm list axios --depth=0 |
pnpm list -g axios |
判断标准:版本号为 1.14.1、0.30.4 或 0.30.3 即为恶意版本,需立即升级。
五、发现中毒后的紧急处置
如果确认服务器已被感染,请按以下步骤操作:
第一步:立即断网
# Linux
ifdown eth0 # 或 systemctl stop network
# 或直接拔网线/关闭防火墙
ufw deny out
# Windows
# 在控制面板中禁用网络适配器,或执行:
netsh interface set interface "以太网" admin=disable
第二步:清理木马文件
Linux:
# 清空预加载文件(如果指向恶意库)
> /etc/ld.so.preload
# 删除恶意 .so 库文件
rm -f /path/to/malicious.so
# 删除可能残留的恶意脚本
rm -f /tmp/ld.py
# 清理计划任务中的恶意条目
crontab -e # 手动编辑删除
Windows:
# 删除木马文件
Remove-Item "$env:PROGRAMDATA\wt.exe" -Force
# 检查并删除其他可疑文件
Get-ChildItem "$env:PROGRAMDATA\" -Filter "*.exe" | Where-Object { $_.LastWriteTime -gt (Get-Date).AddDays(-30) }
第三步:清理并重装恶意依赖
# 删除 node_modules 和锁文件
rm -rf node_modules package-lock.json yarn.lock pnpm-lock.yaml
# 清除包管理器缓存
npm cache clean --force
yarn cache clean
pnpm store prune
# 使用安全版本重新安装
npm install axios@1.16.0
# 或
npm install axios@0.32.0
第四步:轮换敏感凭据
作为预防措施,建议轮换所有可能被泄露的凭据:
- 服务器登录密码
- SSH 密钥
- API 密钥 / Token
- 数据库密码
- 云服务 Access Key
第五步:重装系统(如无法彻底清除)
如果木马已被植入内核级别或无法彻底清除,最安全的方案是备份数据后重装系统。
六、入侵指标(IOC)汇总
恶意 npm 包
| 类型 | 名称 | 版本 |
|---|---|---|
| 被污染的包 | axios |
1.14.1、0.30.4、0.30.3 |
| 被植入的木马包 | plain-crypto-js |
4.2.1 |
系统级木马文件路径
| 操作系统 | 路径 |
|---|---|
| Windows | %PROGRAMDATA%\wt.exe |
| macOS | /Library/Caches/com.apple.act.mond |
| Linux | /tmp/ld.py、/usr/lib/libsystemd.so(可疑) |
恶意行为特征
- 自动安装
plain-crypto-js依赖 - 在系统目录释放可执行文件(RAT)
- 建立与 C2 服务器的网络连接
- 可能通过
ld.so.preload(Linux)或计划任务(Windows)做持久化
七、总结与建议
-
核心检测指标:无论什么系统,
plain-crypto-js文件夹是否存在,是最直接的“中毒”判断标准。如果不存在,大概率安全。 -
系统层后门检查:不仅要查 npm 包,还要检查系统级的后门文件(
wt.exe、ld.so.preload等),这些才是攻击者真正长期控制的入口。 -
应急工具优先:官方发布的
axios-emergency-scanner是最省心、最全面的排查方式,建议优先使用。 -
预防为主:
- 定期检查
package-lock.json中的依赖版本 - 使用
npm audit或pnpm audit检查已知漏洞 - 在 CI/CD 中集成依赖安全扫描
- 考虑使用私有 npm 镜像或 registry 代理
- 定期检查
-
保持冷静:如果检测结果是安全的,不必过度恐慌。按流程排查完毕,确认无误后即可恢复正常运维。
免责声明:本文档仅供参考,具体操作请根据实际环境调整。如有疑问,建议咨询专业安全团队。
文章评论