
環境をマッピングし、実効権限と信頼関係を評価し、完全な攻撃グラフを単一の .rage.ndjson ファイルとして書き出すコレクター兼導出エンジン。他のすべての入力となる。
4,000件の検出事項があるわけではない。王冠の宝石に至る6つの経路があるのだ。

CSPM は、重複排除され重大度でソートされた設定不備の平坦なリストを渡してくるだけで、 どれが重要なのかは自分で推測するしかない。Thunderstorm は到達可能性について推論する。 クラウドを読み取り専用で収集し、セキュリティケイパビリティのグラフとしてモデル化し、 GitHub Actions の OIDC トラストが4ホップで本番データレイクに至ることを教えてくれる。
上記のホップはどれも単体では検出事項ではない。公開バケット、state ファイル内のキー、 引き受け可能なロール、1つの過剰に広い IAM アクション。パスこそが検出事項であり、 パスを計算するものはほとんど他にない。
対象とするプラットフォームを深く掘り下げる。 AWS アカウント、Azure サブスクリプション、 または GCP プロジェクトに対して実行すると、その1つの環境をプロバイダー自身の用語で マッピングする。AWS では STS assume-role と IAM 権限昇格、Azure では RBAC と マネージド ID チェーン、GCP ではサービスアカウントのなりすまし。1つの環境、1つのグラフを、 そのクラウドが実際に動作する方法でモデル化する。
より多くを列挙するツールはたくさんある。ここでの主張は、Thunderstorm が 列挙したものに対して真の深さで推論するということだ。219 のリソースタイプ、 80 のエッジタイプ、2,400 以上の導出ルール、そして 1,049 のマッピングされた クレデンシャル漏洩サイト。すべて RAGE を出典とする。
RAGE はフォーマットであり、Thunderstorm がそれを生成し、Blaze がそれを探索する。
これらは Thunderstorm が単一の scan から生成するものである。
1つの設定不備の S3 バケット。Thunderstorm はそれを6ホップで本番顧客データベースまで 追跡し、さらにデータベースのマスターシークレットへ直行する第2の経路も見つける。
Internet ──public s3:GetObject──▶ acme-terraform-state (public bucket)
──ExposesCredential────▶ AKIA… (access key leaked in tfstate)
──CredentialsFor───────▶ ec2-app-role
──CanAssume────────────▶ terraform-exec (sts:AssumeRole)
──CanEscalateTo────────▶ OrganizationAdmin (iam:AttachRolePolicy)
──CanReadData──────────▶ acme-prod-customers (PII)
各ホップは、それを可能にする権限、それを証明する証拠、そして平易な英語の ナラティブを伴う。漏洩した値も一緒に出力される:

公開読み取り可能な BLOB がサービスプリンシパルのシークレットを漏洩する。1つの余分な 権限を持つ Contributor が自らをサブスクリプション Owner に昇格させる。アプリの エクスプロイトはない。ただのクラウド設定不備と IAM である。

Internet ──anonymous blob read──▶ acmedeploy (public Storage account)
──ExposesCredential────▶ automation-sp secret (in a deploy config blob)
──CredentialsFor───────▶ automation-sp (Contributor)
──CanEscalateTo────────▶ Owner (Microsoft.Authorization/roleAssignments/write)
──CanReadData──────────▶ acmedatalake
サービスアカウントのなりすましはほとんどのツールにとって不可視である。Thunderstorm は
iam.serviceAccounts.getAccessToken を、それが実際にそうであるラテラルムーブメントの
エッジとして扱う。

Internet ──public allUsers───▶ acme-public-exports (GCS)
──ExposesCredential─▶ sa-deploy-key
──CredentialsFor────▶ sa-deploy
──CanImpersonate────▶ sa-data-pipeline
──CanImpersonate────▶ sa-org-admin
──CanReadData───────▶ acme_customers_pii (BigQuery)
view でブラウザで開く。何もアップロードされない。collectors/、engine/)。Thunderstorm は独自の分類体系、マッピング、ルールを一切持たない。RAGE 標準を エンドツーエンドで消費する:
| 関心事 | RAGE 内の場所 |
|---|---|
| ノード / エッジの分類体系、条件 |
バージョンの紐付け: RAGE の spec_version が、Thunderstorm を RAGE リリースに
固定する唯一の番号である。コレクターはビルド対象の RAGE からそれをライブで読み取り
(thunderstorm version は RAGE <v> を出力する)、出力するすべてのグラフにそれを
刻印する。Blaze Lite はその刻印を読み取り、サポートしていないバージョンに対して
ビルドされたグラフには警告を出す。
RAGE の解決方法(最初に一致したものが優先):
$RAGE_ROOT: 設定した場合、ライブの RAGE チェックアウト(開発用オーバーライド。編集は再ビルドなしで適用される)。collectors/rage/ にあるベンダー化されたスナップショット。バイナリに埋め込まれる。スナップショットを更新するには make RAGE_ROOT=/path/to/rage(または collectors/ で
go generate ./...)。RAGE は github.com/trustedsec/rage にある。
Thunderstorm は既存のクラウドクレデンシャルを使って読み取り専用でスキャンする。
シークレットを管理することはなく、ターゲットに書き込むこともない。プロバイダーの通常の
ツールでログインし、scan をアカウント / プロジェクト / サブスクリプションに向ける。
AWS は標準の AWS SDK クレデンシャルチェーン(名前付きプロファイル、環境変数、SSO、またはインスタンスロール)を使用する:
aws configure --profile myprofile # or: aws sso login --profile myprofile
./bin/thunderstorm scan --profile myprofile [--region us-east-1]
GCP は Application Default Credentials(ADC)を使用する。ログインしてからプロジェクトを渡す:
gcloud auth application-default login
./bin/thunderstorm scan --provider gcp --project my-project-id
サービスアカウントキーも GOOGLE_APPLICATION_CREDENTIALS=/path/key.json で動作する。
Azure は Azure CLI / DefaultAzureCredential チェーンを使用する。ログインしてから、必要に応じて1つのサブスクリプションにスコープする:
az login
./bin/thunderstorm scan --provider azure [--subscription <sub-id>]
サービスプリンシパルも AZURE_CLIENT_ID / AZURE_CLIENT_SECRET / AZURE_TENANT_ID で動作する。
多数のアカウントを一度にスキャンするには --aws-profiles、--gcp-projects、
--azure-subscriptions、または --scopes ファイル(1行につき provider:scope)を使用する。
ビルド(./bin/thunderstorm を生成):
make # build with the embedded RAGE snapshot
make RAGE_ROOT=/path/to/RAGE # re-vendor from a live RAGE checkout, then build
スキャンしてから探索:
./bin/thunderstorm scan --profile <aws-profile> # → a single .rage.ndjson attack graph
./bin/thunderstorm view --in engagement.zip # open it offline in Blaze Lite
./bin/thunderstorm redact --in engagement.zip --out redacted.zip # de-identify for sharing
--out を指定しない場合、エンゲージメントは ./output/(git で無視される)に置かれる。
ツールはこれだけである: scan、redact、view、version。
STRUCTURAL であり、パスから除外される。Thunderstorm は GNU General Public License v3 の下でライセンスされている(LICENSE 参照)。
これは許可されたセキュリティテスト、教育、研究のみを目的として提供される攻撃的
セキュリティツールである。自分が所有していない環境に対して実行する前に、明示的な
許可を取得すること。LICENSE の冒頭にある Authorized-Use 通知を参照。
vocab/{node-types,edge-types,conditions}.json |
| ネイティブ→汎用マッピング + 収集レシピ | providers/{aws,gcp,azure}.json |
| 導出ルールコーパス | rules/ |
| クレデンシャル露出カタログ | exposure-db/{aws,gcp,azure}.json + vocabulary.json |