CircleCI Security
基本信息
CircleCI是一个持续集成平台,您可以使用它来定义模板,指示您希望它对某些代码执行何种操作以及何时执行。这样,您可以直接从您的存储库主分支自动化测试或部署。
权限
CircleCI 继承了与登录相关的github和bitbucket的权限。 在我的测试中,我发现只要您在github上对存储库具有写入权限,您就可以在CircleCI中管理其项目设置(设置新的ssh密钥,获取项目api密钥,创建具有新CircleCI配置的新分支...)。
但是,您需要是存储库管理员才能将存储库转换为CircleCI项目。
环境变量和秘密
根据文档,有不同的方法可以在工作流程中加载环境变量的值。
内置环境变量
由CircleCI运行的每个容器将始终具有文档中定义的特定环境变量,如CIRCLE_PR_USERNAME
,CIRCLE_PROJECT_REPONAME
或CIRCLE_USERNAME
。
明文
您可以在命令中以明文声明它们:
您可以在运行环境中以明文形式声明它们:
您可以在build-job环境中以明文形式声明它们:
您可以在容器环境中以明文形式声明它们:
项目机密
这些是只能被项目(任何分支)访问的机密。 您可以在 https://app.circleci.com/settings/project/github/<org_name>/<repo_name>/environment-variables 中查看它们的声明。
"导入变量"功能允许从其他项目导入变量到此项目。
上下文机密
这些是组织范围的机密。默认情况下,任何存储在此处的机密都可以被任何存储库访问:
但请注意,可以选择一个不同的组(而不是所有成员)来仅允许特定人员访问机密。 这目前是增加机密安全性的最佳方式之一,不允许每个人都访问它们,而只允许某些人访问。
攻击
搜索明文机密
如果您可以访问VCS(如github),请检查每个存储库的每个分支的.circleci/config.yml
文件,并搜索其中存储的潜在明文机密。
机密环境变量和上下文枚举
通过检查代码,您可以找到每个.circleci/config.yml
文件中使用的所有机密名称。您还可以从这些文件中获取上下文名称,或在Web控制台中检查它们:https://app.circleci.com/settings/organization/github/<org_name>/contexts。
外泄项目机密
为了外泄所有项目和上下文机密,您只需要对整个github组织中的1个存储库具有写入访问权限(并且您的帐户必须可以访问上下文,但默认情况下每个人都可以访问每个上下文)。
"导入变量"功能允许从其他项目导入变量到此项目。因此,攻击者可以从所有存储库导入所有项目变量,然后一起外泄所有这些变量。
所有项目机密始终设置在作业的环境中,因此只需调用环境并将其混淆为base64,即可在工作流Web日志控制台中外泄机密:
如果您无法访问Web控制台,但可以访问存储库,并且知道正在使用CircleCI,您可以创建一个工作流,每分钟触发一次,将机密信息传送到外部地址:
泄露上下文中的秘密
您需要指定上下文名称(这也将泄露项目的秘密):
如果您无法访问Web控制台,但可以访问存储库,并且知道正在使用CircleCI,您可以修改一个每分钟触发并将机密信息传输到外部地址的工作流程:
仅在存储库中创建一个新的 .circleci/config.yml
并不足以触发 CircleCI 构建。您需要在 CircleCI 控制台中将其启用为一个项目。
逃逸至云端
CircleCI 提供了在他们的机器上或在您自己的机器上运行构建的选项。 默认情况下,他们的机器位于 GCP,最初您可能找不到任何相关信息。但是,如果受害者在他们自己的机器上运行任务(可能是在云环境中),您可能会发现一个包含有趣信息的云元数据端点。
请注意,在前面的示例中,所有内容都是在一个 Docker 容器中启动的,但您也可以请求启动一个 VM 机器(可能具有不同的云权限):
甚至是具有访问远程 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并在作业中配置一个作为后门。
您可以在某些任务中找到命令注入漏洞,通过秘密修改其值注入命令
Last updated