Um coletor e motor de derivação. Ele mapeia seu ambiente, avalia permissões efetivas e confiança, e grava um grafo de ataque completo como um único arquivo .rage.ndjson. A entrada para todo o resto.
Você não tem 4.000 achados. Você tem seis caminhos até as suas joias da coroa.

Uma CSPM entrega a você uma lista plana, deduplicada e ordenada por severidade de más configurações e deixa você adivinhar quais importam. O Thunderstorm raciocina sobre alcançabilidade: ele coleta sua nuvem em modo somente leitura, modela-a como um grafo de capacidades de segurança e informa que uma confiança OIDC do GitHub Actions leva, em quatro saltos, ao seu data lake de produção.
Nenhum dos saltos acima é um achado por si só. Um bucket público, uma chave em um arquivo de estado, um role assumível, uma ação IAM ampla demais. O caminho é o achado, e o caminho é o que quase nada mais calcula.
Profundo na plataforma para a qual você o aponta. Execute-o contra uma conta AWS, uma assinatura Azure ou um projeto GCP, e ele mapeia esse único ambiente nos próprios termos do provedor: assume-role do STS e escalação de privilégios do IAM na AWS, cadeias de RBAC e identidade gerenciada no Azure, impersonação de conta de serviço no GCP. Um ambiente, um grafo, modelado do jeito que aquela nuvem realmente funciona.
Muitas ferramentas enumeram mais. A alegação aqui é que o Thunderstorm raciocina sobre o que enumera com profundidade real: 219 tipos de recursos, 80 tipos de arestas, mais de 2.400 regras de derivação e 1.049 locais mapeados de vazamento de credenciais, todos originados do RAGE.
O RAGE é o formato, o Thunderstorm o produz, o Blaze o explora.
Eles são o que o Thunderstorm produz a partir de um único scan.
Um bucket S3 mal configurado. O Thunderstorm o rastreia por seis saltos até o banco de dados de clientes de produção, e uma segunda rota direto até o segredo mestre do banco de dados.
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)
Cada salto carrega a permissão que o concede, a evidência que o comprova e uma narrativa em linguagem simples. Os valores vazados saem junto:

Um blob publicamente legível vaza um segredo de service principal. Um Contributor com uma permissão extra se promove a Owner da assinatura. Nenhum exploit de aplicação; apenas má configuração de nuvem e 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
A impersonação de conta de serviço é invisível para a maioria das ferramentas. O
Thunderstorm trata iam.serviceAccounts.getAccessToken como a aresta de movimento lateral
que ela é.

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 o abre no seu navegador; nada é enviado.collectors/, engine/).O Thunderstorm não carrega taxonomia, mapeamentos ou regras próprias. Ele consome o padrão RAGE de ponta a ponta:
| Concern | Lives in RAGE |
|---|---|
| Node / edge taxonomy, conditions | vocab/{node-types,edge-types,conditions}.json |
| Native→generic mappings + collection recipes | providers/{aws,gcp,azure}.json |
| Derivation rule corpus | rules/ |
| Credential-exposure catalog | exposure-db/{aws,gcp,azure}.json + vocabulary.json |
Vínculo de versão: o spec_version do RAGE é o único número que fixa o Thunderstorm a
uma release do RAGE. O coletor o lê ao vivo do RAGE contra o qual foi compilado
(thunderstorm version imprime RAGE <v>) e o carimba em cada grafo que emite; o Blaze
Lite lê esse carimbo e avisa quando um grafo foi construído contra uma versão que ele não
suporta.
Como o RAGE é resolvido (a primeira correspondência vence):
$RAGE_ROOT: um checkout ativo do RAGE, se você o definir (substituição de dev; edições se aplicam sem recompilar).collectors/rage/, embutido no binário.Atualize o snapshot com make RAGE_ROOT=/path/to/rage (ou go generate ./... em
collectors/). O RAGE fica em github.com/trustedsec/rage.
O Thunderstorm escaneia em somente leitura usando suas credenciais de nuvem existentes;
ele nunca gerencia segredos e nunca escreve no alvo. Faça login com as ferramentas normais
do provedor e então aponte o scan para a conta / projeto / assinatura.
AWS usa a cadeia de credenciais padrão do AWS SDK (um perfil nomeado, variáveis de ambiente, SSO ou um instance role):
aws configure --profile myprofile # or: aws sso login --profile myprofile
./bin/thunderstorm scan --profile myprofile [--region us-east-1]
GCP usa Application Default Credentials (ADC). Faça login e então passe o projeto:
gcloud auth application-default login
./bin/thunderstorm scan --provider gcp --project my-project-id
Uma chave de conta de serviço também funciona via GOOGLE_APPLICATION_CREDENTIALS=/path/key.json.
Azure usa a cadeia do Azure CLI / DefaultAzureCredential. Faça login e então, opcionalmente, limite a uma assinatura:
az login
./bin/thunderstorm scan --provider azure [--subscription <sub-id>]
Um service principal também funciona via AZURE_CLIENT_ID / AZURE_CLIENT_SECRET / AZURE_TENANT_ID.
Escanear muitas contas de uma vez usa --aws-profiles, --gcp-projects,
--azure-subscriptions ou um arquivo --scopes (provider:scope por linha).
Compile (produz ./bin/thunderstorm):
make # build with the embedded RAGE snapshot
make RAGE_ROOT=/path/to/RAGE # re-vendor from a live RAGE checkout, then build
Escaneie e então explore:
./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
Sem --out, os engajamentos ficam em ./output/ (ignorado pelo git). Essa é a ferramenta
inteira: scan, redact, view, version.
STRUCTURAL e excluído dos caminhos.O Thunderstorm é licenciado sob a GNU General Public License v3 (veja LICENSE).
É uma ferramenta de segurança ofensiva fornecida apenas para testes de segurança
autorizados, educação e pesquisa; obtenha autorização explícita antes de executá-la
contra qualquer ambiente que você não possua. Veja o aviso de Uso Autorizado no topo do
LICENSE.