Terraform Security
基本情報
HashiCorp Terraformは、人間が読み取り可能な構成ファイルでクラウドおよびオンプレミスリソースを定義し、バージョン管理、再利用、共有ができるインフラストラクチャコードツールです。一貫したワークフローを使用して、ライフサイクル全体でインフラストラクチャをプロビジョニングおよび管理できます。 Terraformは、コンピューティング、ストレージ、ネットワーキングリソースなどの低レベルコンポーネントだけでなく、DNSエントリやSaaS機能などの高レベルコンポーネントも管理できます。
Terraformの動作原理
Terraformは、クラウドプラットフォームや他のサービス上のリソースを、それらのアプリケーションプログラミングインターフェース(API)を介して作成および管理します。プロバイダは、Terraformがアクセス可能なAPIを持つほとんどのプラットフォームやサービスと連携できるようにします。
HashiCorpとTerraformコミュニティは、1700以上のプロバイダをすでに作成しており、数千種類の異なるリソースとサービスを管理できます。この数は増加し続けています。Amazon Web Services(AWS)、Azure、Google Cloud Platform(GCP)、Kubernetes、Helm、GitHub、Splunk、DataDogなど、すべての公開プロバイダをTerraform Registryで見つけることができます。
Terraformのコアワークフローは、次の3つのステージで構成されています:
記述: 複数のクラウドプロバイダやサービスにまたがるリソースを定義します。たとえば、セキュリティグループとロードバランサーを備えたVirtual Private Cloud(VPC)ネットワーク上の仮想マシンにアプリケーションを展開する構成を作成することができます。
計画: Terraformは、既存のインフラストラクチャと構成に基づいて作成、更新、または破棄するインフラストラクチャを記述する実行計画を作成します。
適用: 承認されると、Terraformは提案された操作を正しい順序で実行し、リソースの依存関係を尊重します。たとえば、VPCのプロパティを更新し、そのVPC内の仮想マシンの数を変更した場合、Terraformは仮想マシンのスケーリング前にVPCを再作成します。
Terraformラボ
コンピュータにTerraformをインストールしてください。
こちらにガイドがあり、こちらにTerraformをダウンロードする最良の方法があります。
TerraformでのRCE
Terraformにはウェブページやネットワークサービスを公開するプラットフォームがないため、terraformを侵害する唯一の方法はterraform構成ファイルを追加/変更できることです。
ただし、terraformは非常に敏感なコンポーネントであり、適切に機能するために特権アクセスが必要です。
攻撃者がterraformが実行されているシステムを侵害できる主な方法は、terraform構成を格納するリポジトリを侵害することです。なぜなら、ある時点でそれらが解釈されるからです。
実際、PRが作成された後にterraform plan/applyを自動的に実行するなどのソリューションがあります。たとえば、Atlantis:
pageAtlantis Securityterraformファイルを侵害できる場合、terraform plan
またはterraform apply
が実行されたときにRCEを実行するさまざまな方法があります。
Terraform plan
Terraform planは、terraformで最も使用されるコマンドであり、開発者/terraformを使用するソリューションは常にこれを呼び出すため、terraform plan
で任意のコマンドを実行するterraform構成ファイルを毒入れするのが最も簡単なRCEの方法です。
外部プロバイダの使用
Terraformは、Terraformと外部プログラムの間のインターフェースを提供するexternal
プロバイダを提供します。external
データソースを使用して、plan
中に任意のコードを実行できます。
terraform構成ファイルに次のようなものを注入すると、terraform plan
を実行するとrevシェルが実行されます。
カスタムプロバイダの使用
攻撃者はTerraform Registryにカスタムプロバイダを送信し、それをフィーチャーブランチにあるTerraformコードに追加することができます(こちらの例から)。
プロバイダはinit
でダウンロードされ、plan
が実行されると悪意のあるコードが実行されます。
https://github.com/rung/terraform-provider-cmdexecに例があります。
外部リファレンスの使用
上記のオプションはどちらも有用ですが、あまりステルス性がありません(2番目のオプションは1番目よりもステルス性が高いですが、より複雑です)。この攻撃をさらにステルス性の高い方法で実行することができます。以下の提案に従ってください:
terraformファイルにrevシェルを直接追加する代わりに、revシェルを含む外部リソースを読み込むことができます。
rev shellコードはhttps://github.com/carlospolop/terraform_external_module_rev_shell/tree/main/modulesにあります。
外部リソースでは、ref機能を使用して、リポジトリ内のterraform rev shellコードをブランチに隠すことができます。例:
git@github.com:carlospolop/terraform_external_module_rev_shell//modules?ref=b401d2b
Terraform Apply
Terraform applyを実行してすべての変更を適用します。また、local-execを使用して 悪意のあるTerraformファイルを注入して RCEを取得することもできます。
次のようなペイロードがmain.tf
ファイルに含まれるようにするだけです:
前のテクニックからの提案に従い、外部参照を使用してより慎重にこの攻撃を実行します。
シークレットのダンプ
terraform apply
を実行してterraformで使用されるシークレット値をダンプすることができます。terraformファイルに次のようなものを追加します:
Terraform State Filesの悪用
Terraform State Filesに書き込みアクセス権があるが、Terraformコードを変更できない場合、この研究では、ファイルを悪用するいくつかの興味深いオプションが紹介されています:
リソースの削除
リソースを破壊する2つの方法があります:
ステートファイルにランダムな名前のリソースを挿入し、実際に破壊するリソースを指す
Terraformはリソースが存在しないことを検知するため、それを破壊します(指定された実際のリソースIDに従って)。前のページの例:
リソースを削除して更新できないように変更する
EC2インスタンスの場合、インスタンスのタイプを変更するだけで、terraformが削除して再作成するようになります。
RCE
また、カスタムプロバイダーを作成し、terraformのステートファイル内のプロバイダーの1つを悪意のあるものに置き換えるか、悪意のあるプロバイダーを持つ空のリソースを追加することも可能です。元の研究からの例:
ブラックリストに登録されたプロバイダの置き換え
hashicorp/external
がブラックリストに登録されている場合は、以下の手順で external
プロバイダを再実装することができます。注意: https://registry.terraform.io/providers/nazarewk/external/latest で公開されている外部プロバイダのフォークを使用しています。独自のフォークや再実装を公開することもできます。
その場合、通常通り external
を使用できます。
監査ツール
参考文献
最終更新