事件背景与攻击概览
2026 年 6 月 1 日,安全厂商 StepSecurity 与 Sonatype 先后披露,Red Hat Cloud Services 旗下的@redhat-cloud-services npm 命名空间遭受大规模供应链攻击。攻击者通过劫持 CI/CD 发布流程,向 30 余个核心 npm 包植入了恶意代码,包括types、frontend-components、rbac-client、host-inventory-client等关键组件。这些包并非仿冒或钓鱼包,而是拥有真实维护者、长期下载历史和有效元数据的合法包,其被攻破直接动摇了 "知名包 = 安全" 的传统信任假设。
攻击者利用 npm 的preinstall生命周期脚本,在开发者执行npm install时立即触发恶意代码执行,此时应用程序代码尚未运行,开发者几乎无感知。恶意 payload 通过 GitHub Actions 的 OIDC 认证流程发布,表明上游 CI/CD 流水线本身已被完全控制。
恶意 Payload 技术架构分析
四层混淆防御体系
该恶意软件采用了罕见的四层嵌套混淆策略,每层针对不同类型的分析工具:
第一层:ROT-21 凯撒加密
顶层index.js文件大小异常达 4.2MB(正常库包仅数 KB),内容包裹在try { eval(...) } catch(e) {}块中,内部使用 ROT-21(移位 21 的凯撒密码)编码,字符以数值数组形式存储,通过String.fromCharCode动态重建。静默 catch 块确保任何执行错误都不会暴露到开发者控制台。
第二层:AES-128-GCM 加密
解码后得到 1.27MB 的 JavaScript 文件,内含两个 AES-128-GCM 加密 blob:_b(Bun 运行时下载器)和_p(主植入体)。使用硬编码密钥和 IV 解密:
_b密钥:4c26cf9791bce1bfd4b84eba80ce2754,IV:1241582f04234f7192feacba_p密钥:ec514c074caf0ffdce6c66a0e95753d8,IV:1251c3b85365f9b56a956c10
第三层:obfuscator.io 自定义混淆 采用小写优先的自定义 base64 字母表,配合 2,219 条字符串表和 284 次 IIFE 旋转,静态提取必须完整模拟旋转逻辑才能获得正确索引映射。
第四层:B5 自定义密码 使用 20 万次迭代的 PBKDF2 密钥派生,结合 Fisher-Yates 字节置换和 XOR 反馈链,密码和盐本身也经 B5 加密存储于字符串表中。
核心攻击能力
GitHub Actions 内存提取
恶意代码读取/proc/<pid>/mem直接访问Runner.Worker进程内存,利用ACTIONS_RUNTIME_TOKEN查询 GitHub Actions 运行时 API,枚举标记为isSecret: true的环境变量,精准提取日志中被掩码的敏感凭证。
多云凭证收割
覆盖范围包括:GitHub Token、AWS 凭证(环境变量与~/.aws/credentials)、GCP 应用默认凭证、Azure 服务主体、HashiCorp Vault Token、Kubernetes Service Account、npm publish token、SSH 私钥、Docker registry 认证等。
供应链蠕虫传播
利用窃取的 npm token,通过bypass_2fa参数绕过双因素认证,自动发布被篡改的包版本到受害者有权限访问的其他包。每台受感染机器都可自主传播,形成无攻击者参与的自我复制网络。
C2 隐蔽通信
- 主通道:伪装成
python-requests/2.31.0向api.github.com发送 HTTPS 请求,流量与正常 GitHub API 调用不可区分 - 备用通道:GitHub Dead-Drop,利用窃取的
GITHUB_TOKEN通过 GitHub Contents API 在受害者仓库中创建包含 base64 编码数据的 refs 和 commits - C2 池:16 个 GitHub 账户(typhonian、tartarean、erebean 等希腊神话主题命名)随机轮换,单账户封禁无法阻断通信
持久化机制
- Claude Code:注入
~/.claude/settings.json的SessionStart钩子 - VS Code:写入
.vscode/tasks.json的folderOpen任务触发器
检测技术机制
依赖图谱扫描
包元数据异常检测
- 文件大小阈值:监控
index.js等入口文件超过 100KB 的异常(本次攻击达 4.2MB) - 生命周期脚本审计:标记包含
preinstall、postinstall等安装时脚本的包进行人工复核 - 版本发布频率:检测短时间内连续发布多个版本的异常行为(本次攻击中多个包在数小时内连发 3 个版本)
命名空间信誉评估
建立动态信誉评分模型,即使对于@redhat-cloud-services这类高信誉命名空间,新版本发布仍需经过冷却期(cooldown)策略,延迟 24-72 小时后才允许进入生产环境。
行为特征识别
静态分析指标
| 检测维度 | 触发阈值 | 说明 |
|---|---|---|
| 熵值检测 | >7.5 | 高混淆代码的熵值显著高于正常代码 |
| 字符串密度 | <0.1 | 混淆代码的明文字符串比例极低 |
| eval/Function 构造 | >5 次 | 动态代码执行频率异常 |
| 十六进制编码 | >50% | 字符编码异常比例 |
动态行为监控
- 进程内存访问:监控对
/proc/*/mem的读取操作 - 文件系统遍历:检测对
~/.aws、~/.ssh、~/.npmrc等敏感路径的访问 - 网络出站:记录安装阶段的非预期出站连接
- 子进程执行:监控安装时启动 Bun、Node 等运行时
运行时监控与响应
CI/CD 环境加固
- 使用 Harden-Runner 等专用安全代理,在步骤级别监控网络事件、进程执行、文件访问
- 内存读取检测:识别对
Runner.Worker进程内存的访问尝试并立即进入锁定模式 - 最小权限原则:限制 CI/CD token 的权限范围,避免使用具有 package:publish 权限的 token 进行常规构建
开发者工作站监控
- 包安装审计:记录所有开发机器上的 npm 包安装行为
- 配置变更检测:监控
~/.claude/settings.json、.vscode/tasks.json等配置文件的异常修改 - 凭证轮换告警:检测到可疑活动时强制触发凭证轮换流程
企业级响应流程
事件响应 SOP(标准操作流程)
第一阶段:遏制(0-2 小时)
- 立即隔离受影响的 CI/CD 流水线和开发者工作站
- 在私有 registry 层面阻断所有受影响版本的下载
- 暂停使用
@redhat-cloud-services命名空间下的所有包,回滚至上一个已知安全版本
第二阶段:调查(2-24 小时)
- 扫描范围:package.json、lockfile、SBOM、包缓存、容器镜像中的受影响包版本
- 日志审查:检查 CI/CD 日志中是否执行了安装时脚本
- 凭证审计:审查 GitHub、npm、云平台的审计日志,查找异常 token 使用、仓库变更、工作流编辑或包发布
- 影响评估:确定哪些开发者工作站和 CI/CD 环境可能已执行恶意代码
第三阶段:清除(24-72 小时)
- 从干净环境轮换所有暴露的凭证
- 重建无法排除受感染可能的 CI/CD runner、容器和开发者系统
- 移除恶意包建立的持久化机制(Claude Code 钩子、VS Code 任务)
第四阶段:恢复与加固(72 小时后)
- 实施包版本冷却期策略:新发布版本延迟 24-72 小时后才允许使用
- 部署私有 registry 安全代理:在公共 registry 和内部基础设施之间建立策略执行层
- 启用实时包风险评分:基于 AI 的包分析,在数分钟内识别可疑发布
- 建立供应链安全监控:持续监控命名空间变更、维护者账户异常、发布流程异常
可落地参数清单
registry 策略配置
security_policy:
cooldown_period: 72h # 新包版本冷却期
max_package_size: 10MB # 单文件大小限制
blocked_lifecycle_scripts:
- preinstall
- postinstall
required_signatures: true # 要求包签名验证
CI/CD 安全参数
harden_runner:
mode: block # 检测到可疑行为时阻断
monitored_paths:
- /proc/*/mem
- ~/.aws/credentials
- ~/.ssh/*
- ~/.npmrc
egress_policy: block-all # 默认阻断所有出站连接
allowed_endpoints: # 白名单模式
- registry.npmjs.org:443
- github.com:443
监控告警阈值
- 单个包的版本发布频率:>3 个 / 24 小时触发告警
- 安装时网络连接:任何非 registry 域名的出站连接触发阻断
- 进程内存访问:对
/proc/*/mem的任何读取触发立即阻断 - 凭证文件访问:对敏感配置文件的访问记录详细日志
总结
Red Hat Cloud Services npm 供应链攻击事件揭示了现代软件供应链攻击的演进趋势:攻击者不再满足于创建仿冒包,而是直接攻破高信誉命名空间的发布流程。四层混淆技术、内存提取能力、蠕虫传播机制和 GitHub 原生 C2 通信的结合,使得传统安全检测手段面临严峻挑战。
企业防御必须转向 "零信任" 供应链安全模型:即使是来自可信命名空间的包,每个新版本都应被视为独立的风险决策点。通过实施冷却期策略、运行时监控、最小权限 CI/CD 配置和实时包风险评分,组织可以在攻击扩散前建立有效的防御纵深。供应链安全不再是单纯的依赖管理问题,而是需要集成静态分析、动态监控和事件响应的端到端安全工程实践。
资料来源
- StepSecurity 技术分析报告:Multiple redhat-cloud-services npm Packages compromised
- Sonatype 安全公告:Red Hat Cloud Services npm Packages Hijacked
内容声明:本文无广告投放、无付费植入。
如有事实性问题,欢迎发送勘误至 i@hotdrydog.com。