Hotdry.

Article

Red Hat Cloud Services npm供应链攻击:检测机制与企业级响应实践

分析Red Hat Insights团队检测云环境中恶意npm包的技术机制,涵盖依赖图谱扫描、行为特征识别与企业级供应链安全响应流程。

2026-06-02security

事件背景与攻击概览

2026 年 6 月 1 日,安全厂商 StepSecurity 与 Sonatype 先后披露,Red Hat Cloud Services 旗下的@redhat-cloud-services npm 命名空间遭受大规模供应链攻击。攻击者通过劫持 CI/CD 发布流程,向 30 余个核心 npm 包植入了恶意代码,包括typesfrontend-componentsrbac-clienthost-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.0api.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.jsonSessionStart钩子
  • VS Code:写入.vscode/tasks.jsonfolderOpen任务触发器

检测技术机制

依赖图谱扫描

包元数据异常检测

  • 文件大小阈值:监控index.js等入口文件超过 100KB 的异常(本次攻击达 4.2MB)
  • 生命周期脚本审计:标记包含preinstallpostinstall等安装时脚本的包进行人工复核
  • 版本发布频率:检测短时间内连续发布多个版本的异常行为(本次攻击中多个包在数小时内连发 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 小时)

  1. 立即隔离受影响的 CI/CD 流水线和开发者工作站
  2. 在私有 registry 层面阻断所有受影响版本的下载
  3. 暂停使用@redhat-cloud-services命名空间下的所有包,回滚至上一个已知安全版本

第二阶段:调查(2-24 小时)

  1. 扫描范围:package.json、lockfile、SBOM、包缓存、容器镜像中的受影响包版本
  2. 日志审查:检查 CI/CD 日志中是否执行了安装时脚本
  3. 凭证审计:审查 GitHub、npm、云平台的审计日志,查找异常 token 使用、仓库变更、工作流编辑或包发布
  4. 影响评估:确定哪些开发者工作站和 CI/CD 环境可能已执行恶意代码

第三阶段:清除(24-72 小时)

  1. 从干净环境轮换所有暴露的凭证
  2. 重建无法排除受感染可能的 CI/CD runner、容器和开发者系统
  3. 移除恶意包建立的持久化机制(Claude Code 钩子、VS Code 任务)

第四阶段:恢复与加固(72 小时后)

  1. 实施包版本冷却期策略:新发布版本延迟 24-72 小时后才允许使用
  2. 部署私有 registry 安全代理:在公共 registry 和内部基础设施之间建立策略执行层
  3. 启用实时包风险评分:基于 AI 的包分析,在数分钟内识别可疑发布
  4. 建立供应链安全监控:持续监控命名空间变更、维护者账户异常、发布流程异常

可落地参数清单

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 配置和实时包风险评分,组织可以在攻击扩散前建立有效的防御纵深。供应链安全不再是单纯的依赖管理问题,而是需要集成静态分析、动态监控和事件响应的端到端安全工程实践。


资料来源

security

内容声明:本文无广告投放、无付费植入。

如有事实性问题,欢迎发送勘误至 i@hotdrydog.com