Сборщик и движок вывода. Он картографирует вашу среду, оценивает действующие разрешения и доверие и записывает полный граф атак в один файл .rage.ndjson. Входные данные для всего остального.
У вас не 4 000 находок. У вас шесть путей к вашим главным сокровищам.

CSPM выдаёт вам плоский, дедуплицированный, отсортированный по критичности список неправильных конфигураций и оставляет вас гадать, какие из них важны. Thunderstorm рассуждает о достижимости: он собирает данные из вашего облака в режиме только чтения, моделирует их как граф security-возможностей и сообщает вам, что доверие GitHub Actions OIDC ведёт за четыре перехода к вашему продакшн-озеру данных.
Ни один из переходов выше сам по себе не является находкой. Публичный бакет, ключ в state-файле, роль, которую можно принять, одно слишком широкое действие IAM. Путь — это находка, и именно путь почти ничто другое не вычисляет.
Глубина на той платформе, на которую вы его нацелите. Запустите его против аккаунта AWS, подписки Azure или проекта GCP — и он отобразит именно это окружение в терминах самого провайдера: assume-role через STS и повышение привилегий IAM в AWS, цепочки RBAC и управляемых удостоверений в Azure, имперсонация сервисных аккаунтов в GCP. Одно окружение, один граф, смоделированный так, как это облако действительно работает.
Многие инструменты перечисляют больше. Утверждение здесь в том, что Thunderstorm рассуждает о том, что перечисляет, с настоящей глубиной: 219 типов ресурсов, 80 типов рёбер, более 2 400 правил вывода и 1 049 отображённых мест утечки учётных данных — всё это взято из RAGE.
RAGE — это формат, Thunderstorm его создаёт, Blaze его исследует.
Это то, что Thunderstorm создаёт из одного scan.
Один неправильно настроенный бакет S3. Thunderstorm прослеживает его за шесть переходов до продакшн-базы данных клиентов и второй маршрут напрямую до мастер-секрета базы данных.
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 раскрывает секрет сервисного принципала. 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 |
|---|---|
| Таксономия узлов / рёбер, условия | vocab/{node-types,edge-types,conditions}.json |
| Сопоставления native→generic + рецепты сбора | providers/{aws,gcp,azure}.json |
| Корпус правил вывода | rules/ |
| Каталог утечек учётных данных | exposure-db/{aws,gcp,azure}.json + vocabulary.json |
Привязка версии: spec_version из RAGE — единственное число, которое привязывает
Thunderstorm к релизу RAGE. Коллектор читает его вживую из RAGE, против которого он был
собран (thunderstorm version выводит RAGE <v>), и ставит его в каждый граф, который
создаёт; Blaze Lite читает эту метку и предупреждает, когда граф был собран против
версии, которую он не поддерживает.
Как разрешается RAGE (первое совпадение побеждает):
$RAGE_ROOT: живой checkout RAGE, если вы его задали (переопределение для разработки; правки применяются без пересборки).collectors/rage/, встроенный в бинарник.Обновите снимок с помощью make RAGE_ROOT=/path/to/rage (или go generate ./... в
collectors/). 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. Войдите, затем при необходимости ограничьте одной подпиской:
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 (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.