Un motore di raccolta e derivazione. Mappa il tuo ambiente, valuta i permessi effettivi e la fiducia, e scrive un grafo di attacco completo come singolo file .rage.ndjson. L'input per tutto il resto.
Non hai 4.000 finding. Hai sei percorsi verso i tuoi gioielli della corona.

Un CSPM ti consegna una lista piatta, deduplicata e ordinata per severità di misconfigurazioni e ti lascia indovinare quali contano. Thunderstorm ragiona sulla raggiungibilità: raccoglie il tuo cloud in sola lettura, lo modella come un grafo di capacità di sicurezza e ti dice che una trust OIDC di GitHub Actions conduce, in quattro hop, al tuo data lake di produzione.
Nessuno degli hop sopra è un finding di per sé. Un bucket pubblico, una chiave in un file di stato, un ruolo assumibile, un'azione IAM troppo ampia. Il percorso è il finding, e il percorso è ciò che quasi nient'altro calcola.
Profondo sulla piattaforma verso cui lo punti. Eseguilo contro un account AWS, una sottoscrizione Azure o un progetto GCP, e mappa quell'unico ambiente nei termini propri del provider: STS assume-role e privilege escalation IAM in AWS, catene RBAC e managed-identity in Azure, impersonificazione di service-account in GCP. Un ambiente, un grafo, modellato nel modo in cui quel cloud funziona davvero.
Molti strumenti enumerano di più. L'affermazione qui è che Thunderstorm ragiona su ciò che enumera con vera profondità: 219 tipi di risorsa, 80 tipi di edge, oltre 2.400 regole di derivazione e 1.049 siti di credential-leak mappati, tutti provenienti da RAGE.
RAGE è il formato, Thunderstorm lo produce, Blaze lo esplora.
Sono ciò che Thunderstorm produce da un singolo scan.
Un singolo bucket S3 mal configurato. Thunderstorm lo traccia in sei hop fino al database clienti di produzione, e una seconda rotta dritta al master secret del database.
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)
Ogni hop porta con sé il permesso che lo concede, l'evidenza che lo prova e una narrazione in linguaggio semplice. I valori trapelati escono insieme ad esso:

Un blob pubblicamente leggibile fa trapelare un secret di service-principal. Un Contributor con un permesso extra si promuove a Owner della sottoscrizione. Nessun exploit dell'app; solo misconfigurazione cloud 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
L'impersonificazione di service-account è invisibile alla maggior parte degli strumenti. Thunderstorm tratta
iam.serviceAccounts.getAccessToken come l'edge di movimento laterale che è.

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 lo apre nel tuo browser; nulla viene caricato.collectors/, engine/).Thunderstorm non porta nessuna tassonomia, mappatura o regola propria. Consuma lo standard RAGE end-to-end:
| Aspetto | Vive in RAGE |
|---|---|
| Tassonomia di nodi / edge, condizioni | vocab/{node-types,edge-types,conditions}.json |
| Mappature native→generiche + ricette di raccolta | providers/{aws,gcp,azure}.json |
| Corpus di regole di derivazione | rules/ |
| Catalogo di esposizione delle credenziali | exposure-db/{aws,gcp,azure}.json + vocabulary.json |
Legame di versione: il spec_version di RAGE è l'unico numero che fissa Thunderstorm a una
release RAGE. Il collector lo legge live dal RAGE contro cui è stato compilato
(thunderstorm version stampa RAGE <v>) e lo marca in ogni grafo che emette; Blaze
Lite legge quel marchio e avvisa quando un grafo è stato costruito contro una versione che non supporta.
Come viene risolto RAGE (vince la prima corrispondenza):
$RAGE_ROOT: un checkout RAGE live, se lo imposti (override di sviluppo; le modifiche si applicano senza ricompilare).collectors/rage/, incorporato nel binario.Aggiorna lo snapshot con make RAGE_ROOT=/path/to/rage (o go generate ./... in
collectors/). RAGE vive su github.com/trustedsec/rage.
Thunderstorm scansiona in sola lettura usando le tue credenziali cloud esistenti; non gestisce mai
secret e non scrive mai sul target. Accedi con gli strumenti normali del provider, poi
punta scan verso l'account / progetto / sottoscrizione.
AWS usa la catena di credenziali standard dell'AWS SDK (un profilo con nome, variabili d'ambiente, SSO o un 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). Accedi, poi passa il progetto:
gcloud auth application-default login
./bin/thunderstorm scan --provider gcp --project my-project-id
Funziona anche una chiave di service-account tramite GOOGLE_APPLICATION_CREDENTIALS=/path/key.json.
Azure usa la catena Azure CLI / DefaultAzureCredential. Accedi, poi facoltativamente limita a una sottoscrizione:
az login
./bin/thunderstorm scan --provider azure [--subscription <sub-id>]
Funziona anche un service principal tramite AZURE_CLIENT_ID / AZURE_CLIENT_SECRET / AZURE_TENANT_ID.
Scansionare molti account contemporaneamente usa --aws-profiles, --gcp-projects,
--azure-subscriptions o un file --scopes (provider:scope per riga).
Compila (produce ./bin/thunderstorm):
make # build with the embedded RAGE snapshot
make RAGE_ROOT=/path/to/RAGE # re-vendor from a live RAGE checkout, then build
Scansiona, poi esplora:
./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
Senza --out, gli engagement finiscono in ./output/ (ignorato da git). Questo è l'intero strumento:
scan, redact, view, version.
STRUCTURAL ed escluso dai percorsi.Thunderstorm è distribuito sotto la GNU General Public License v3 (vedi LICENSE).
È uno strumento di sicurezza offensiva fornito solo per test di sicurezza autorizzati, educazione
e ricerca; ottieni esplicita autorizzazione prima di eseguirlo contro qualsiasi ambiente
che non possiedi. Vedi l'avviso di Authorized-Use in cima a LICENSE.