CICD-SEC-1

定義

不十分なフロー制御メカニズムとは、さらなる承認やレビューを強制するメカニズムがないために、CI/CD プロセス (SCM、CI、アーティファクトリポジトリなど) 内のシステムへのパーミッションを取得した攻撃者が単独で悪意のあるコードやアーティファクトをパイプラインにプッシュできることを指します。

解説

CI/CD フローはスピード重視で設計されています。開発者のマシンで作成された新しいコードは、数分以内に本番環境に導入できます。多くの場合、自動化に完全に依存し、人間の関与を最小限に抑えます。CI/CD プロセスは本質的に高度にゲート化されたセキュアな本番環境へのハイウェイであるため、組織は単一のエンティティ (人間またはアプリケーション) が厳密な一連のレビューと承認を受けることなくパイプラインを通じてコードやアーティファクトをプッシュできないようにすることを目的とした対策とコントロールを継続的に導入しています。

影響

SCM、CI、またはパイプラインのさらに下のシステムにアクセスできる攻撃者は不十分なフロー制御メカニズム悪用して、悪意のあるアーティファクトをデプロイできます。いったん作成されると、アーティファクトはパイプラインを通じて、潜在的には最終的に本番環境まで、承認やレビューなしに出荷されます。たとえば、攻撃者は以下のようなことを行う可能性があります。

  • リポジトリのブランチにコードをプッシュします。これはパイプラインを通じて本番環境に自動的にデプロイされます。

  • リポジトリのブランチにコードをプッシュし、パイプラインを手動でトリガーして、本番環境にそのコードを出荷します。

  • ユーティリティライブラリにコードを直接プッシュします。これは本番環境システムで実行されるコードによって使用されます。

  • 事前定義された一連の要件を満たすプルリクエストを自動的にマージする CI の自動マージルールを悪用して、悪意のあるレビューされていないコードをプッシュします。

  • 不十分なブランチ保護ルールを悪用します。たとえば、特定のユーザーまたはブランチを除外することでブランチ保護をバイパスして、悪意のあるレビューされていないコードをプッシュします。

  • ビルド環境によって作成された正当なアーティファクトを装って、パッケージやコンテナなどのアーティファクトリポジトリにアーティファクトをアップロードします。このようなシナリオでは、コントロールや検証が行われないと、デプロイパイプラインがそのアーティファクトをピックアップして、本番環境にデプロイしてしまう可能性があります。

  • 本番環境にアクセスし、さらなる承認や検証なしにアプリケーションコードやインフラストラクチャ (AWS Lambda function など) を直接変更します。

推奨事項

パイプラインフロー制御メカニズムを確立して、単一のエンティティ (人間 / プログラマティック) が外部の検証やバリデーションなしにパイプラインを通じて機密コードやアーティファクトを出荷できないようにします。これは以下の対策を実装することで達成できます。

  • 本番環境やその他の機密性の高いシステムで使用されるコードをホストするブランチにブランチ保護ルールを設定します。可能であれば、ブランチ保護ルールからユーザーアカウントやブランチを除外しないようにします。レビューされていないコードをリポジトリにプッシュするパーミッションをユーザーアカウントに付与する場合、それらのアカウントは当該リポジトリに接続されたデプロイメントパイプラインをトリガーするパーミッションを持っていないことを確認します。

  • 自動マージルールの使用を制限し、使用する場合は常に最小限のコンテキストに適用されるようにします。すべての自動マージルールのコードを徹底的にレビューして、バイパスできないことを確認し、自動マージプロセスでサードパーティコードをインポートしないようにします。

  • 該当する場合、アカウントがさらなる承認やレビューなしで本番環境ビルドやデプロイメントパイプラインをトリガーしないようにします。

  • 事前承認済みの CI サービスアカウントによって作成されたという条件でのみ、アーティファクトがパイプラインを通過できるようにします。他のアカウントによってアップロードされたアーティファクトは、二次的なレビューと承認なしにパイプラインを通過しないようにします。

  • 本番環境で実行しているコードとその CI/CD オリジンとの間のドリフトと不整合を検出して防止し、ドリフトを含むリソースを修正します。

参考情報

  1. PHP git リポジトリに仕掛けられたバックドア。攻撃者はレビューされていない悪意のあるコードを PHP メインブランチに直接プッシュし、最終的に PHP の正式版としてすべての PHP ウェブサイトに拡散させる結果となりました。

    https://news-web.php.net/php.internals/113981

  2. RyotaK による Homebrew での自動マージルールのバイパス。重要でない変更をメインブランチにマージするために使用される自動マージルールはバイパスされやすく、攻撃者はプロジェクトに悪意のあるコードをマージすることができました。

    https://brew.sh/2021/04/21/security-incident-disclosure/

  3. Omer Gil による GitHub Actions を使用した必須レビューのバイパス。この欠陥により、GitHub Actions を利用して必須レビューメカニズムをバイパスし、レビューされていないコードを保護されたブランチにプッシュすることができました。

    https://www.cidersecurity.io/blog/research/bypassing-required-reviews-using-github-actions/

Last updated