Synth Daily

供应链漏洞攻陷核心 AWS GitHub 仓库,并威胁 AWS 控制台

一个名为 CodeBreach 的关键漏洞被发现,它源于 AWS CodeBuild 持续集成 (CI) 管道中的一个配置疏忽。该漏洞利用了未加锚定的正则表达式过滤器,允许攻击者绕过身份验证,从而接管包括 AWS JavaScript SDK 在内的核心 AWS GitHub 仓库。这构成了严重的供应链威胁,可能危及 AWS 控制台本身以及无数依赖该 SDK 的应用程序。AWS 迅速修复了此问题并加强了安全措施,凸显了保护 CI/CD 环境免受此类攻击的紧迫性。

核心漏洞:一个微小疏忽导致的巨大风险

CI/CD 管道(如 AWS CodeBuild)通常被配置为在开发者提交拉取请求 (Pull Request) 时自动触发构建流程。为了防止恶意代码被执行,系统会使用过滤器来确保只有受信任的开发者才能触发构建。

  • 防护机制: AWS CodeBuild 使用 ACTOR_ID 过滤器,这是一个本应只允许特定 GitHub 用户 ID 触发构建的白名单。
  • 致命缺陷: 该过滤器的规则是基于正则表达式的,但它缺少了用于精确匹配的起始 (^) 和结束 ($) 锚点

这个看似微小的疏忽意味着,安全系统检查的不是攻击者的用户 ID 是否与白名单中的 ID 完全匹配,而是白名单中的 ID 是否包含在攻击者的 ID 之中。

攻击步骤拆解

利用这个漏洞,攻击者可以设计一个多步骤的计划来窃取高权限凭证。

  1. 寻找目标 ID: GitHub 按顺序分配独一无二的用户 ID。这意味着,随着时间的推移,较新的、更长的用户 ID 不可避免地会包含较旧的、更短的用户 ID 作为其一部分。
  2. “日食”攻击: 攻击者将这个机会窗口称为“日食” (eclipse)。他们通过自动化脚本,在精确的时刻大规模注册 GitHub App 机器人账户,从而成功抢注一个包含受信任开发者 ID 的新用户 ID。
  3. 触发恶意构建: 拥有这个特殊的用户 ID 后,攻击者提交一个包含恶意负载的拉取请求。由于 ID 检查存在缺陷,CodeBuild 错误地信任了该请求并触发了构建流程。
  4. 窃取凭证: 恶意负载在构建环境中执行,通过内存转储的方式成功窃取了用于与 GitHub 交互的个人访问令牌 (PAT)

巨大的潜在影响

被窃取的凭证拥有对目标仓库的完全管理员权限,这为大规模供应链攻击打开了大门。

  • 直接控制: 攻击者可以向主分支推送恶意代码、批准任何拉取请求或窃取仓库机密。
  • 攻击 AWS JavaScript SDK: 攻击的主要目标是 aws/aws-sdk-js-v3 仓库。这个 SDK 是一个极其重要的软件库,据分析,三分之二的云环境都包含它。
  • 威胁 AWS 控制台: 最关键的是,AWS 控制台本身也依赖这个 JavaScript SDK。通过在 SDK 中注入恶意代码,攻击者理论上可以危及每一个 AWS 账户,在用户登录控制台时窃取其凭证。

此次事件是一个教科书式的案例,解释了为何攻击者越来越关注 CI/CD 环境:一个容易被忽视的微小配置错误,却可能被利用来造成巨大的破坏。

安全建议与应对措施

虽然 AWS 已修复了该漏洞并增强了 CodeBuild 的安全性,但所有 CI/CD 用户都应吸取教训并采取措施加固自己的系统。

  • 启用构建门控: 使用 AWS 新增的 “拉取请求评论批准” (Pull Request Comment Approval) 功能。这要求必须由授权人员手动批准后,才能触发构建,从而阻止了来自不受信任来源的自动构建。
  • 加固 GitHub 连接:
    • 为每个 CodeBuild 项目生成唯一的、权限收紧的个人访问令牌 (PAT)
    • 严格限制 PAT 的权限,仅授予其完成任务所需的最小权限。
  • 正确使用正则表达式: 如果必须依赖 Webhook 过滤器,请务必确保所有正则表达式模式都使用 ^$ 进行锚定,以强制执行精确匹配。

核心原则: 组织必须遵循一个简单而有力的安全原则——永远不要让来自不受信任贡献者的代码自动触发拥有高权限的构建管道