在现代软件开发流程中,持续集成和持续交付(CI/CD)平台扮演着至关重要的角色,它们帮助团队快速、高效地自动化构建、测试和部署应用程序。谷歌的Cloud Build作为一款托管的无服务器CI/CD平台,因其对多种源代码管理系统的支持和便捷的集成体验而被广泛采用。然而,2024年底一位安全研究员Adnan Khan发现了Google Cloud Build与GitHub集成中的一个微妙但严重的竞态条件漏洞,该漏洞可以绕过评论控制这一安全机制,导致未经维护者充分审核的代码被构建并执行。此漏洞因影响深远,最终获得了高达3万美元的漏洞奖金。本文将深入剖析该漏洞的技术细节、其产生的安全风险以及谷歌针对该问题所采取的修复措施,为开发者和安全从业者提供有价值的参考。谷歌Cloud Build与GitHub的集成机制是理解漏洞前提。
Cloud Build允许用户通过配置触发器,在GitHub事件发生时自动执行构建任务。针对PR(Pull Request,拉取请求)的触发器是最常见的一类,当外部贡献者提交代码变更时,构建自动启动以验证变更的正确性和安全性。为了防止来自无写权限用户的恶意代码直接触发管道执行,Cloud Build引入了“评论控制”功能。它要求具有写权限的维护者在PR中发表评论“/gcbrun”来授权构建。这样一来,只有经过信任的维护者确认的PR才会启动构建,从而防止“中毒管道执行”(Poisoned Pipeline Execution)风险。然而,Adnan Khan发现了评论控制落入TOCTOU(时间检查到时间使用)竞态条件陷阱。
该漏洞核心在于当维护者发表评论后,Cloud Build从GitHub API获取拉取请求的最新Commit SHA却处于一个时间窗口,这中间攻击者可以快速推送新的恶意提交替换原有代码,从而绕过维护者的代码审查,诱导管道构建并执行恶意代码。具体而言,GitHub Issue Comment事件没有携带拉取请求的Commit SHA,仅包含PR编号。因此,Cloud Build必须调用额外API查询最新的PR头部SHA。当维护者评论“/gcbrun”时,攻击者可实时监控该评论,一旦检测到该触发指令,立即往PR分支推送包含恶意cloudbuild.yaml文件的新提交。由于Cloud Build触发时使用的是查询得到的最新SHA,构建执行了恶意代码,达成了一次无声的权限升级和代码注入。为了实验证明这一漏洞,Adnan Khan搭建了示范环境,通过编写轮询脚本每200毫秒检测PR评论。
一旦检测到维护者的“/gcbrun”激活指令,脚本立刻推送恶意构建配置,成功赢得了这场微妙的竞速赛。谷歌Cloud Build随后启动构建执行,结果验证了攻击的可行性。该漏洞的影响不容小觑。在复杂的CI/CD流水线中,构建任务通常具备访问敏感凭据、发布构建产物甚至修改生产环境配置的权限。一旦被恶意拉取请求控制,攻击者能够藉此盗取密钥、注入后门或发起更大规模的攻击。谷歌作为 Cloud Build 的开发者,广泛使用该平台管理旗下多个开源仓库,问题的安全隐患自然被高度重视。
漏洞报告之后,谷歌迅速响应并于数月内推出多维度修复方案,增强了评论控制机制的安全防范能力。谷歌修复的核心在于添加了基于时间戳的延迟限制。具体实现是当发现新的提交后,Cloud Build会强制等待至少5秒的时间,使这段时间内的新提交无法被立即触发构建。这样即便攻击者在维护者评论与构建触发之间提交恶意代码,也无法绕过系统的触发时序限制。与此同时,谷歌引入了全量Commit SHA的确认流程,要求维护者在触发构建时指明具体的SHA值,防止因时间戳精度问题导致维护者意外授权给错误的提交版本。此外,谷歌还强化了对提交时间的校验,阻止伪造Commit时间戳以规避限制的伎俩。
漏洞修复后,Adnan Khan进行了多次尝试绕过延期机制,包括利用评论Webhook时间戳的秒级粒度限制和提交时间戳伪造,均未成功,显示谷歌的防御措施具有良好的实用性和健壮性。该事件凸显了CI/CD系统安全的重要性,特别是在多方协同开发、开源和内源代码托管环境中,复杂的权限边界和触发机制容易引入难以察觉的安全风险。开发团队应深入理解GitHub的安全模型和系统集成边界,确保所有审批和触发操作严格绑定到不可变的代码提交标识,避免任何因时间差异导致的权限提升。此外,代码审计流程应结合自动化与人工审核,建立多重防御层级。一旦人机交互审批介入,触发流程应设计为不可逆且精确绑定于特定版本,防止恶意代码趁虚而入。对于安全研究人员而言,本案例提醒应重视时序相关的竞态条件问题,尤其是在分布式系统与外部API调用交互频繁的场景下。
漏洞不仅仅是代码错误,更是系统整体协作机制的安全边界测试。正确解读文档、深入理解设计逻辑并构建可重复测试环境,是寻找类似漏洞的关键。谷歌此次对外公开漏洞报告与修复细节,也为整个开源社区和业界带来了宝贵的经验和启示,彰显了负责任披露及协作的重要性。总结来说,“Who's SHA Is It Anyway?”漏洞是云构建领域一个典型的TOCTOU竞态条件案例,提醒所有使用自动化构建系统的开发者和运营团队严格管理触发的审批逻辑和安全边界。采取时间锁定、全量SHA确认及多因素审批等措施,可有效防止恶意代码绕过检查直接执行。此外,定期审查集成流程安全设计、保持对最新安全漏洞的敏感度也至关重要。
未来,随着自动化程度提升与跨平台集成复杂化,类似安全隐患会更加普遍,唯有持续提升技术认知和防护能力,才能保障持续集成环境的安全稳定。