
Formato NDJSON de grafo de ataque neutral respecto al proveedor con taxonomía de nodos/aristas, mapeos de AWS/GCP/Azure, reglas de derivación y una base de datos de exposición para herramientas de seguridad ofensiva.
Un grafo de ataque que realmente puedes entregar a otra persona.
Todos los productos de seguridad basados en grafos mantienen tu grafo de ataque encerrado dentro de un almacén propietario. No puedes exportarlo, comparar dos escaneos, ponerlo en control de versiones ni consultarlo con nada que no sea la propia interfaz del proveedor. Cuando termina el engagement, el grafo se va con él.
RAGE es un formato de archivo neutral respecto al proveedor para grafos de seguridad ofensiva, además del corpus abierto que le da sentido: la taxonomía de nodos y aristas, los mapeos y recetas de recolección de AWS/GCP/Azure, y las reglas de derivación de aristas. Un archivo. Cualquier lenguaje. Listo para usar.
Estado: borrador temprano (spec_version: 0.1). Aún no es estable; los comentarios y pull requests son bienvenidos.
Un grafo RAGE es un único archivo NDJSON (un objeto JSON por línea). La línea 1 es el manifiesto; cada una de las demás líneas es un registro etiquetado con kind.
{"kind":"manifest","spec_version":"0.1"}
{"kind":"node","node_id":"gcp|proj-a|gcp:iam:service-account|sa-deploy","node_type":"ServiceAccount"}
{"kind":"node","node_id":"gcp|proj-a|gcp:iam:service-account|sa-admin","node_type":"ServiceAccount"}
{"kind":"node","node_id":"gcp|proj-a|gcp:storage:bucket|bucket-crown","node_type":"ObjectStorage"}
{"kind":"edge","type":"CanImpersonate","source":"gcp|proj-a|…|sa-deploy","target":"gcp|proj-a|…|sa-admin"}
{"kind":"edge","type":"CanReadData","source":"gcp|proj-a|…|sa-admin","target":"gcp|proj-a|…|bucket-crown"}
{"kind":"finding","resource_id":"gcp|proj-a|…|bucket-crown","severity":"critical"}
Una cadena de dos saltos que respeta la taxonomía: sa-deploy puede suplantar a sa-admin (una arista de identidad a identidad), que puede leer el bucket de las joyas de la corona (identidad a almacenamiento).
Léelo en tres líneas de cualquier lenguaje:
for line in open("graph.rage.ndjson"): rec = json.loads(line) # switch on rec["kind"]
jq 'select(.kind=="edge" and .type=="CanImpersonate")' graph.rage.ndjson
| kind | campos requeridos | propósito |
|---|---|---|
manifest | spec_version | línea 1: versión + conteos/alcance/productor opcionales |
node | node_id, node_type | un recurso o identidad |
edge | source, target, type | una capacidad o relación |
fact | fact_id | una observación normalizada a partir de la cual se construyó el grafo |
evidence | evidence_id, content_hash | recibo a prueba de manipulación (una operación de API/recolección) |
finding | resource_id, severity | una exposición |
surface / path | - | tipos de extensión opcionales |
La cadena de procedencia es evidence (API) luego fact luego edge/finding, enlazados por ids. node_type y el type de las aristas provienen de los registros abiertos en vocab/. Todo lo demás es enriquecimiento opcional. Consulta spec/format.md.
El formato es solo la mitad de RAGE. La otra mitad es el corpus compartido que da significado a los tipos, para que dos herramientas independientes coincidan en qué es CanImpersonate y dónde puede filtrarse una credencial:
vocab/): 105 tipos de nodo en 10 clases, 80 tipos de arista en 9 categorías.providers/): 219 tipos de recurso nativos en AWS, GCP y Azure, cada uno mapeado a un tipo de nodo genérico con las llamadas que lo enumeran.rules/): el contrato en rules/derivation.json más más de 2.400 reglas ejecutables match/where/emit sobre cómo se derivan las aristas.exposure-db/): 1.049 sitios de filtración de credenciales mapeados, cada uno vinculado a la arista RAGE que emite y a la receta que lo lee.Todo el corpus, legible por humanos, está en TAXONOMY.md.
RAGE está diseñado para que cualquiera pueda producirlo o consumirlo. El formato es el contrato; las herramientas son intercambiables, y la lista está abierta.
RAGE es el formato, Thunderstorm lo produce, Blaze lo explora.
| implementación | rol | dónde |
|---|---|---|
| Thunderstorm | productor: recolector de nube de solo lectura + motor de derivación | github.com/ustayready/thunderstorm |
| tu herramienta aquí | productor o consumidor | emite o lee .rage.ndjson y es interoperable |
Todo lo que lee o escribe el formato habla RAGE. Los productores y motores conformes se ajustan a los registros de este repositorio; RAGE no depende de ninguno de ellos. Consulta COMPATIBILITY.md para saber cómo las implementaciones se fijan a una spec_version.
spec/format.md - el formato de transmisión (registros, gramática de node_id, .rage.zip, alcance).spec/edges.md - semántica de aristas: dirección/recorrido, state, weight/walkable, canonicalización.spec/rules.md - semántica de evaluación de reglas: punto fijo, fusión de estado, el catálogo de funciones.schemas/ - JSON Schema para los 8 tipos de registro.vocab/ - node-types.json + edge-types.json + conditions.json.rules/derivation.json - el contrato de derivación de aristas (por arista: condiciones + permisos/disparadores por nube).rules/{derived,explicit}/** - el corpus ejecutable de más de 2.400 reglas match/where/emit.providers/{aws,gcp,azure}.json - mapeos de nativo a genérico + recetas de nodos + recetas de hechos.exposure-db/{aws,gcp,azure}.json + vocabulary.json - la Exposure DB (1.049 sitios de filtración).TAXONOMY.md - todo el corpus, legible por humanos (generado a partir de los registros anteriores).tools/rage_engine.py - el motor de reglas de referencia: ejecuta el corpus de reglas derivadas sobre un grafo hasta un punto fijo.validate/ - validadores de registros (JSON Schema completo), registros, cadenas de permisos y corpus de reglas.examples/ - un grafo válido mínimo que ejercita los 8 tipos de registro.python3 -m venv .venv && ./.venv/bin/pip install -r requirements.txt
./.venv/bin/python validate/rage_validate.py examples/minimal.rage.ndjson # full JSON Schema + refs
./.venv/bin/python validate/check_registries.py # registry integrity
./.venv/bin/python validate/check_rules.py # rule corpus vs vocab
CI ejecuta todo lo anterior más una compuerta de no-deriva de gen_taxonomy.
Apache-2.0 (consulta LICENSE).