CircleCI Security
Last updated
Last updated
学习与实践 AWS 黑客技术:HackTricks 培训 AWS 红队专家 (ARTE) 学习与实践 GCP 黑客技术:HackTricks 培训 GCP 红队专家 (GRTE)
CircleCI 是一个持续集成平台,您可以在其中定义模板,指示它希望对某些代码做什么以及何时执行。通过这种方式,您可以自动化测试或部署,例如直接从您的仓库主分支进行。
CircleCI 继承了 与登录的账户相关的 github 和 bitbucket 的权限。 在我的测试中,我检查到只要您在 github 上对仓库拥有写权限,您就能够管理 CircleCI 中的项目设置(设置新的 ssh 密钥,获取项目 api 密钥,创建带有新 CircleCI 配置的新分支...)。
然而,您需要成为仓库管理员才能将仓库转换为 CircleCI 项目。
根据 文档,在工作流中有不同的方法来加载环境变量中的值。
每个由 CircleCI 运行的容器将始终具有 文档中定义的特定环境变量,如 CIRCLE_PR_USERNAME
、CIRCLE_PROJECT_REPONAME
或 CIRCLE_USERNAME
。
您可以在命令中以明文声明它们:
您可以在 run environment 中以明文声明它们:
您可以在 build-job environment 中以明文声明它们:
您可以在 容器的环境 中以明文声明它们:
这些是秘密,只有项目(通过任何分支)可以访问。 您可以在 https://app.circleci.com/settings/project/github/<org_name>/<repo_name>/environment-variables 中查看它们声明。
“导入变量”功能允许从其他项目导入变量到这个项目。
这些是组织范围内的秘密。默认情况下,任何仓库都可以访问存储在这里的任何秘密:
但是,请注意,可以选择不同的组(而不是所有成员)来仅向特定人员提供对秘密的访问。 这目前是提高秘密安全性的最佳方法之一,不允许每个人访问它们,而只是一些人。
如果您有访问VCS(如github),请检查每个仓库每个分支的文件 .circleci/config.yml
并搜索潜在的明文秘密。
检查代码,您可以找到在每个 .circleci/config.yml
文件中使用的所有秘密名称。您还可以从这些文件中获取上下文名称或在网络控制台中查看它们:https://app.circleci.com/settings/organization/github/<org_name>/contexts。
为了外泄所有项目和上下文秘密,您只需对整个github组织中的1个仓库具有写入权限(并且您的帐户必须具有对上下文的访问权限,但默认情况下每个人都可以访问每个上下文)。
“导入变量”功能允许从其他项目导入变量到这个项目。因此,攻击者可以从所有仓库导入所有项目变量,然后一起外泄所有变量。
所有项目秘密始终在作业的环境中设置,因此只需调用环境并将其混淆为base64,将在工作流网络日志控制台中外泄秘密:
如果您无法访问网络控制台,但您有对代码库的访问权限并且知道使用了CircleCI,您可以创建一个工作流,该工作流每分钟触发一次并且将秘密导出到外部地址:
您需要指定上下文名称(这也将提取项目秘密):
如果您无法访问网络控制台,但您有对代码库的访问权限并且知道使用了CircleCI,您可以修改一个每分钟触发的工作流,并且该工作流将秘密导出到外部地址:
仅仅在一个仓库中创建一个新的 .circleci/config.yml
并不足以触发 circleci 构建。你需要在 circleci 控制台中将其启用为项目。
CircleCI 让你可以选择在 他们的机器上或你自己的机器上运行构建。 默认情况下,他们的机器位于 GCP,你最初无法找到任何相关信息。然而,如果受害者在 他们自己的机器上(可能是在云环境中) 运行任务,你可能会找到一个 云元数据端点,其中包含有趣的信息。
请注意,在之前的示例中,一切都是在 docker 容器内启动的,但你也可以 请求启动一台虚拟机(这可能具有不同的云权限):
或者甚至是一个可以访问远程 docker 服务的 docker 容器:
可以在 CircleCI 中 创建用户令牌 以使用用户的访问权限访问 API 端点。
https://app.circleci.com/settings/user/tokens
可以 创建项目令牌 以使用令牌授予的权限访问项目。
https://app.circleci.com/settings/project/github/<org>/<repo>/api
可以 向项目添加 SSH 密钥。
https://app.circleci.com/settings/project/github/<org>/<repo>/ssh
可以在一个意外的项目中 在隐藏分支中创建一个定时任务,每天 泄露 所有的 上下文环境 变量。
或者甚至在一个分支中创建/修改一个已知的任务,每天 泄露 所有上下文和 项目秘密。
如果你是 GitHub 的所有者,你可以 允许未验证的 orbs 并在一个任务中将其配置为 后门。
你可以在某些任务中找到 命令注入漏洞 并通过 秘密 修改其值来 注入命令。
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)