
벤더 중립적 NDJSON 공격 그래프 형식으로, 노드/엣지 분류 체계, AWS/GCP/Azure 매핑, 파생 규칙, 그리고 공격적 보안 도구를 위한 노출 DB를 포함합니다.
실제로 다른 사람에게 건네줄 수 있는 공격 그래프.
모든 그래프 기반 보안 제품은 공격 그래프를 독점 저장소 안에 가둬 둔다. 내보낼 수도, 두 스캔을 diff할 수도, 버전 관리에 넣을 수도, 벤더 자체 UI 외의 무엇으로도 질의할 수도 없다. 작업이 끝나면 그래프도 함께 사라진다.
RAGE는 공격 보안 그래프를 위한 벤더 중립적 파일 형식이며, 여기에 의미를 부여하는 공개 코퍼스—노드 및 엣지 분류 체계, AWS/GCP/Azure 매핑과 수집 레시피, 엣지 도출 규칙—를 함께 제공한다. 파일 하나. 어떤 언어든. 바로 사용.
상태: 초기 초안(spec_version: 0.1). 아직 안정적이지 않음; 피드백과 풀 리퀘스트를 환영한다.
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"}
분류 체계를 따르는 2홉 체인: sa-deploy는 sa-admin을 가장할 수 있고(아이덴티티 대 아이덴티티 엣지), 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는 그중 어느 것에도 의존하지 않는다. 구현체가 spec_version에 어떻게 고정되는지는 COMPATIBILITY.md를 참조.
spec/format.md - 와이어 형식(레코드, node_id 문법, .rage.zip, scope).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 무표류(no-drift) 게이트를 실행한다.
Apache-2.0 (LICENSE 참조).
| kind | 필수 필드 | 목적 |
|---|
manifest | spec_version | 1번 줄: 버전 + 선택적 counts/scope/producer |
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 - 노출 DB(1,049개 유출 지점).TAXONOMY.md - 사람이 읽을 수 있는 전체 코퍼스(위 레지스트리에서 생성됨).tools/rage_engine.py - 참조 규칙 엔진: 그래프 위에서 도출 규칙 코퍼스를 고정점까지 실행한다.validate/ - 레코드(전체 JSON Schema), 레지스트리, 권한 문자열, 규칙 코퍼스 검증기.examples/ - 8개 레코드 종류를 모두 사용하는 최소 유효 그래프.