标签 CI/CD安全 下的文章

亚马逊网络服务(AWS)CodeBuild中的一项关键配置错误,可能导致攻击者完全接管该云服务提供商自身的GitHub仓库(包括其AWS JavaScript SDK),从而使每个AWS环境面临风险。

该漏洞已被云安全公司Wiz命名为CodeBreach。AWS在2025年8月25日收到负责任披露后,已于2025年9月修复此问题。

"通过利用CodeBreach,攻击者可能注入恶意代码以发起平台级入侵,不仅可能影响无数依赖该SDK的应用程序,还可能威胁控制台本身,危及每个AWS账户,"研究人员Yuval Avrahami和Nir Ohfeld在与The Hacker News分享的报告中表示。

Wiz指出,该漏洞源于持续集成(CI)管道中的一个弱点,可能使未经身份验证的攻击者侵入构建环境,泄露GitHub管理员令牌等特权凭证,然后利用这些凭证向受感染的仓库推送恶意更改——从而为供应链攻击开辟途径。

换言之,该问题破坏了AWS引入的webhook过滤器机制,这些过滤器原本用于确保只有特定事件才能触发CI构建。例如,AWS CodeBuild可以配置为仅当代码更改提交到特定分支时,或当GitHub或GitHub Enterprise Server账户ID(即ACTOR_ID或参与者ID)与正则表达式模式匹配时才触发构建。这些过滤器旨在防范不受信任的拉取请求。

此配置错误影响了以下AWS管理的开源GitHub仓库,这些仓库配置为在拉取请求时运行构建:

  • aws-sdk-js-v3
  • aws-lc
  • amazon-corretto-crypto-provider
  • awslabs/open-data-registry

这四个项目虽然实施了ACTOR_ID过滤器,但存在一个"致命缺陷":它们未包含两个确保精确正则表达式匹配所必需的字符——即起始锚点^和结束锚点$。相反,正则表达式模式允许任何作为已批准ID(例如755743)超字符串的GitHub用户ID绕过过滤器并触发构建。

由于GitHub按顺序分配数字用户ID,Wiz表示能够预测新用户ID(目前为9位)大约每五天就会"覆盖"一位受信任维护者的六位ID。这一发现,结合使用GitHub Apps自动化创建应用程序(进而创建相应的机器人用户),使得通过触发数百个新机器人用户注册来生成目标ID(例如226755743)成为可能。

获得参与者ID后,攻击者现在可以触发构建并获取aws-sdk-js-v3 CodeBuild项目的GitHub凭证——一个属于aws-sdk-js-automation用户的个人访问令牌(PAT),该令牌对仓库拥有完全管理员权限。

攻击者可以利用这种提升的访问权限直接向主分支推送代码、批准拉取请求并窃取仓库机密,最终为供应链攻击创造条件。

"上述仓库为AWS CodeBuild webhook过滤器配置的正则表达式本意是限制受信任的参与者ID,但存在不足,使得可预测获取的参与者ID能够获得受影响仓库的管理权限,"AWS在今天发布的公告中表示。

"我们可以确认,这些是这些仓库webhook参与者ID过滤器中的项目特定配置错误,而非CodeBuild服务本身的问题。"

亚马逊还表示已修复已发现的问题,并实施了额外的缓解措施,例如凭证轮换以及保护包含GitHub令牌或内存中任何其他凭证的构建流程的步骤。该公司进一步强调,未发现CodeBreach在野外被利用的证据。

为降低此类风险,必须确保不受信任的贡献不会触发特权CI/CD管道,具体措施包括:启用新的Pull Request Comment Approval构建门控、使用CodeBuild托管运行器通过GitHub工作流管理构建触发器、确保webhook过滤器中的正则表达式模式被锚定、为每个CodeBuild项目生成唯一的PAT、将PAT权限限制在最低必要范围,并考虑使用专用的无特权GitHub账户进行CodeBuild集成。

"此漏洞是一个教科书般的案例,说明了为什么攻击者以CI/CD环境为目标:一个微妙且容易被忽视的缺陷可能被利用以产生巨大影响,"Wiz研究人员指出。"复杂性、不受信任的数据和特权凭证的结合,为无需事先访问即可造成高影响入侵创造了完美条件。"

这并非CI/CD管道安全首次受到关注。去年,Sysdig的研究详细说明了如何利用与pull_request_target触发器相关的不安全GitHub Actions工作流,通过单个分叉拉取请求泄露特权GITHUB_TOKEN并获取对数十个开源项目的未授权访问。

Orca Security的一项类似的两部分分析发现,谷歌、微软、英伟达及其他财富500强公司的项目中存在不安全的pull_request_target配置,可能允许攻击者运行任意代码、窃取敏感机密并向受信任分支推送恶意代码或依赖项。这一现象被称为pull_request_nightmare。

"通过滥用通过pull_request_target触发的配置错误的工作流,攻击者可以从不受信任的分叉拉取请求升级为在GitHub托管甚至自托管运行器上执行远程代码(RCE),"安全研究员Roi Nisimi指出。

"使用pull_request_target的GitHub Actions工作流绝不应在没有适当验证的情况下检出不受信任的代码。一旦这样做,它们就面临完全被入侵的风险。"

 Sara Martinez 在Online TestConf上的演讲“确保软件安全”中说到,一个安全的软件开发生命周期意味着将安全融入到计划、设计、构建、测试和维护各个阶段,而不是在最后阶段才匆忙添加。测试人员不是漏洞查找者,而是早期的防御者,从第一个冲刺开始构建安全性和质量。文化第一,自动化第二,全程持续测试和监控;她认为,这就是如何让安全成为一种习惯,而不是紧急演练的方式。

 

通用弱点枚举(Common Weakness Enumeration, CWE)统计数据显示,超过 85%的软件弱点来自于我们如何实现代码,大约 60%可以追溯到设计决策。Martinez 说,这意味着产品的基础、架构和构建方式对产品的安全性有着巨大的影响。她补充说,一旦产品上线,就要密切关注它,运行漏洞扫描,并在问题出现时尽快修补,以领先于攻击者。

 

安全的软件开发生命周期看起来很像常规的 SDLC,但每个步骤都内置了安全性,Martinez 解释道:

 

* 它首先定义明确的安全需求,并在规划和设计时运行威胁建模。

* 在开发过程中,遵循安全编码实践,审查依赖关系,并使用安全测试自动化工具或依赖项* 扫描器来尽早捕获弱点。

* 测试超越了 DAST、渗透测试和其他安全检查的功能,以发现真正的攻击路径。

* 一旦产品上线,你就可以通过安全部署、持续监控和快速补丁管理来保证它的安全。

 

Martinez 认为,安全的软件从文化开始,就像质量一样。这不是一个清单,而是关于开发者、测试人员、运维人员和管理人员之间的责任分担:

 

每个公司都应该创建适合其产品的行动计划,查看安全软件开发指南,并确保安全实践是日常工作的一部分。自动化是关键;将安全分析工具引入 CI/CD 管道,以便及早和一致地发现弱点。

 

Martinez 提到不要忘记测试的人为方面:添加与安全需求相关的特定功能测试用例,以便团队保持对诸如弱输入验证、风险角色和权限配置或访问控制等问题的警觉。

 

Martinez 说,许多最严重的事件仍然来自旧的、众所周知的攻击,我们可以通过正确的工具和实践来预防这些攻击。现在,我们面临着新的挑战,比如与 AI 相关的漏洞,它们正在重塑格局:

 

例如,许多公司正在使用 AI 来生成代码,但他们没有扫描它或应用安全开发实践,因此他们最终将已知的漏洞引入到他们的产品中。

 

我学到了很多,但我知道我永远也学不完。安全性是一个移动的目标,安全性测试是一个持续的挑战,这正是使它成为一个如此迷人、不断变化的世界的原因。

 

InfoQ 就软件安全问题采访了Sara Martinez

 

InfoQ:测试人员在安全方面扮演什么角色?

 

Sara Martinez:测试员是我们拥有的最好的安全秘密武器之一。我认为我们的角色不仅仅是检查功能是否有效;我们很容易注意到可能变成大漏洞的小问题,比如弱输入验证、有风险的角色和权限配置,或者访问控制。

 

团队需要在安全软件开发生命周期(SSDLC)中共担安全责任,比如挑战安全需求、帮助进行威胁建模,以及运行静态和动态安全自动扫描以尽早发现问题。测试人员可以通过确保快速验证修复并集成到 CI/CD 中来保持管道中的安全性。

 

InfoQ:我们有哪些关于漏洞和弱点的数据,我们如何使用这些数据?

 

Martinez:像 CWE (Common Weakness Enumeration)和 CVE (Common Vulnerabilities and Exposures)这样的数据标准为我们提供了一种描述软件弱点和现实世界漏洞的共享语言。这些数据不仅仅用于报告;自动化扫描器实际上使用这些引用来检测代码和正在运行的应用程序中的漏洞。

 

我认为这也是发现攻击者趋势的好方法。在过去的几年里,顶级 CVE 一直被跨站点脚本(XSS)和 SQL 注入等问题所主导,这些问题继续影响着很大比例的软件产品。使用这些数据可以帮助团队确定测试的优先级,关注安全编码实践,并对攻击者真正利用的东西保持警惕。

 

https://www.infoq.com/news/2026/01/ensure-software-security/