Red Hat npm供应链攻击事件深度分析:Miasma行动如何渗透32个官方包,七周凭证泄露链曝光

2026年6月1日,Wiz安全研究人员发现一起针对Red Hat @redhat-cloud-services npm命名空间的供应链攻击,代号"Miasma"。攻击者通过七周的凭证窃取链,成功渗透32个官方npm包,影响Red Hat Hybrid Cloud Console的核心前端组件和API客户端。

攻击时间线:七周的静默渗透

Miasma供应链攻击的精妙之处在于其耐心和隐蔽性。与Axios事件中朝鲜黑客的快速投毒不同,Miasma的攻击者花了整整七周时间完成从初始凭证窃取到大规模投毒的全过程。
根据Wiz和CybelAngel安全团队的联合分析,攻击时间线如下:
| 阶段 | 时间 | 活动 |
|---|---|---|
| 初始访问 | 2026年4月中旬 | 窃取npm维护者凭证 |
| 侦察 | 4月下旬-5月中旬 | 分析包结构和发布流程 |
| 凭证升级 | 5月中旬 | 获取CI/CD流水线访问权 |
| 投毒 | 6月1日 | 向32个@redhat-cloud-services包注入恶意代码 |
| 发现 | 6月1日 | Wiz研究人员检测到异常 |
| 响应 | 6月1日-3日 | Red Hat紧急撤销发布并修复 |
攻击者的目标非常明确:@redhat-cloud-services命名空间下的npm包。这些包不是普通的开源库——它们是Red Hat Hybrid Cloud Console的核心前端组件和API客户端,被数以万计的企业开发者用于构建Red Hat混合云管理应用。
攻击向量:凭证窃取链的七个环节

Miasma攻击的凭证窃取链涉及七个关键环节,每个环节都利用了不同的信任假设:
环节1:开发者个人设备入侵。 攻击者通过钓鱼邮件获取了至少一名npm维护者的开发机器访问权。这可能是通过恶意npm包或社会工程学实现的。
环节2:本地凭证提取。 从被入侵的设备中提取npm认证令牌(通常存储在~/.npmrc文件中)和SSH密钥。
环节3:npm账户接管。 使用窃取的令牌直接发布包更新。npm的发布认证机制相对简单——一个有效的npmAuthToken就足以发布新版本。
环节4:CI/CD流水线侦察。 通过分析包的GitHub仓库,攻击者发现了自动化发布流水线的配置,包括GitHub Actions工作流和secrets。
环节5:GitHub Token升级。 利用初始访问获取的信息,攻击者进一步获取了具有更广泛权限的GitHub Personal Access Token。
环节6:批量发布能力。 通过CI/CD流水线的访问权,攻击者可以批量修改和发布多个包,而不需要逐一操作。
环节7:恶意载荷注入。 在获得足够的访问权后,攻击者在32个包的发布流程中注入恶意代码。
# 检查本地npm令牌安全性
# 1. 检查.npmrc文件中的认证令牌
cat ~/.npmrc | grep -i "authToken\|_auth"
# 2. 检查是否有过期或不必要的令牌
npm token list
# 3. 撤销可疑令牌
npm token revoke <token-id>
# 4. 启用npm双因素认证
npm profile enable-2fa auth-and-writes
# 5. 检查包的发布历史
npm view @redhat-cloud-services/frontend-components time --json
受影响包清单与风险评估

@redhat-cloud-services命名空间下的32个受影响包可分为三类:
| 包类型 | 数量 | 功能 | 风险等级 |
|---|---|---|---|
| 前端组件 | 18 | React组件库 | 高 |
| API客户端 | 8 | 后端API通信 | 严重 |
| 工具库 | 6 | 构建和测试工具 | 中 |
关键风险点:
API客户端包:这些包负责与Red Hat Hybrid Cloud Console的后端服务通信。如果被投毒,可以窃取API令牌、修改请求内容或重定向流量到攻击者控制的服务器。
前端组件包:虽然前端代码通常在浏览器中运行(限制了直接的服务器端影响),但被投毒的组件可以实施会话劫持、凭证钓鱼或数据外泄。
构建工具包:这些包在开发者的构建流程中运行,拥有对整个项目的读写权限。如果被投毒,可以在构建过程中修改任意代码。
供应链攻击的检测方法

对于使用了@redhat-cloud-services包的项目,应立即进行以下检查:
// package-lock.json审查脚本
const fs = require('fs');
const lockFile = JSON.parse(fs.readFileSync('package-lock.json', 'utf8'));
const redhatPackages = Object.keys(lockFile.packages || {})
.filter(pkg => pkg.includes('@redhat-cloud-services'));
console.log('Red Hat Cloud Services packages in use:');
redhatPackages.forEach(pkg => {
const info = lockFile.packages[pkg];
console.log(` ${pkg}@${info.version}`);
// 检查是否为受影响版本
// 已修复版本应>=6月3日之后的发布
});
// 检查node_modules中的实际文件
const crypto = require('crypto');
const path = require('path');
function checkPackageIntegrity(pkgPath) {
const packageJson = JSON.parse(
fs.readFileSync(path.join(pkgPath, 'package.json'), 'utf8')
);
const publishTime = packageJson._time || packageJson.publish_time;
// 检查发布时间是否在攻击窗口内(6月1日-3日)
if (publishTime && new Date(publishTime) >= new Date('2026-06-01') &&
new Date(publishTime) <= new Date('2026-06-03')) {
console.log(`[!] SUSPICIOUS: ${pkgPath} published during attack window`);
}
}
# 使用npm audit检查已知漏洞
npm audit --json | python3 -c "
import json, sys
data = json.load(sys.stdin)
vulns = data.get('vulnerabilities', {})
redhat_vulns = {k: v for k, v in vulns.items() if 'redhat' in k.lower()}
if redhat_vulns:
print(f'[!] Found {len(redhat_vulns)} Red Hat related vulnerabilities:')
for name, info in redhat_vulns.items():
print(f' {name}: {info.get(\"severity\", \"unknown\")}')
else:
print('[+] No Red Hat vulnerabilities found in audit')
"
# 检查是否有异常的网络连接
# 在项目目录中搜索可疑的URL
grep -rn "https\?://" node_modules/@redhat-cloud-services/ | \
grep -v "redhat.com\|github.com\|npmjs.org" | head -20
npm供应链安全加固策略

Miasma事件再次证明,npm生态系统面临着系统性的供应链安全挑战。以下加固策略应成为企业JavaScript开发的标准实践:
发布安全:
- 所有npm发布必须通过CI/CD流水线,禁止开发者本地发布
- npm令牌的权限范围应最小化,使用granular access tokens
- 启用npm的双因素认证(2FA),至少对发布操作强制要求
- 使用npm的provenance功能验证包的构建来源
依赖管理:
- 使用lockfile(package-lock.json或yarn.lock)锁定依赖版本
- 定期运行
npm audit并建立漏洞响应流程 - 考虑使用Socket.dev等供应链安全平台监控依赖风险
- 对关键项目使用私有npm registry(如Verdaccio)作为代理和缓存
CI/CD安全:
- GitHub Actions的secrets应定期轮换
- 使用OIDC(OpenID Connect)替代长期有效的PAT
- 限制CI/CD流水线的权限范围(最小权限原则)
- 对发布步骤添加人工审批环节
| 加固措施 | 实施成本 | 安全收益 | 适用场景 |
|---|---|---|---|
| CI/CD发布强制 | 低 | 高 | 所有项目 |
| 2FA认证 | 低 | 高 | 所有npm账户 |
| lockfile锁定 | 无 | 高 | 所有项目 |
| 私有registry | 中 | 极高 | 企业级项目 |
| 依赖审计自动化 | 低 | 高 | 所有项目 |
| 发布人工审批 | 中 | 极高 | 关键基础设施 |
与Axios供应链攻击的对比
Miasma和2026年3月的Axios供应链攻击是同一时期两个标志性的npm供应链安全事件,但攻击手法和目标有显著差异:
| 对比维度 | Miasma(Red Hat) | Axios |
|---|---|---|
| 攻击者 | 未确认 | 朝鲜Lazarus组织 |
| 攻击目标 | 企业基础设施包 | 高下载量通用库 |
| 凭证窃取 | 七周渐进式 | 快速账户接管 |
| 影响范围 | 32个企业包 | 1亿+周下载量 |
| 攻击动机 | 可能是APT | 经济利益+情报 |
| 发现方式 | 主动检测 | 社区报告 |
Miasma的攻击更具APT特征——缓慢、精准、目标明确。这表明供应链攻击正在从"广撒网"模式向"精确打击"模式演进。攻击者不再满足于污染高下载量的通用库,而是直接瞄准企业关键基础设施的依赖包。
企业响应清单
如果您的项目使用了@redhat-cloud-services包,请按以下优先级执行响应:
- 立即:检查package-lock.json中是否有攻击窗口期(6月1-3日)发布的版本
- 24小时内:更新到Red Hat官方确认的安全版本
- 72小时内:审查项目中是否有异常的网络请求或文件变化
- 一周内:建立依赖审计自动化流程
- 持续:订阅npm安全公告和Red Hat安全通告
# 快速检查脚本
#!/bin/bash
echo "=== Miasma供应链攻击影响检查 ==="
echo "[1] 检查package.json中的Red Hat依赖..."
grep -r "redhat-cloud-services" package.json package-lock.json 2>/dev/null
echo "[2] 检查node_modules中的实际版本..."
ls -la node_modules/@redhat-cloud-services/ 2>/dev/null || echo "未安装Red Hat包"
echo "[3] 检查npm audit..."
npm audit 2>/dev/null | grep -i "redhat\|high\|critical" | head -10
echo "[4] 检查最近的npm发布..."
for pkg in $(ls node_modules/@redhat-cloud-services/ 2>/dev/null); do
echo " $pkg: $(cat node_modules/@redhat-cloud-services/$pkg/package.json | python3 -c 'import json,sys; print(json.load(sys.stdin).get(\"version\",\"?\"))' 2>/dev/null)"
done
echo "=== 检查完成 ==="
数据来源与参考文献
- Wiz. "Miasma Supply Chain Attack: the Seven-Week Credential Trail." CybelAngel, 2026-06. https://cybelangel.com/blog/miasma-supply-chain-attack-the-seven-week-credential-trail/
- npm. "@redhat-cloud-services Package Registry." npm, Inc. https://www.npmjs.com/org/redhat-cloud-services
- Red Hat. "Red Hat Product Security Center." Red Hat, Inc. https://access.redhat.com/security/
- Socket.dev. "npm Supply Chain Security." Socket Security. https://socket.dev/
- GitHub. "Supply Chain Security Best Practices." GitHub Docs. https://docs.github.com/en/actions/security-guides
更新时间: 2026-06-26
评论