axiosnpm供应链投毒攻击事件分析报告

admin 2026-04-13 05:48:49 网络安全文章 来源:ZONE.CI 全球网 0 阅读模式

文章总结: 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 文章分类: 供应链安全,漏洞预警,恶意软件,网络安全,威胁情报


cover_image

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、文件路径)在运行时解码,不以明文出现

执行流程(还原后逻辑):

  1. 解码混淆字符串 -> XOR decode -> Base64 decode -> 获得 C2 URL 等参数
  2. 检测平台 -> process.platformdarwin / win32 / linux
  3. 分支执行 -> 根据平台选择对应 payload 投放逻辑
  4. 请求 C2 -> HTTP POST http://sfrclak.com:8000/6202033,body: { platform: "product0/1/2" }
  5. 下载二阶段 RAT -> 写入平台特定路径并赋权执行
  6. 自我清除 -> 替换 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]
&nbsp; &nbsp;└─ 下载并解压 [email protected]
&nbsp; &nbsp; &nbsp; └─ 执行 postinstall: node setup.js
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;├─ 解码混淆字符串(XOR+Base64)
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;├─ 检测 process.platform
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;├─ [macOS] 下载 RAT -> /Library/Caches/com.apple.act.mond
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;│ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;AppleScript 执行二进制
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;├─ [Windows] 复制 PowerShell -> %PROGRAMDATA%\wt.exe
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;│ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;写入 %TEMP%\6202033.vbs -> 执行 wt.exe
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;├─ [Linux] 下载 /tmp/ld.py -> nohup python3 /tmp/ld.py &
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;└─ 自清除:删除 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"&nbsp;$(date -u +%Y-%m-%dT%H:%M:%SZ)"
echo"========================================"

# 1. 检查已安装的 axios 版本
echo"[*] 检查 npm 包版本..."
for&nbsp;dir&nbsp;in&nbsp;$(find . /usr/local/lib/node_modules -name&nbsp;"package.json"&nbsp;-path&nbsp;"*/axios/package.json"&nbsp;2>/dev/null);&nbsp;do
&nbsp; ver=$(node -e&nbsp;"console.log(require('$dir').version)"&nbsp;2>/dev/null)
if&nbsp;[[&nbsp;"$ver"&nbsp;==&nbsp;"1.14.1"&nbsp;||&nbsp;"$ver"&nbsp;==&nbsp;"0.30.4"&nbsp;]];&nbsp;then
&nbsp; &nbsp;&nbsp;echo"${RED}[!] 发现恶意 axios 版本:&nbsp;$ver&nbsp;(路径:&nbsp;$dir)${NC}"
&nbsp; &nbsp; FOUND=1
fi
done

# 2. 检查文件系统 IoC
echo"[*] 检查文件系统..."
IOC_FILES=("/Library/Caches/com.apple.act.mond""/tmp/ld.py")
for&nbsp;f&nbsp;in"${IOC_FILES[@]}";&nbsp;do
if&nbsp;[ -f&nbsp;"$f"&nbsp;];&nbsp;then
&nbsp; &nbsp;&nbsp;echo"${RED}[!] 发现恶意文件:&nbsp;$f${NC}"
&nbsp; &nbsp; sha256sum&nbsp;"$f"&nbsp;2>/dev/null || shasum -a 256&nbsp;"$f"
&nbsp; &nbsp; FOUND=1
fi
done

# 3. 检查恶意进程
echo"[*] 检查进程..."
if&nbsp;pgrep -f&nbsp;"com.apple.act.mond"&nbsp;> /dev/null 2>&1;&nbsp;then
echo"${RED}[!] 发现可疑进程: com.apple.act.mond${NC}"
&nbsp; ps aux | grep&nbsp;"com.apple.act.mond"
&nbsp; FOUND=1
fi

if&nbsp;pgrep -f&nbsp;"ld.py"&nbsp;> /dev/null 2>&1;&nbsp;then
echo"${RED}[!] 发现可疑进程: ld.py${NC}"
&nbsp; ps aux | grep&nbsp;"ld.py"
&nbsp; FOUND=1
fi

# 4. 检查网络连接
echo"[*] 检查网络连接..."
if&nbsp;ss -tnp 2>/dev/null | grep -q&nbsp;"142.11.206.73"&nbsp;|| netstat -an 2>/dev/null | grep -q&nbsp;"142.11.206.73";&nbsp;then
echo"${RED}[!] 发现与 C2 (142.11.206.73) 的活跃连接!${NC}"
&nbsp; FOUND=1
fi

# 5. 检查 package-lock.json
echo"[*] 检查 package-lock.json..."
find . -name&nbsp;"package-lock.json"&nbsp;-not -path&nbsp;"*/node_modules/*"&nbsp;|&nbsp;whileread&nbsp;f;&nbsp;do
if&nbsp;grep -q&nbsp;"plain-crypto-js""$f"&nbsp;2>/dev/null;&nbsp;then
&nbsp; &nbsp;&nbsp;echo"${YELLOW}[!]&nbsp;$f&nbsp;中包含 plain-crypto-js 依赖,请核查${NC}"
&nbsp; &nbsp; FOUND=1
fi
done

echo"========================================"
if&nbsp;[&nbsp;$FOUND&nbsp;-eq 1 ];&nbsp;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 |
&nbsp; Where-Object { $_.FullName -match "\\axios\\package\.json" }

foreach ($pkg in $pkgPaths) {
&nbsp; $json = Get-Content $pkg.FullName -Raw | ConvertFrom-Json -ErrorAction SilentlyContinue
&nbsp; if ($json.version -in @("1.14.1","0.30.4")) {
&nbsp; &nbsp; Write-Host "[!] 发现恶意 axios 版本: $($json.version) 路径: $($pkg.FullName)" -ForegroundColor Red
&nbsp; &nbsp; $found = $true
&nbsp; }
}

# 2. 检查文件系统 IoC
Write-Host "[*] 检查文件系统..."
$iocFiles = @(
&nbsp; "$env:PROGRAMDATA\wt.exe",
&nbsp; "$env:TEMP\6202033.vbs",
&nbsp; "$env:TEMP\6202033.ps1"
)
foreach ($f in $iocFiles) {
&nbsp; if (Test-Path $f) {
&nbsp; &nbsp; Write-Host "[!] 发现恶意文件: $f" -ForegroundColor Red
&nbsp; &nbsp; $hash = Get-FileHash $f -Algorithm SHA256
&nbsp; &nbsp; Write-Host " SHA256: $($hash.Hash)"
&nbsp; &nbsp; $found = $true
&nbsp; }
}

# 3. 检查恶意进程
Write-Host "[*] 检查进程..."
$suspProcs = Get-Process | Where-Object { $_.Name -eq "wt" -and $_.Path -like "*ProgramData*" }
if ($suspProcs) {
&nbsp; Write-Host "[!] 发现可疑进程 wt.exe 运行于 ProgramData!" -ForegroundColor Red
&nbsp; $suspProcs | Format-List Name,Id,Path
&nbsp; $found = $true
}

# 4. 检查 C2 网络连接
Write-Host "[*] 检查网络连接..."
$c2Conns = Get-NetTCPConnection -RemoteAddress "142.11.206.73" -ErrorAction SilentlyContinue
if ($c2Conns) {
&nbsp; Write-Host "[!] 发现与 C2 (142.11.206.73) 的活跃连接!" -ForegroundColor Red
&nbsp; $c2Conns | Format-Table -AutoSize
&nbsp; $found = $true
}

# 5. 检查 DNS 解析历史
Write-Host "[*] 检查 DNS 缓存..."
$dnsCache = Get-DnsClientCache | Where-Object { $_.Entry -like "*sfrclak*" }
if ($dnsCache) {
&nbsp; Write-Host "[!] 发现 C2 域名 DNS 解析记录!" -ForegroundColor Red
&nbsp; $dnsCache | Format-Table -AutoSize
&nbsp; $found = $true
}

Write-Host "========================================"
if ($found) {
&nbsp; Write-Host "[结论] 发现感染迹象!请立即按响应手册处置。" -ForegroundColor Red
} else {
&nbsp; Write-Host "[结论] 未发现已知 IoC,仍建议审查 CI/CD 流水线日志。" -ForegroundColor Green
}

3.3 版本降级 / 依赖修复步骤

立即修复:

# 回退到安全版本
npm install [email protected] &nbsp;&nbsp;# 1.x 用户
npm install [email protected] &nbsp;&nbsp;# 0.x 用户

# 删除恶意残留
rm -rf node_modules/plain-crypto-js

# 清理并重新安装(禁止执行 postinstall 脚本)
rm -rf node_modules package-lock.json
npm install --ignore-scripts

锁定版本(固定 package.json):

"axios":&nbsp;"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 &nbsp;&nbsp;# Linux
pfctl -e &&&nbsp;echo"block out to 142.11.206.73"&nbsp;| pfctl -f - &nbsp;&nbsp;# 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 |
&nbsp; 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:参考信源

  1. GitHub Issue #10604(一级信源) https://github.com/axios/axios/issues/10604
  2. StepSecurity 技术分析报告(二级信源) https://www.stepsecurity.io/blog/axios-compromised-on-npm-malicious-versions-drop-remote-access-trojan
  3. Aikido Security(二级信源) https://aikido.dev
  4. Socket.dev(二级信源) https://socket.dev
  5. ITNews.com.au(二级信源) https://itnews.com.au

附录 B:快速处置卡

| 步骤 | 操作 | | — | — | | 1. 检查版本 | cat node\_modules/axios/package.json | | 2. 受影响? | 版本为&nbsp;1.14.1&nbsp;或&nbsp;0.30.4&nbsp;-> 立即执行步骤 3 | | 3. 隔离系统 | 断网,阻断&nbsp;142.11.206.73&nbsp;出站流量 | | 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供应链投毒攻击事件分析报告》

评论:0   参与:  0