供应商中立的 NDJSON 攻击图格式,包含节点/边分类法、AWS/GCP/Azure 映射、推导规则,以及用于攻击性安全工具集的暴露数据库。
一张你真正能交给别人的攻击图。
每个基于图的安全产品都把攻击图锁在专有存储里。你无法导出它、对比两次扫描、将其纳入版本控制,或用厂商自带 UI 之外的任何工具查询它。项目结束时,图也随之消失。
RAGE 是一种面向攻击性安全图的厂商中立文件格式,外加赋予其意义的开放语料库:节点与边分类法、AWS/GCP/Azure 映射与采集配方,以及边推导规则。一个文件。任意语言。即取即用。
状态: 早期草案(spec_version: 0.1)。尚不稳定;欢迎反馈和 pull request。
一个 RAGE 图就是一个 NDJSON 文件(每行一个 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"}
一条符合分类法的两跳链:sa-deploy 可以冒充 sa-admin(身份到身份的边),而后者可以读取核心数据桶(身份到存储)。
用任意语言三行代码读取它:
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 的一半。另一半是赋予这些类型意义的共享语料库,使两个独立工具对 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 不依赖它们中的任何一个。参见 COMPATIBILITY.md 了解各实现如何固定到某个 spec_version。
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 - 暴露数据库(1,049 个泄露点)。TAXONOMY.md - 整个语料库,人类可读(由上述注册表生成)。tools/rage_engine.py - 参考规则引擎:在图上运行派生规则语料库直至不动点。validate/ - 记录(完整 JSON Schema)、注册表、权限字符串和规则语料库验证器。examples/ - 一个最小的有效图,涵盖全部 8 种记录类型。