Pentesting CI/CD Methodology
VCS
VCSはバージョン管理システムを意味し、開発者がソースコードを管理することを可能にします。最も一般的なのはgitで、通常、以下のプラットフォームで使用されています:
Github
Gitlab
Bitbucket
Gitea
クラウドプロバイダー(独自のVCSプラットフォームを提供)
Pipelines
Pipelinesは、特定のアクションが発生した後(プッシュ、PR、cronなど)にコードの自動実行(ビルド、テスト、デプロイなどの目的で)を開発者が自動化することを可能にします。これらは、開発から本番までのすべてのステップを自動化するために非常に便利です。
ただし、これらのシステムはどこかで実行される必要があり、通常はコードをデプロイするための特権クレデンシャルを持っています。
VCS Pentesting Methodology
一部のVCSプラットフォームはパイプラインを作成することを許可していますが、このセクションではソースコードの管理への潜在的な攻撃のみを分析します。
プロジェクトのソースコードを含むプラットフォームには機密情報が含まれており、このプラットフォーム内で付与される権限には非常に注意が必要です。これらは、攻撃者が悪用可能なVCSプラットフォーム全体の一般的な問題です:
Leaks: コミットにリークが含まれていて、攻撃者がリポジトリにアクセスできる場合(公開されているか、アクセス権がある場合)、リークを発見する可能性があります。
Access: 攻撃者がVCSプラットフォーム内のアカウントにアクセスできる場合、より多くの可視性と権限を得ることができます。
Register: 一部のプラットフォームは外部ユーザーがアカウントを作成することを許可します。
SSO: 一部のプラットフォームはユーザーの登録を許可しませんが、有効なSSOでのアクセスを許可します(したがって、攻撃者は例えば彼のgithubアカウントを使用して入ることができます)。
Credentials: ユーザー名+パスワード、個人トークン、sshキー、Oauthトークン、クッキー... ユーザーがリポジトリに何らかの方法でアクセスするために盗む可能性のあるトークンの種類はいくつかあります。
Webhooks: VCSプラットフォームはwebhooksを生成することを許可します。それらが非表示のシークレットで保護されていない場合、攻撃者がそれらを悪用する可能性があります。
シークレットが設定されていない場合、攻撃者は第三者プラットフォームのwebhookを悪用することができます
シークレットがURLにある場合、同じことが起こり、攻撃者もシークレットを持っています
Code compromise: 悪意のあるアクターがリポジトリに対して何らかの書き込みアクセスを持っている場合、悪意のあるコードを注入しようとするかもしれません。成功するためには、ブランチ保護をバイパスする必要があるかもしれません。これらの行動は、異なる目標を念頭に置いて実行されることがあります:
メインブランチを妥協して本番を妥協する。
メイン(または他のブランチ)を妥協して開発者のマシンを妥協する(彼らは通常、テスト、terraform、またはリポジトリ内の他のものを彼らのマシンで実行します)。
パイプラインを妥協する(次のセクションをチェック)
Pipelines Pentesting Methodology
パイプラインを定義する最も一般的な方法は、パイプラインがビルドするリポジトリにホストされているCI構成ファイルを使用することです。このファイルは、実行されるジョブの順序、フローに影響を与える条件、およびビルド環境の設定を記述します。 これらのファイルには通常、一貫した名前と形式があります。例えば - Jenkinsfile(Jenkins)、.gitlab-ci.yml(GitLab)、.circleci/config.yml(CircleCI)、および.github/workflowsの下に位置するGitHub Actions YAMLファイル。トリガーされると、パイプラインジョブは選択されたソース(例:コミット/ブランチ)からコードをプルし、そのコードに対してCI構成ファイルに指定されたコマンドを実行します。
したがって、攻撃者の究極の目標は、何らかの方法でこれらの構成ファイルを妥協するか、または実行するコマンドを妥協することです。
PPE - Poisoned Pipeline Execution
Poisoned Pipeline Execution(PPE)パスは、SCMリポジトリ内の権限を悪用してCIパイプラインを操作し、有害なコマンドを実行することを悪用します。必要な権限を持つユーザーは、CI構成ファイルまたはパイプラインジョブが使用する他のファイルを変更して、悪意のあるコマンドを含めることができます。これにより、CIパイプラインが「毒され」、これらの悪意のあるコマンドが実行されます。
PPE攻撃を成功させるためには、悪意のあるアクターが以下を行うことができる必要があります:
VCSプラットフォームへの書き込みアクセスを持っている、通常パイプラインはプッシュまたはプルリクエストが実行されたときにトリガーされます。(アクセスを取得する方法の概要については、VCSペネトレーションテスト方法論をチェックしてください)。
外部PRが「書き込みアクセス」としてカウントされることがあります。
書き込み権限を持っていても、CI構成ファイルまたは構成が依存している他のファイルを変更できることを確認する必要があります。
これには、ブランチ保護をバイパスすることが必要になるかもしれません。
PPEには3つのフレーバーがあります:
D-PPE: 直接PPE攻撃は、アクターが実行されるCI構成ファイルを変更するときに発生します。
I-DDE: 間接PPE攻撃は、アクターが実行されるCI構成ファイルが依存するファイル(makeファイルやterraform構成など)を変更するときに発生します。
Public PPEまたは3PE: 場合によっては、リポジトリ内に書き込みアクセスがないユーザー(組織の一部でさえないかもしれない)によってパイプラインがトリガーされることがあります。彼らはPRを送信することができます。
3PE Command Injection: 通常、CI/CDパイプラインはPRに関する情報で環境変数を設定します。その値が攻撃者によって制御可能である(PRのタイトルのように)場合、そしてそれが危険な場所で使用される(shコマンドの実行のように)場合、攻撃者はそこにコマンドを注入する可能性があります。
Exploitation Benefits
パイプラインを毒する3つのフレーバーを知っているので、成功した悪用後に攻撃者が得ることができるものを確認しましょう:
Secrets: 前述のように、パイプラインはそのジョブ(コードを取得、ビルド、デプロイなど)に権限を必要とします、そしてこの権限は通常シークレットで付与されます。これらのシークレットは通常、環境変数またはシステム内のファイルを介してアクセス可能です。したがって、攻撃者は可能な限り多くのシークレットを抽出しようとします。
パイプラインプラットフォームによっては、攻撃者が構成でシークレットを指定する必要があるかもしれません。これは、攻撃者がCI構成パイプラインを変更できない場合(例えばI-PPE)、彼はそのパイプラインが持っているシークレットのみを抽出することができることを意味します。
Computation: コードはどこかで実行されます。どこで実行されるかによって、攻撃者はさらにピボットすることができるかもしれません。
On-Premises: パイプラインがオンプレミスで実行される場合、攻撃者は内部ネットワークに終わり、より多くのリソースにアクセスするかもしれません。
Cloud: 攻撃者はクラウド内の他のマシンにアクセスすることができますが、またIAMロール/サービスアカウントのトークンを抽出することもできます。それからクラウド内でさらにアクセスを得るために。
Platforms machine: 時々、ジョブはパイプラインプラットフォームのマシン内で実行されます。これは通常、アクセスがこれ以上ないクラウド内にあります。
Select it: 時々、パイプラインプラットフォームは複数のマシンを設定している場合があり、CI構成ファイルを変更できる場合は、悪意のあるコードを実行したい場所を指定することができます。この状況では、攻撃者はおそらく可能な限り各マシンでリバースシェルを実行し、それをさらに悪用しようとします。
本番を妥協する: パイプライン内にいて、最終バージョンがそこからビルドされてデプロイされる場合、本番で実行されるコードを妥協することができます。
More relevant info
Tools & CIS Benchmark
Chain-benchは、新しいCIS Software Supply Chain benchmarkに基づいてソフトウェアサプライチェーンスタックをセキュリティコンプライアンスのために監査するオープンソースツールです。監査はSDLCプロセス全体に焦点を当てており、コード時間からデプロイ時間までのリスクを明らかにすることができます。
Top 10 CI/CD Security Risk
Ciderによるトップ10のCI/CDリスクについてのこの興味深い記事をチ
Last updated