加强供应链安全:为下一次恶意软件行动做准备

发布: (2025年12月24日 GMT+8 07:52)
11 min read

Source: GitHub Blog

概述

开源生态系统仍然面临 有组织、适应性的供应链威胁,这些威胁通过 被泄露的凭证恶意的包生命周期脚本 传播。最近的例子是多波次的 Shai‑Hulud 攻击活动。

我们看到的情况

  • 快速学习: 对手迅速适应其战术。
  • 针对性维护者工作流: 攻击者聚焦于包维护的人为和流程要素。
  • 信任边界利用: 利用发布流水线注入恶意代码。

持久的教训

  1. 假设泄露: 将每个凭证视为可能已被泄露。
  2. 保护流水线: 对谁可以发布以及可以运行哪些脚本实施严格控制。
  3. 监控异常: 关注 CI/CD、发布和凭证使用中的异常活动。

可操作的建议

  • 定期轮换凭证 并将其存储在机密管理器中。
  • 为所有维护者账户启用双因素认证 (2FA)
  • 限制写入权限 仅授予需要的人员;遵循最小权限原则。
  • 在合并或执行之前审计包生命周期脚本
  • 实施供应链扫描 工具,以检测恶意代码模式。
  • 设置警报,以监控包下载量或发布频率的突增。

展望前景

我们将在接下来的两个季度扩展 npm 安全路线图,内容包括:

  • 加强的 凭证泄漏检测 机制。
  • 新的 策略即代码 功能,用于自动执行安全规则。
  • 改进的 可视性,以了解依赖来源和完整性检查。

本文提炼了持久的经验教训和行动,帮助维护者和组织加固系统并为下一次攻击做好准备——不仅仅是应对上一次。

最近的 Shai‑Hulud 攻击活动

Shai‑Hulud 是一场针对 JavaScript 供应链的协调式、多波次攻击。它已从机会主义的妥协演变为工程化、针对性的攻击。

第 1 波 – 被妥协的维护者账户

  • 向包中注入恶意的 post‑install 脚本
  • 目标:将恶意代码渗透到依赖中,窃取机密,并自我复制。
  • 展示了单一立足点如何在生态系统中产生连锁效应。

第 2 波 – Shai‑Hulud 2.0

  • 自我复制 功能升级,可实现跨受害者的凭证泄露。
  • 通过自托管 runner 注册添加 端点指挥控制
  • 收集更广泛的机密以推动进一步传播,并引入破坏性功能。
  • 重点转向 CI 环境
    • 检测自身是否在 CI 流水线中运行。
    • 对特定构建代理实施特权提升技术。
  • 使用 多阶段载荷,比第一波载荷更难检测。
  • 变体之间的时间间隔缩短,表明对手组织有序,研究社区防御并快速迭代。

各波的共同特征

  • 凭证相关的妥协

    • 通过被盗的凭证或 OAuth 令牌获取初始立足点。
    • 进一步收集其他机密(npm 令牌、CI 令牌、云凭证)。
    • 实现跨组织、跨后续波次的复用,避免单点失效。
  • 安装时执行并进行混淆

    • 在包(或依赖链)中注入恶意的 post‑install 或生命周期脚本。
    • 载荷在特定条件下激活(例如环境检查、组织范围)。
    • 数据外泄技术针对运行时环境进行定制。
  • 针对受信任的命名空间和内部包名

    • 受影响的是流行且受信任的包。
    • 被感染的包以已有名称发布。
    • 第 2 波通过修补版本号伪装成合法更新,混入正常的维护者活动。
  • 快速迭代并围绕防御进行工程化

    • 变体之间间隔短。
    • 有意更改以规避之前的缓解措施。
    • 目标是保持持久访问并实现规模化传播,而非一次性机会主义。
  • 审查发布流水线中的盲点

    • 源代码与发布产物之间存在不一致。
    • 生命周期脚本和构建时转换会产生漏洞。
    • 若缺乏产物验证或分阶段审批,注入的行为可能悄然通过。

结论

最近的波次再次强调,防御者必须 主动加固发布模型和凭证流,而不是仅针对单一变体制定缓解措施。对产物进行持续验证、严格的 CI 流水线控制以及对凭证的警惕管理,都是破坏 Shai‑Hulud 供应链威胁的关键。

npm 的下一步

我们正在加速安全路线图,以应对不断演变的威胁形势。接下来,我们的首要任务是添加以下支持:

  • 批量 OIDC 入职 – 精简工具,帮助组织在大规模上将数百个包迁移到受信任的发布。
  • 扩展的 OIDC 提供商支持 – 为 GitHub Actions 和 GitLab 之外的更多 CI 提供商添加支持。
  • 分阶段发布 – 一种新的发布模型,让维护者在包上线前拥有审查期,并通过 MFA 验证的包所有者批准。这使团队能够在更改到达下游用户之前捕获意外更改——这是社区多年来一直在请求的功能。

这些投资为维护者提供了更强大、更灵活的工具,以在发布过程的每个阶段保护他们的包。

GitHub 与 npm 用户和维护者的建议

恶意软件(如 Shai‑Hulud)常通过向 npm 包注入恶意代码进行传播。代码会在安装期间执行,进而危及安装该包的任何用户。由于 npm 包通常拥有大量依赖,攻破单个包可能间接影响许多其他包。攻击者还可能囤积被窃取的令牌,并在数周或数月后发起新一轮攻击。

以下是我们核心建议的简要概述。欲获取更深入的分析和更多指导,请参阅下文的“参考资料”章节。

给所有人的建议

  • 为所有账户启用防钓鱼的 MFA,尤其是以下包管理平台的账户:

  • 设置令牌过期日期 并定期轮换。组织可以强制执行 最大生命周期策略

  • 审计并撤销 未使用的 GitHub/OAuth 应用的访问权限。

  • 在沙箱环境中开发(例如 GitHub Codespaces、虚拟机或容器),以限制意外执行的恶意软件的影响。

给维护者的建议

  • 启用分支保护,防止直接推送到主分支,即使攻击者获得了有效令牌。

  • 使用受信任的发布 而非长期令牌。受信任的发布已在以下平台提供:

    • npm
    • PyPI
    • RubyGems
    • NuGet
  • 锁定 CI 依赖,启用代码扫描,并及时处理所有警报:

    • 锁定依赖:
    • 代码扫描:
    • 处理警报:
  • 验证已发布的制品(例如使用子资源完整性(SRI)或制品构建证明),确保分发的 tar 包/捆绑包与源码一致:

    • SRI:
    • 制品证明:

如果您怀疑账户被攻破,请联系 GitHub Support 获取帮助。

参考文献

作者简介

Madison Oliver

Madison Oliver 是一位漏洞透明度倡导者,现任 GitHub 高级安全经理,负责 Advisory Database 的策展工作。她热衷于漏洞报告、响应与披露,并共同主持相关的开源安全基金会(OpenSSF)工作组,同时在 CVE 项目委员会任职。她的观点受益于此前在 GitHub 担任产品事件响应分析师以及在卡内基梅隆大学软件工程研究所 CERT 协调中心担任漏洞协调员的经验。

相关帖子

(未列出)

Explore more from GitHub

Docs 文档
您需要的所有 GitHub 知识,一站式掌握。
前往文档 →
GitHub GitHub
在 GitHub 上构建下一个创新项目,这里是任何人、任何地点构建任何事物的地方。
开始构建 →
Customer stories 客户案例
了解使用 GitHub 的公司和工程团队。
了解更多 →
The GitHub Podcast GitHub 播客
收听覆盖开源开发者社区话题、趋势、故事和文化的播客。
立即收听 →
Back to Blog

相关文章

阅读更多 »