
ベンダー中立のNDJSON攻撃グラフ形式。ノード/エッジの分類体系、AWS/GCP/Azureマッピング、導出ルール、およびオフェンシブセキュリティツール向けのエクスポージャーDBを備える。
実際に他人に渡すことができる攻撃グラフ。
グラフベースのセキュリティ製品はすべて、攻撃グラフを独自のストアに閉じ込めてしまいます。エクスポートもできず、2つのスキャンをdiffすることも、バージョン管理に置くことも、ベンダー自身のUI以外でクエリすることもできません。エンゲージメントが終われば、グラフも一緒に去ってしまいます。
RAGEは、オフェンシブセキュリティグラフのためのベンダー中立なファイルフォーマットであり、さらにそれに意味を与えるオープンなコーパス、すなわちノードとエッジのタクソノミー、AWS/GCP/Azureのマッピングと収集レシピ、そしてエッジ導出ルールを備えています。1つのファイル。任意の言語。すぐに使えます。
ステータス: 初期ドラフト(spec_version: 0.1)。まだ安定していません。フィードバックとプルリクエストを歓迎します。
RAGEグラフは単一のNDJSONファイルです(1行につき1つのJSONオブジェクト)。1行目はマニフェストで、それ以外のすべての行は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"}
タクソノミーに従った2ホップのチェーン: sa-deployはsa-adminになりすますことができ(アイデンティティからアイデンティティへのエッジ)、sa-adminはクラウンジュエルのバケットを読み取ることができます(アイデンティティからストレージへ)。
任意の言語で3行で読み取れます:
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
プロヴェナンスチェーンはevidence(API)、次にfact、次にedge/findingで、idによってリンクされます。node_typeとエッジのtypeはvocab/内のオープンなレジストリから取得されます。それ以外はすべて任意のエンリッチメントです。spec/format.mdを参照してください。
フォーマットはRAGEの半分にすぎません。もう半分は、型に意味を与える共有コーパスであり、2つの独立したツールがCanImpersonateとは何か、そして認証情報がどこで漏洩しうるかについて一致できるようにします:
vocab/): 10クラスに105のノード型、9カテゴリに80のエッジ型。providers/): AWS、GCP、Azureにわたる219のネイティブリソース型。それぞれが、それを列挙する呼び出しとともに汎用ノード型にマッピングされています。rules/): rules/derivation.json内のコントラクトに加え、エッジがどのように導出されるかに関する2,400以上の実行可能なmatch/where/emitルール。exposure-db/): 1,049のマッピングされた認証情報漏洩サイト。それぞれが、それが発するRAGEエッジと、それを読み取るレシピに紐付けられています。コーパス全体は、人間が読める形でTAXONOMY.mdにあります。
RAGEは、誰でもそれを生成または消費できるように設計されています。フォーマットがコントラクトであり、ツールは交換可能で、リストはオープンです。
RAGEはフォーマットであり、Thunderstormがそれを生成し、Blazeがそれを探索します。
| 実装 | 役割 | 場所 |
|---|---|---|
| Thunderstorm | プロデューサー: 読み取り専用クラウドコレクター + 導出エンジン | github.com/ustayready/thunderstorm |
| あなたのツールをここに | プロデューサーまたはコンシューマー | .rage.ndjsonを出力または読み取れば相互運用できます |
フォーマットを読み書きするものはすべてRAGEを話します。準拠するプロデューサーとエンジンは、このリポジトリ内のレジストリに準拠します。RAGEはそれらのいずれにも依存しません。実装がspec_versionにどのように固定されるかについては、COMPATIBILITY.mdを参照してください。
spec/format.md - ワイヤフォーマット(レコード、node_id文法、.rage.zip、スコープ)。spec/edges.md - エッジのセマンティクス: 方向/トラバーサル、state、weight/walkable、正規化。spec/rules.md - ルール評価のセマンティクス: 不動点、状態マージ、関数カタログ。schemas/ - 8つすべてのレコード種別のJSON Schema。vocab/ - node-types.json + edge-types.json + conditions.json。rules/derivation.json - エッジ導出コントラクト(エッジごと: 条件 + クラウドごとのパーミッション/トリガー)。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は上記のすべてに加えて、gen_taxonomyのドリフトなしゲートを実行します。
Apache-2.0(LICENSEを参照)。
| kind | 必須フィールド | 目的 |
|---|
manifest | spec_version | 1行目: バージョン + 任意のカウント/スコープ/プロデューサー |
node | node_id, node_type | リソースまたはアイデンティティ |
edge | source, target, type | ケイパビリティまたは関係 |
fact | fact_id | グラフの構築元となった正規化された観測 |
evidence | evidence_id, content_hash | 改ざん検知可能なレシート(API/収集操作) |
finding | resource_id, severity | 露出 |
surface / path | - | 任意の拡張種別 |
rules/{derived,explicit}/** - 2,400以上のmatch/where/emitルールの実行可能なコーパス。providers/{aws,gcp,azure}.json - ネイティブから汎用へのマッピング + ノードレシピ + ファクトレシピ。exposure-db/{aws,gcp,azure}.json + vocabulary.json - Exposure DB(1,049の漏洩サイト)。TAXONOMY.md - コーパス全体を人間が読める形で(上記のレジストリから生成)。tools/rage_engine.py - リファレンスルールエンジン: 導出ルールコーパスをグラフ上で不動点まで実行します。validate/ - レコード(完全なJSON Schema)、レジストリ、パーミッション文字列、ルールコーパスのバリデータ。examples/ - 8つすべてのレコード種別を行使する最小限の有効なグラフ。