
Herstellerneutrales NDJSON-Angriffsgraph-Format mit Knoten-/Kanten-Taxonomie, AWS/GCP/Azure-Zuordnungen, Ableitungsregeln und einer Exposure-DB für Offensive-Security-Tooling.
Ein Attack Graph, den man tatsächlich weitergeben kann.
Jedes graphbasierte Sicherheitsprodukt hält deinen Attack Graph in einem proprietären Speicher eingeschlossen. Du kannst ihn nicht exportieren, zwei Scans nicht vergleichen, ihn nicht in die Versionskontrolle aufnehmen oder ihn mit etwas anderem als der UI des Anbieters abfragen. Wenn das Engagement endet, verschwindet der Graph mit ihm.
RAGE ist ein anbieterneutrales Dateiformat für offensive Sicherheitsgraphen, plus der offene Korpus, der ihm Bedeutung verleiht: die Knoten- und Kanten-Taxonomie, die AWS/GCP/Azure-Mappings und Collection-Rezepte sowie die Kantenableitungsregeln. Eine Datei. Jede Sprache. Einfach nehmen und loslegen.
Status: früher Entwurf (spec_version: 0.1). Noch nicht stabil; Feedback und Pull
Requests sind willkommen.
Ein RAGE-Graph ist eine einzelne NDJSON-Datei (ein JSON-Objekt pro Zeile). Zeile 1 ist das
Manifest; jede andere Zeile ist ein Datensatz, der mit kind gekennzeichnet ist.
{"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"}
Eine Zwei-Hop-Kette, die die Taxonomie respektiert: sa-deploy kann sa-admin imitieren
(eine Identität-zu-Identität-Kante), welche den Kronjuwelen-Bucket lesen kann (Identität zu
Storage).
Lies es in drei Zeilen in jeder Sprache:
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 | erforderliche Felder | Zweck |
|---|---|---|
manifest | spec_version | Zeile 1: Version + optionale Zählungen/Scope/Producer |
node | node_id, node_type | eine Ressource oder Identität |
edge | source, target, type | eine Fähigkeit oder Beziehung |
fact | fact_id | eine normalisierte Beobachtung, aus der der Graph erstellt wurde |
evidence | evidence_id, content_hash | manipulationssicherer Beleg (eine API-/Collection-Operation) |
finding | resource_id, severity | eine Exposition |
surface / path | - | optionale Erweiterungs-Arten |
Die Provenienzkette ist evidence (API), dann fact, dann edge/finding, verknüpft
durch IDs. node_type und Kanten-type stammen aus den offenen Registries in
vocab/. Alles andere ist optionale Anreicherung. Siehe
spec/format.md.
Das Format ist nur die Hälfte von RAGE. Die andere Hälfte ist der gemeinsame Korpus, der
den Typen Bedeutung verleiht, damit zwei unabhängige Tools darin übereinstimmen, was
CanImpersonate ist und wo ein Credential lecken kann:
vocab/): 105 Knotentypen in 10 Klassen, 80 Kantentypen in 9 Kategorien.providers/): 219 native Ressourcentypen über AWS, GCP und Azure, jeweils auf einen generischen Knotentyp abgebildet, mit den Aufrufen, die ihn enumerieren.rules/): der Vertrag in rules/derivation.json plus 2.400+ ausführbare match/where/emit-Regeln dafür, wie Kanten abgeleitet werden.exposure-db/): 1.049 kartierte Credential-Leak-Stellen, jede verknüpft mit der RAGE-Kante, die sie ausgibt, und dem Rezept, das sie liest.Der gesamte Korpus, menschenlesbar, steht in TAXONOMY.md.
RAGE ist so konzipiert, dass jeder es erzeugen oder konsumieren kann. Das Format ist der Vertrag; die Tools sind austauschbar, und die Liste ist offen.
RAGE ist das Format, Thunderstorm erzeugt es, Blaze erkundet es.
| Implementierung | Rolle | Wo |
|---|---|---|
| Thunderstorm | Producer: Read-only-Cloud-Collector + Ableitungs-Engine | github.com/ustayready/thunderstorm |
| dein Tool hier | Producer oder Consumer | gib .rage.ndjson aus oder lies es und es interoperiert |
Alles, was das Format liest oder schreibt, spricht RAGE. Konforme Producer und Engines
entsprechen den Registries in diesem Repository; RAGE hängt von keinem von ihnen ab. Siehe
COMPATIBILITY.md dazu, wie Implementierungen sich an eine
spec_version binden.
spec/format.md - das Wire-Format (Datensätze, node_id-Grammatik, .rage.zip, Scope).spec/edges.md - Kantensemantik: Richtung/Traversierung, state, weight/walkable, Kanonisierung.spec/rules.md - Regelauswertungssemantik: Fixpunkt, State-Merge, der Funktionskatalog.schemas/ - JSON Schema für alle 8 Datensatz-Arten.vocab/ - node-types.json + edge-types.json + conditions.json.rules/derivation.json - der Kantenableitungsvertrag (pro Kante: Bedingungen + pro-Cloud-Berechtigungen/Trigger).rules/{derived,explicit}/** - der ausführbare Korpus von 2.400+ match/where/emit-Regeln.providers/{aws,gcp,azure}.json - Native-zu-Generic-Mappings + Knotenrezepte + Fact-Rezepte.exposure-db/{aws,gcp,azure}.json + vocabulary.json - die Exposure DB (1.049 Leak-Stellen).TAXONOMY.md - der gesamte Korpus, menschenlesbar (generiert aus den obigen Registries).tools/rage_engine.py - die Referenz-Regel-Engine: führt den Korpus abgeleiteter Regeln über einen Graphen bis zu einem Fixpunkt aus.validate/ - Validatoren für Datensätze (vollständiges JSON Schema), Registries, Permission-Strings und Regelkorpus.examples/ - ein minimaler gültiger Graph, der alle 8 Datensatz-Arten ausübt.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 führt all das oben Genannte plus ein gen_taxonomy-No-Drift-Gate aus.
Apache-2.0 (siehe LICENSE).