Pentesting CI/CD Methodology
Last updated
Last updated
学习和实践 AWS 黑客技术:HackTricks 培训 AWS 红队专家 (ARTE) 学习和实践 GCP 黑客技术:HackTricks 培训 GCP 红队专家 (GRTE)
VCS 代表 版本控制系统,该系统允许开发人员 管理他们的源代码。最常见的是 git,您通常会在以下 平台 中找到公司使用它:
Github
Gitlab
Bitbucket
Gitea
云提供商(他们提供自己的 VCS 平台)
CI/CD 管道使开发人员能够 自动执行代码,用于构建、测试和部署应用程序等各种目的。这些自动化工作流是通过特定操作触发的,例如代码推送、拉取请求或计划任务。它们有助于简化从开发到生产的过程。
然而,这些系统需要在某个地方 执行,通常需要 特权凭据来部署代码或访问敏感信息。
即使某些 VCS 平台允许创建管道,在本节中我们将仅分析对源代码控制的潜在攻击。
包含您项目源代码的平台包含敏感信息,用户需要非常小心在此平台内授予的权限。这些是 VCS 平台上攻击者可能滥用的一些常见问题:
泄露:如果您的代码在提交中包含泄露,且攻击者可以访问该仓库(因为它是公开的或因为他有访问权限),他可能会发现这些泄露。
访问:如果攻击者可以 访问 VCS 平台内的帐户,他可能会获得 更多的可见性和权限。
注册:某些平台只允许外部用户创建帐户。
SSO:某些平台不允许用户注册,但允许任何人使用有效的 SSO 访问(因此攻击者可以使用他的 GitHub 帐户进入,例如)。
凭据:用户名+密码、个人令牌、ssh 密钥、Oauth 令牌、cookies... 用户可以窃取多种类型的令牌以某种方式访问仓库。
Webhooks:VCS 平台允许生成 webhooks。如果它们 没有用不可见的秘密保护,则 攻击者可能会滥用它们。
如果没有秘密,攻击者可能会滥用第三方平台的 webhook。
如果秘密在 URL 中,情况也是如此,攻击者也会拥有秘密。
代码妥协:如果恶意行为者对仓库有某种 写入 访问权限,他可能会尝试 注入恶意代码。为了成功,他可能需要 绕过分支保护。这些操作可以以不同的目标进行:
妥协主分支以 妥协生产。
妥协主分支(或其他分支)以 妥协开发者机器(因为他们通常在自己的机器上执行测试、terraform 或其他操作)。
妥协管道(查看下一节)
定义管道的最常见方法是使用 托管在仓库中的 CI 配置文件。该文件描述了执行作业的顺序、影响流程的条件和构建环境设置。 这些文件通常具有一致的名称和格式,例如 — Jenkinsfile(Jenkins)、.gitlab-ci.yml(GitLab)、.circleci/config.yml(CircleCI)和位于 .github/workflows 下的 GitHub Actions YAML 文件。当触发时,管道作业 从选定的源中拉取代码(例如提交/分支),并 根据 CI 配置文件中指定的命令 运行该代码。
因此,攻击者的最终目标是以某种方式 妥协这些配置文件 或 它们执行的命令。
毒化管道执行(PPE)路径利用 SCM 仓库中的权限来操纵 CI 管道并执行有害命令。具有必要权限的用户可以修改 CI 配置文件或管道作业使用的其他文件,以包含恶意命令。这会“毒化” CI 管道,导致这些恶意命令的执行。
为了使恶意行为者成功执行 PPE 攻击,他需要能够:
拥有 对 VCS 平台的写入访问权限,因为通常在执行推送或拉取请求时会触发管道。(查看 VCS 渗透测试方法以获取获取访问权限的摘要)。
注意,有时 外部 PR 计为“写入访问”。
即使他拥有写入权限,他也需要确保他可以 修改 CI 配置文件或其他配置所依赖的文件。
为此,他可能需要能够 绕过分支保护。
有 3 种 PPE 风格:
D-PPE:直接 PPE 攻击发生在行为者 修改将要执行的 CI 配置 文件时。
I-DDE:间接 PPE 攻击发生在行为者 修改 CI 配置文件所 依赖的文件(如 make 文件或 terraform 配置)时。
公共 PPE 或 3PE:在某些情况下,管道可以 由没有写入访问权限的用户触发(而且他们可能甚至不是组织的一部分),因为他们可以发送 PR。
3PE 命令注入:通常,CI/CD 管道会 设置环境变量,其中包含 有关 PR 的信息。如果该值可以被攻击者控制(如 PR 的标题),并且在 危险位置(如执行 sh 命令)中 使用,攻击者可能会 在其中注入命令。
了解毒化管道的 3 种风格后,让我们检查攻击者在成功利用后可能获得的内容:
秘密:如前所述,管道的作业需要 特权(检索代码、构建、部署...),这些特权通常在秘密中 授予。这些秘密通常可以通过 环境变量或系统内部的文件 访问。因此,攻击者总是会尝试提取尽可能多的秘密。
根据管道平台,攻击者 可能需要在配置中指定秘密。这意味着如果攻击者无法修改 CI 配置管道(例如 I-PPE),他可能 只能提取该管道拥有的秘密。
计算:代码在某处执行,具体取决于执行的位置,攻击者可能能够进一步转移。
本地:如果管道在本地执行,攻击者可能会进入 内部网络,访问更多资源。
云:攻击者可以访问 云中的其他机器,还可以 提取 IAM 角色/服务帐户 令牌 以获得 进一步的云内部访问。
平台机器:有时作业将在 管道平台机器 内执行,这些机器通常位于 没有更多访问权限 的云中。
选择它:有时 管道平台将配置多个机器,如果您可以 修改 CI 配置文件,则可以 指示要运行恶意代码的位置。在这种情况下,攻击者可能会在每台可能的机器上运行反向 shell,以尝试进一步利用。
妥协生产:如果您在管道内部,并且最终版本是从中构建和部署的,您可能会 妥协将要在生产中运行的代码。
Chain-bench 是一个开源工具,用于审计您的软件供应链堆栈的安全合规性,基于新的 CIS 软件供应链基准。审计集中在整个 SDLC 过程中,可以揭示从代码时间到部署时间的风险。
查看这篇关于 Cider 的前 10 大 CI/CD 风险的有趣文章:https://www.cidersecurity.io/top-10-cicd-security-risks/
在每个平台上,您可以本地运行,您将找到如何本地启动它,以便您可以根据需要进行配置以进行测试。
Gitea + Jenkins 实验室:https://github.com/cider-security-research/cicd-goat
Checkov:Checkov 是一个用于基础设施即代码的静态代码分析工具。
学习和实践 AWS 黑客技术:HackTricks 培训 AWS 红队专家 (ARTE) 学习和实践 GCP 黑客技术:HackTricks 培训 GCP 红队专家 (GRTE)