Un motor de recolección y derivación. Mapea tu entorno, evalúa los permisos y la confianza efectivos, y escribe un grafo de ataque completo como un único archivo .rage.ndjson. La entrada para todo lo demás.
No tienes 4.000 hallazgos. Tienes seis caminos hacia tus joyas de la corona.

Un CSPM te entrega una lista plana, deduplicada y ordenada por severidad de configuraciones erróneas y te deja adivinar cuáles importan. Thunderstorm razona sobre la alcanzabilidad: recopila tu nube en modo de solo lectura, la modela como un grafo de capacidades de seguridad y te dice que una confianza OIDC de GitHub Actions conduce, en cuatro saltos, a tu data lake de producción.
Ninguno de los saltos anteriores es un hallazgo por sí solo. Un bucket público, una clave en un archivo de estado, un rol asumible, una acción IAM demasiado amplia. La ruta es el hallazgo, y la ruta es lo que casi nada más calcula.
Profundidad en la plataforma a la que lo apuntas. Ejecútalo contra una cuenta de AWS, una suscripción de Azure o un proyecto de GCP, y mapea ese único entorno en los términos propios del proveedor: STS assume-role y escalada de privilegios IAM en AWS, cadenas de RBAC e identidad administrada en Azure, suplantación de cuentas de servicio en GCP. Un entorno, un grafo, modelado tal como esa nube funciona realmente.
Muchas herramientas enumeran más. La afirmación aquí es que Thunderstorm razona sobre lo que enumera con profundidad real: 219 tipos de recursos, 80 tipos de aristas, más de 2.400 reglas de derivación y 1.049 sitios de fuga de credenciales mapeados, todos provenientes de RAGE.
RAGE es el formato, Thunderstorm lo produce, Blaze lo explora.
Son lo que Thunderstorm produce a partir de un único scan.
Un bucket S3 mal configurado. Thunderstorm lo rastrea seis saltos hasta la base de datos de clientes de producción, y una segunda ruta directa al secreto maestro de la base de datos.
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 lleva el permiso que lo concede, la evidencia que lo demuestra y una narrativa en lenguaje sencillo. Los valores filtrados salen con él:

Un blob de lectura pública filtra un secreto de entidad de servicio. Un Contributor con un permiso extra se promueve a sí mismo a Owner de la suscripción. Sin explotar ninguna aplicación; solo mala configuración de la nube 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
La suplantación de cuentas de servicio es invisible para la mayoría de las herramientas.
Thunderstorm trata iam.serviceAccounts.getAccessToken como la arista de movimiento lateral
que es.

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 abre en tu navegador; no se sube nada.collectors/, engine/).Thunderstorm no lleva taxonomía, mapeos ni reglas propias. Consume el estándar RAGE de principio a fin:
| 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 versión: el spec_version de RAGE es el único número que fija Thunderstorm a
una versión de RAGE. El colector lo lee en vivo desde el RAGE contra el que se compiló
(thunderstorm version imprime RAGE <v>) y lo estampa en cada grafo que emite; Blaze Lite
lee esa estampa y advierte cuando un grafo se compiló contra una versión que no soporta.
Cómo se resuelve RAGE (gana la primera coincidencia):
$RAGE_ROOT: un checkout de RAGE en vivo, si lo defines (anulación para desarrollo; las ediciones se aplican sin recompilar).collectors/rage/, embebida en el binario.Actualiza la instantánea con make RAGE_ROOT=/path/to/rage (o go generate ./... en
collectors/). RAGE vive en github.com/trustedsec/rage.
Thunderstorm escanea en solo lectura usando tus credenciales de nube existentes; nunca
gestiona secretos ni escribe en el objetivo. Inicia sesión con las herramientas habituales
del proveedor y luego apunta scan a la cuenta / proyecto / suscripción.
AWS usa la cadena de credenciales estándar del SDK de AWS (un perfil con nombre, variables de entorno, SSO o un rol de instancia):
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). Inicia sesión y luego pasa el proyecto:
gcloud auth application-default login
./bin/thunderstorm scan --provider gcp --project my-project-id
Una clave de cuenta de servicio también funciona mediante GOOGLE_APPLICATION_CREDENTIALS=/path/key.json.
Azure usa la cadena de Azure CLI / DefaultAzureCredential. Inicia sesión y luego, opcionalmente, limita a una suscripción:
az login
./bin/thunderstorm scan --provider azure [--subscription <sub-id>]
Una entidad de servicio también funciona mediante AZURE_CLIENT_ID / AZURE_CLIENT_SECRET / AZURE_TENANT_ID.
Escanear muchas cuentas a la vez usa --aws-profiles, --gcp-projects,
--azure-subscriptions o un archivo --scopes (provider:scope por línea).
Compilar (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
Escanear y luego explorar:
./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
Sin --out, los engagements aterrizan en ./output/ (ignorado por git). Eso es toda la
herramienta: scan, redact, view, version.
STRUCTURAL y se excluye de las rutas.Thunderstorm está licenciado bajo la GNU General Public License v3 (ver LICENSE).
Es una herramienta de seguridad ofensiva proporcionada únicamente para pruebas de seguridad
autorizadas, educación e investigación; obtén autorización explícita antes de ejecutarla
contra cualquier entorno que no poseas. Consulta el aviso de Uso Autorizado al inicio de LICENSE.