一、事件概述
2026年3月30日,JavaScript生态遭遇重大供应链安全事件。StepSecurity监测发现,广受欢迎的HTTP客户端库 axios 在npm上被发布两个恶意版本:
- axios@1.14.1
— 针对现代1.x用户群
- axios@0.30.4
— 针对遗留0.x分支
攻击者通过 compromised 的axios核心维护者账号(jasonsaayman)手动发布恶意包,绕过正常的GitHub Actions CI/CD流程。这是针对npm top-10包的有史以来最复杂的供应链攻击之一。
二、攻击时间线
攻击经过精心策划,历时约18小时完成部署:
时间 (UTC) | 事件 |
|---|---|
03-30 05:57 | plain-crypto-js@4.2.0 发布 — 干净诱饵包,建立npm发布历史 |
03-30 23:59 | plain-crypto-js@4.2.1 发布 — 植入恶意postinstall脚本 |
03-31 00:21 | axios@1.14.1 发布 — 注入恶意依赖 |
03-31 01:00 | axios@0.30.4 发布 — 39分钟后攻击0.x分支 |
关键特征:
- 恶意依赖提前18小时预置
- 三大操作系统预构建payload
- 双分支39分钟内连续命中
- 全程设计自毁机制
三、攻击技术深度解析
3.1 账号劫持与绕过机制
被攻击账号:
- 账号名:jasonsaayman(axios主要维护者)
- 篡改邮箱:ifstap@proton.me(攻击者控制)
- 攻击方式:获取长期有效的classic npm access token
绕过检测手法:
// 合法版本特征 - OIDC可信发布者"_npmUser": { "name": "GitHub Actions", "email": "npm-oidc-no-reply@github.com", "trustedPublisher": { "id": "github", "oidcConfigId": "oidc:9061ef30-3132-49f4-b28c-9338d192a1a9" }}// 恶意版本特征 - 手动发布"_npmUser": { "name": "jasonsaayman", "email": "ifstap@proton.me" // 无trustedPublisher、无gitHead、无对应GitHub提交}
关键发现:
- axios@1.14.1在GitHub仓库中不存在对应的commit或tag
- 仅存在于npm registry,是典型的"幽灵发布"
- OIDC token无法被盗,攻击者必须获取长期token
3.2 恶意依赖:plain-crypto-js
伪装策略:
属性 | 伪装内容 |
|---|---|
包名 | plain-crypto-js(仿冒crypto-js) |
描述 | "JavaScript library of crypto standards" |
作者 | Evan Vosberg(crypto-js原作者) |
仓库 | github.com/brix/crypto-js |
发布账号 | nrwise / nrwise@proton.me |
攻击载荷:
{"name": "plain-crypto-js","version": "4.2.1","scripts": {"postinstall": "node setup.js"}}
自毁机制:
- 包含 package.md — 干净的package.json存根(版本4.2.0,无postinstall)
- 执行后自动替换真实manifest,消除取证痕迹
3.3 RAT投放器分析
执行流程:
npm install axios@1.14.1/0.30.4↓自动安装依赖 plain-crypto-js@4.2.1↓触发 postinstall: "node setup.js"↓执行混淆的JavaScript投放器↓连接C2服务器↓下载平台特定第二阶段payload↓执行RAT↓自毁:删除恶意文件 + 替换package.json为干净版本跨平台支持:
- macOS 专用payload
- Windows 专用payload
- Linux 专用payload
反取证特性:
- 执行后自动删除自身
- 替换package.json为干净诱饵
- 开发者检查node_modules时无任何异常迹象
四、影响范围评估
4.1 axios生态地位
指标 | 数据 |
|---|---|
周下载量 | 3亿+ |
npm排名 | Top 10 |
使用场景 | React前端、CI/CD工具、服务端API等 |
影响范围 | 几乎所有Node.js/browser HTTP请求 |
4.2 潜在受害场景
高危场景:
1. 开发者执行 npm install 或 npm update
2. CI/CD流水线自动拉取最新依赖
3. Docker镜像构建时安装依赖
4. 生产环境自动部署脚本
攻击后果:
- 系统被植入远程访问木马(RAT)
- 攻击者可完全控制受感染机器
- 敏感代码、密钥、凭证泄露
- 供应链下游项目被进一步污染
五、IOC
142.11.206.73:8000
sfrclak.com
http://sfrclak.com:8000/6202033
nrwise@proton.me
ifstap@proton.me
六、检测与响应
6.1 自查命令
# 检查是否安装恶意版本npm list axios# 查看具体版本npm list axios --depth=0# 检查lock文件grep -A 5 ""axios"" package-lock.json | grep version# 检查plain-crypto-js依赖npm list plain-crypto-js
6.2 感染确认
如果安装了 axios@1.14.1 或 axios@0.30.4,请假设系统已被入侵!
紧急响应步骤:
1. 立即断开网络连接
2. 隔离受感染机器
3. 检查以下位置的异常:
- ~/.npm/_cacache — npm缓存
- node_modules/plain-crypto-js — 恶意依赖
- 系统启动项和计划任务
- 网络连接日志中的可疑C2通信
4. 全盘杀毒扫描
5. 轮换所有凭证(SSH密钥、API密钥、密码等)
6. 从干净备份恢复或重装系统
6.3 安全版本
版本分支 | 安全版本 | 说明 |
|---|---|---|
1.x | ≤1.14.0 或 ≥1.14.2 | 避开1.14.1 |
0.x | ≤0.30.3 或 ≥0.30.5 | 避开0.30.4 |
七、防护建议
7.1 开发者层面
锁定依赖版本
// package.json
"dependencies": {
"axios": "1.14.0" // 精确版本,不使用^或~
}
使用lock文件
确保
package-lock.json/yarn.lock/pnpm-lock.yaml提交到版本控制CI/CD使用
npm ci而非npm install启用依赖审计
npm audit
npm audit fix
使用私有registry或缓存
Verdaccio等私有npm代理
锁定依赖后不再自动更新
7.2 企业层面
- 供应链安全工具
StepSecurity Harden-Runner
Socket.dev
Snyk/Dependabot
OSS-Fuzz
CI/CD安全加固
# GitHub Actions示例
uses: step-security/harden-runner@v2
with:
egress-policy: block
allowed-endpoints: |
registry.npmjs.org:443
依赖审查流程
所有依赖变更需人工审查
监控新发布包的异常行为
建立内部依赖白名单
应急响应预案
快速定位受影响项目
自动化依赖回滚机制
凭证轮换流程
7.3 开源维护者层面
- 启用MFA
npm账号必须启用双因素认证
使用硬件安全密钥
使用OIDC发布
配置npm OIDC Trusted Publisher
废弃classic access token
监控账号异常
邮箱变更告警
非常规时间和IP的发布告警
手动发布告警(如通常使用CI/CD)
发布签名
使用Sigstore/cosign签名发布包
验证发布来源
八、攻击者画像分析
8.1 技术能力评估
能力维度 | 评估 |
|---|---|
供应链理解 | 深度理解npm生态和发布机制 |
社会工程 | 成功获取核心维护者凭证 |
运营安全 | 使用ProtonMail匿名邮箱 |
跨平台开发 | 预构建三大OS的payload |
反取证 | 完善的自毁和伪装机制 |
时间规划 | 18小时精密部署,双分支覆盖 |
8.2 攻击动机推测
- 经济动机
窃取加密货币、API密钥、商业机密
- 间谍活动
针对特定企业或组织的供应链渗透
- 勒索软件
为后续大规模勒索做准备
- APT活动
国家级攻击者的供应链武器化
8.3 与历史事件对比
事件 | 时间 | 相似点 |
|---|---|---|
event-stream投毒 | 2018 | 恶意依赖注入 |
ua-parser-js投毒 | 2021 | 账号劫持发布 |
colors/faker破坏 | 2022 | 知名包被篡改 |
axios投毒 | 2026 | 最复杂的运营级攻击 |
九、行业影响与反思
9.1 供应链安全现状
- 单点故障风险
核心维护者账号成为攻击焦点
- 信任模型缺陷
npm install = 执行任意代码
- 检测滞后性
恶意版本存在数小时才被发现
- 修复成本高
全球数百万项目需紧急响应
9.2 改进方向
- 技术层面
推广Sigstore签名验证
强制OIDC发布机制
依赖隔离和沙箱执行
流程层面
建立供应链安全联盟
共享威胁情报
制定应急响应标准
生态层面
核心项目多维护者机制
资金和资源支持
安全审计常态化
十、总结
axios npm投毒事件是2026年开源供应链安全的标志性事件,展现了攻击者日益精密的运营能力:
关键发现:
- 18小时精密策划,双分支覆盖
- 跨平台RAT,完善的反取证机制
- 针对npm top-10包的成功渗透
- 利用长期access token绕过OIDC保护
核心启示:
1. 供应链安全已成为企业安全的薄弱环节
2. 依赖自动更新策略需要重新评估
3. 开源维护者账号保护刻不容缓
4. 检测和响应能力需要持续提升
紧急提醒:
如果您或您的项目安装了 axios@1.14.1 或 axios@0.30.4,请立即假设系统已被入侵,执行应急响应流程,全面排查和修复。
十一、参考链接
StepSecurity官方报告
https://www.stepsecurity.io/blog/axios-compromised-on-npm-malicious-versions-drop-remote-access-trojanaxios GitHub Issue披露
https://github.com/axios/axios/issues/10604StepSecurity AI Package Analyst - axios@0.30.4
https://app.stepsecurity.io/oss-security-feed/axios?version=0.30.4StepSecurity AI Package Analyst - axios@1.14.1
https://app.stepsecurity.io/oss-security-feed/axios?version=1.14.1StepSecurity Harden-Runner
https://github.com/step-security/harden-runnernpm OIDC Trusted Publishers文档
https://docs.npmjs.com/generating-provenance-statements
声明:本文基于StepSecurity公开披露的技术报告整理,仅供安全研究和防护参考。所有技术细节已做合规处理,不涉及具体漏洞利用代码或攻击工具分发。
声明:本文来自奇安信威胁情报中心,版权归作者所有。文章内容仅代表作者独立观点,不代表安全内参立场,转载目的在于传递更多信息。如有侵权,请联系 anquanneican@163.com。