
Nimbus Vestige — Updated!
클라우드 및 ID 사고 대응을 위한 포렌식 재구성 엔진
Nimbus Vestige (NV)
클라우드 및 아이덴티티 사고 대응을 위한 포렌식 재구성 엔진.
조각난 클라우드, SaaS 및 아이덴티티 텔레메트리 — 컨트롤 플레인 로그, 로그인 이벤트, 토큰 및 동의 활동 — NV는 침입이 계정과 서비스 전반에서 어떻게 이동했을 가능성이 가장 높은지 재구성하고, 취할 수 있었던 다른 가장 유력한 경로들을 열거하며, 각 단계를 보정되고 설명 가능한 신뢰도와 함께 보고합니다. 증거가 뒷받침하지 못하는 주장은 거부합니다.
탐지는 무언가가 발생했다는 사실을 알려줍니다. Nimbus Vestige는 어떻게 — 그리고 또 무엇이 — 발생했는지를 알려줍니다.
왜 존재하는가
현대의 침입은 "침입"하지 않습니다. 그들은 로그인합니다. 아이덴티티는 이제 주요 공격 수단이며, 클라우드 IR 조사의 대다수에 연루되어 있고, 대부분의 침입은 아이덴티티 + 클라우드 + SaaS + 엔드포인트 등 여러 표면에 걸쳐 있습니다. 이를 기록하는 텔레메트리는 파편화되고 일관성이 없어, 이미 대응자는 불완전한 데이터로 스토리를 손수 재구성해야 합니다.
그 수동 재구성은 느리고, 예측 가능한 방식으로 실패합니다: 대응자는 첫 번째 그럴듯한 내러티브에 고착되어 실제를 놓칩니다. NV는 재구성을 자동화하고, 단일 스토리가 아닌 항상 순위가 매겨진 그럴듯한 경로 공간을 제시함으로써 그 실패 모드를 직접 공격합니다.
결정적으로, NV는 정직함을 제품으로 삼아 이를 수행합니다. 시장이 명시적으로 적으로 삼는 것은 블랙박스 신뢰도 — 작업 과정을 보여주지 않고 결론을 주장하는 도구입니다. NV가 생성하는 모든 숫자는 그 숫자를 얻은 구체적 증거로 추적 가능하며, 뒷받침할 수 없는 것은 추측 대신 보류됩니다.
그것이 무엇인지 — 그리고 아닌지
NV는 탐지기, 스캐너, 감사 도구 또는 공격 실행 도구가 아닙니다. 그러한 도구는 무언가 발생했다는 사실을 알려주고 측정합니다. NV는 역방향으로 작동합니다 — 파편화된 아이덴티티 자산 전반의 패턴으로부터 메커니즘을 귀추적으로 재구성합니다.
- 탐지기가 아님 — 활동에 대한 알림을 발화하지 않으며, 활동이 어떻게 맞물리는지를 설명합니다.
- SIEM이 아님 — 로그 플랫폼이 아닌 좁은 틈(사후 침입 내러티브 재구성)으로 진입합니다.
- 규칙 엔진이 아님 — 알려진 패턴과 일치하는 것이 없어도 여전히 재구성하며, 맹목이 되는 대신 우아하게 성능이 저하됩니다.
장기적으로 유효한 이유
-
블루 팀은 재생되고 레드 팀은 상품화됩니다. 공격 도구는 유한하고 패치 가능한 구멍들을 찾아내며 자동화된 CI/CD 안전 파이프라인으로 흡수되고 있습니다. 침입이 어떻게 발생했는지 재구성하는 일은 결코 끝나지 않습니다 — 공격자는 계속 발명하므로, 그 필요성은 영구적이고 자기 갱신적입니다.
-
엔진은 기반 인프라에 독립적입니다. 핵심 로직 — 보정된 신뢰도와 정지 레일을 갖춘 패턴으로부터 메커니즘 재구성 — 은 먼저 클라우드/아이덴티티에 적용되지만, 이후 네트워크, 엔드포인트 및 OT로 확장됩니다. 테제를 다시 쓰지 않고 대상을 바꿀 수 있습니다.
-
재구성은 하드닝을 가능하게 합니다. 그들이 어떻게 들어왔는지 — 그리고 어떤 다른 문이 열려 있었는지 — 알게 되면 방어를 구축합니다. 실제로 취하지 않았지만 그럴듯했던 경로는 하드닝 백로그이며, 대부분의 침해가 새로운 전술이 아닌 예방 가능한 노출을 악용하기 때문에 재구성 자체보다 더 가치 있는 경우가 많습니다.
-
새로운 침입에 대해 우아하게 성능이 저하됩니다 — 가장 중요한 바로 그 사고에서 말입니다. 시그니처/규칙 엔진은 제로데이에서 맹목이 되지만, NV의 귀추적 코어는 여전히 가장 유력한 경로를, 정직하게 낮은 신뢰도로 표시하여 생성합니다.
-
정직함은 해자입니다. 보정되고 사례 기반의 신뢰도와 순위가 매겨진 대안은 정확히 시장이 원한다고 말하는 것이며, 블랙박스 경쟁사는 재설계 없이는 구조적으로 제공할 수 없는 것입니다.
아키텍처
원시 제공자 로그 → 정규화된 이벤트/엔티티 그래프 → 재구성 엔진 → JSON → GUI.``` O365 / Entra audit logs nv_extract_identity_events.py AWS CloudTrail (IAM/STS/S3) nv_extract_cloudtrail_events.py (ingest + normalize) ▼ normalized identity events (JSONL) ← one event model, any substrate │ nv/graph.py (typed per-actor timelines) ▼ reconstruction engine ├─ nv/patterns.py known layer: ATT&CK identity pattern library ├─ nv/providers.py provider packs: per-substrate op→ATT&CK vocab (Entra + AWS) ├─ nv/validation.py Phase 3: provenance + integrity gate on every pattern ├─ nv/feeds.py live ATT&CK STIX / TAXII / Sigma clients + scheduler ├─ nv/confidence.py evidence-corroboration scorer (calibratable weights) ├─ nv/calibration.py fit + measure confidence against labeled ground truth ├─ nv/reconstruct.py most-likely chain + ranked competing paths + trust floor └─ nv/scope.py authorized-scope gate (refuses unauthorized tenants/accounts) │ run_nv.py ▼ reconstruction.json ──► nv_gui.html (embedding canvas + two-column view + trust slider)
GUI는 **순수한 뷰 레이어**입니다. 엔진 출력을 렌더링하고 분석가가 신뢰 기준(trust floor)을 이동할 수 있게 합니다. 자체적인 재구성 로직은 포함하지 않습니다.
---
## 신뢰도 모델 (제품 전체의 신뢰성)
각 단계는 [0, 1] 범위의 신뢰도를 가지며, **증거 확증(evidence corroboration)**을 통해 구축됩니다:```
confidence = per-technique base rate
+ bonus for each independent corroborating signal
(source IP, device, successful outcome, temporal adjacency, broad-consent flags)
− penalty for missing signals (e.g. no source IP to corroborate origin)
- 검증됨 — 신뢰도 ≥ 0.70 그리고 두 개 이상의 독립 신호가 일치합니다.
- 패턴 전용 — 신뢰 하한선보다 높지만 약하거나 단일 신호로만 뒷받침됩니다.
- 보류됨 — 신뢰 하한선보다 낮습니다. 회색으로 표시되며, 절대 조용히 추측되거나 숨겨지지 않습니다.
경로 점수는 링크들을 기하 평균으로 합성하므로, 하나의 약한 링크는 평균에 묻혀 사라지는 대신 정직하게 경로를 끌어내립니다.
위의 모든 가중치 — 기법별 기준 비율, 신호별 보너스, 누락 패널티 — 는 nv/confidence.py의 단일 PARAMS 테이블에 들어 있습니다. 이것들은 NV의 v1 사전 확률이며, 보정 가능합니다: nv/calibration.py는 이들을 레이블된 실측 정답에 맞춰 재조정할 수 있고, 엔진은 결과를 로드하며, 보정이 제공되지 않으면 v1 사전 확률로 폴백합니다(아래 참조).
신뢰 하한선
보류 규칙은 엔진의 출력 계약에 내장되어 있습니다 — UI만이 아니라. 하한선 아래의 단계는 보류됩니다. 하한선을 조정하는 것은 정직성 대 커버리지 트레이드오프를 물리적으로 구현하는 것입니다: 올리면 엄격/고신뢰, 내리면 허용적/고커버리지. 기본 하한선은 분석가가 만지기 전에 NV가 어디에 위치할지에 대한 편집상의 결정입니다.
실측 정답에 대한 신뢰도 보정
v1 가중치는 방어 가능하지만, 이것은 사전 확률입니다. nv/calibration.py는 이들을 레이블된 실측 정답 — 어떤 이벤트가 침입의 일부였고 어떤 것이 정상이었는지 아는 이벤트들 — 에 맞춰 조정하며, 결정적으로 조정이 실제로 도움이 되었는지 측정합니다. 따라서 보정은 단순히 숫자를 이리저리 옮기는 것이 아니라 보정 오류를 낮추는 경우에만 채택됩니다.
보정된 신뢰도는 한 가지를 의미합니다: 어떤 단계에 대한 NV의 신뢰도는 그 단계가 실제로 공격 경로에 있었을 확률과 같아야 합니다. 따라서 각 레이블된 이벤트의 신뢰도는 예측 확률로 취급되며, 하네스는 다음을 피팅합니다:
- 운영별 기준 비율 — 해당 운영에 대한 경험적 적중률로, 작은 표본이 과적합되지 않도록 v1 사전 확률 쪽으로 베이지안 축소된 값; 그리고
- 신호별 보너스와 두 패널티 — v1 값 쪽으로 L2 당김(L2 pull)이 있는 제한된 좌표 하강법(bounded coordinate descent)으로 Brier 점수를 최소화합니다.
검증/보류 임계값은 정책이지 보정이 아니므로 그대로 둡니다.
이 도구는 보정 전후의 Brier 점수, log-loss, ECE, AUC, 신뢰도 테이블, 그리고 신뢰 하한선 스윕(각 하한선에서 실제 단계 재현율과 정상 이벤트 오탐률)을 보고합니다. 즉, 정직성 대 커버리지 트레이드오프가 단일 숫자가 아니라 명확히 읽을 수 있게 됩니다.```bash
calibrate against a real, labeled BadZure / MAAD-AF run
python3 calibrate.py --labeled run_labeled.jsonl --origin live
--run-label "badzure-2026-07 tenant-x" --out calibration.json
demonstrate on the bundled documented-shape proxy corpus
python3 calibrate.py --out calibration.json
run the engine on calibrated weights (opt-in; v1 priors are the default)
python3 run_nv.py events.jsonl out.json --authorize t.onmicrosoft.com
--calibration calibration.json
**실측 자료(ground truth) 출처.** 정확한 입력은 실제 테넌트에서 실행된 BadZure / MAAD-AF 실행에서 수집된 원격 계측(telemetry)이며, 통합 감사 로그를 공격 도구 자체의 활동 기록과 조인해 레이블을 붙입니다(도구가 유발한 모든 이벤트는 온체인(on-chain)에 있고, 그 외 모든 것은 정상 활동입니다 — `nv/calibration.py`의 `LABELED_SCHEMA` 참조). 실제 실행을 가리키기 전까지는 `eval/calibration_cases.py`가 문서화된 형태의 **프록시** 말뭉치를 제공하며, 이로부터 피팅된 모든 아티팩트는 출처에 `source="proxy"`로 표시되어 프록시 피팅이 실제 실행으로 오인될 수 없습니다. `calibration.proxy.json`이 바로 번들된 프록시 아티팩트입니다.
번들된 프록시 말뭉치에서의 피팅은 명확한 개선입니다 — Brier 0.398 → 0.045, ECE 0.576 → 0.081, AUC 0.81 → 0.91, 그리고 0.60 기준선에서 정상 활동에 대한 오탐율은 0.69에서 0.00으로 급감합니다(v1 사전 확률은 정상 활동에 대해 심하게 과신하고 있었습니다). 프록시는 의도적으로 보수적입니다. 실제 배포할 가중치를 산출하는 것은 라이브 테넌트 실행입니다.
## 신뢰 무결성 (Phase 3)
두 가지 일급 제어 장치가 잘못된 입력으로부터 재구성을 보호합니다:
- **인가 범위 게이트** (`nv/scope.py`) — NV는 인가 목록에 없는 환경(estate)에서는 실행을 거부합니다. 조사가 허용된 각 환경마다 `--authorize <tenant-domain>`을 사용하여 실행하세요.
- **패턴 소스 검증** (`nv/validation.py`) — 패턴은 (1) 신뢰할 수 있는 소스 허용 목록, (2) 콘텐츠 체크섬/변조 검사, (3) 스키마 정상성, (4) 유효한 ATT&CK 스타일 기술 ID를 모두 통과하지 않으면 라이브러리에 들어갈 수 없습니다. 승인된 모든 패턴은 감사 기록을 유지하고, 거부된 패턴은 이유와 함께 기록됩니다. 오염되거나 잘못된 형태의 피드는 거짓 재구성을 제조하기 전에 상류에서 차단됩니다. 이는 엔진이 증거에 적용하는 것과 동일한 회의주의를 패턴 자체로 옮긴 것입니다.
---
## 지식 최신성 유지 (공격자의 진화에 앞서 나가기)
재구성 엔진의 최신성은 패턴 라이브러리와, 라이브러리가 한 번도 본 적 없는 것을 처리하는 능력에 달려 있습니다. NV는 설계상 **두 개의 독립된 전선**에서 노후화 문제를 해결합니다:
### 1. 알려진 계층은 검증된 업데이트 파이프라인을 통해 최신 상태를 유지합니다
라이브러리는 하드코딩되어 있지 않습니다 — `nv/patterns.py`는 (내장 세트를 포함한) 모든 패턴을 `nv/validation.py`를 통해 로드하므로 외부 피드도 동일한 신뢰 경로로 들어옵니다. 일정에 따라 이러한 피드를 가져오는 실제 네트워크 클라이언트는 `nv/feeds.py`에 구현되어 있으며 `update_feeds.py`가 구동합니다. 신뢰 계층별 소스는 다음과 같습니다:
- **MITRE ATT&CK (STIX)** — 권위 있는 테크닉 분류 체계입니다. 커넥터는 ATT&CK STIX 인덱스를 읽고 최신 enterprise 릴리스를 가져와 NV가 추론하는 모든 작업(operation)에 대한 권위 있는 테크닉 이름과 전술(tactic)을 갱신합니다 — ATT&CK가 이후 철회하거나 폐기한 테크닉은 제외합니다. NV는 작업→테크닉 바인딩과 기본 비율 사전(base-rate prior)의 소유권을 유지하고, ATT&CK는 분류 체계를 소유합니다.
- **TAXII 2.1을 통한 검증된 CTI** — 전체 discovery → api-root → collection → objects 클라이언트입니다. 검증된 CTI 컬렉션에서 STIX attack-pattern 객체를 가져와 NV가 추적하는 테크닉을 갱신합니다. ATT&CK보다 낮은 가중치를 가집니다.
- **Sigma 커뮤니티 규칙 세트** — git 아카이브로 가져옵니다. O365/Entra 작업을 명명하고 `attack.tXXXX` 태그를 포함하는 각 클라우드/아이덴티티 규칙은 작업→테크닉 후보가 되며, 기본 비율은 규칙 자체의 심각도 `level`에서 파생된 후 커뮤니티 소스 가중치로 축소됩니다. 매핑되지 않는 규칙은 이유와 함께 건너뛰며, 추측하지 않습니다.
작업 충돌이 발생하면 커밋 전에 합집합이 신뢰도 오름차순으로 정렬되므로 권위 있는 ATT&CK 바인딩이 항상 커뮤니티 바인딩을 이깁니다. 하위 계층 콘텐츠도 계속 승인되며 확인 증거(corroboration)로 감사 기록에 남습니다. `update_library(candidates)`는 전체 세트를 검증을 통해 다시 입력하고 라이브러리를 원자적으로 재구축하므로, 오염된 피드가 라이브러리를 절반만 업데이트된 상태로 남겨둘 수 없습니다.
**허용 목록은 하나가 아니라 두 개입니다.** 검증은 이미 소스 태그를 기준으로 차단하며, 커넥터는 네트워크 계층 *호스트* 허용 목록을 추가합니다. 따라서 커넥터는 TLS를 통해 신뢰할 수 있는 호스트에서만 가져올 수 있습니다 — 이는 소스 허용 목록의 전송 계층에 해당하며, 하이재킹되거나 잘못 입력된 피드 URL에 대한 방어입니다. 모든 가져오기는 원시 페이로드 sha256, URL 및 시간을 출처로 기록하므로 이후 다시 가져올 때 상류 변경을 감지할 수 있습니다.
**피드가 늘어날수록 검증 계층이 더 중요한 이유:** 업데이트를 자동화할수록 자동 업데이트 파이프라인은 위장된 신뢰 위험이 됩니다 — 잘못되었거나 오염된 피드는 거짓 패턴을 주입하고 거짓 재구성을 만들어냅니다. NV는 수집을 적대적 상황으로 취급합니다: 모든 패턴, 모든 업데이트에 대해 허용 목록, 체크섬, 스키마, 감사 추적을 적용합니다.
### 2. 가설적(abductive) 계층은 아직 어떤 피드도 명명하지 않은 것을 처리합니다
피드는 항상 최신 수법에 뒤처져 있습니다. 가설적 추론 코어가 그 방어막입니다: 관찰된 작업이 라이브러리의 어떤 패턴과도 일치하지 **않을** 때, NV는 이를 버리지 않고 — 기본 원리에서 가장 가능성 있는 경로를 재구성한 다음 신뢰도를 낮춰 `no known match`로 표시합니다. 이는 eval 스위트(`eval/ground_truth_cases.py`)에서 검증됩니다. 여기서 의도적으로 알려지지 않은 관리 ID 토큰 탈취 단계가 탐지되고, 올바르게 순서가 매겨지며, 신뢰 기준선 아래로 정직하게 가중치가 낮아집니다.
이 두 가지가 결합되어 NV는 결코 완전히 낡은 상태가 되지 않습니다: 알려진 계층은 오염 저항 파이프라인을 통해 공개된 최첨단을 추적하고, 가설적 계층은 최첨단이 아직 따라잡지 못한 침입에 도구가 장님이 되지 않게 해줍니다.
### 권장 업데이트 주기
`nv/feeds.py`는 피드별 주기를 가지며 `update_feeds.py`는 기한이 된 것만 가져오므로, 그대로 cron이나 systemd 타이머에 넣을 수 있습니다:
- ATT&CK STIX — 90일 (연간 몇 번의 공식 릴리스).
- CTI/TAXII — 7일 (피드가 게시될 때), 항상 검증을 거침.
- Sigma — 30일.```bash
# run whatever is due, keeping state under ./.nv_feeds (cron-friendly)
python3 update_feeds.py
# force all feeds now but only report what would change
python3 update_feeds.py --force --dry-run
# run fully offline against captured fixtures (no network)
python3 update_feeds.py --offline eval/fixtures --force
라이브러리를 변경한 후에는 eval/run_eval.py를 다시 실행하여 알려진 공격 형태가 여전히
재구성되는지 확인하고, eval/validation_cases.py로 게이트가 여전히 잘못된 입력을 거부하는지 확인하며,
eval/feeds_offline_test.py로 피드 경로가 종단 간 그대로 유지되는지 확인하십시오.
데모 데이터에 관한 참고 사항
nv_gui.html에 표시된 재구성 결과는 공개 연구 데이터셋을 기반으로 제작되었습니다
— invictus-ir Office 365 통합 감사 로그 코퍼스 — 어떤 회사의 실시간 테넌트에서 가져온 것이
아닙니다. 이 데이터는 엔진이 누구의 협력 없이도 종단 간 데모되고 자체 사용(dogfood)될 수 있도록
존재합니다. NV를 실제로 사용하려면 조직은 아래 설명대로 자체 Entra/M365
감사 데이터를 연결하면 됩니다. 이 프로젝트에는 독점 데이터나 고객 데이터가 어디에도
포함되어 있지 않습니다.
자체 데이터 연결
NV는 실행되는 곳 어디에서나 실행되며, 로그가 환경을 벗어날 필요가 없습니다. 네 단계입니다:
1 — 감사 로그 내보내기. NV는 Microsoft 365 통합 감사 로그를 읽습니다.
Microsoft Purview(감사 검색 → CSV 내보내기), Search-UnifiedAuditLog
Exchange Online PowerShell cmdlet, Microsoft Graph auditLogs / signIns
엔드포인트, 또는 Sentinel/SIEM에서 내보낸 OfficeActivity 및 SigninLogs에서 가져옵니다.
2 — 정규화하기 NV가 추론하는 이벤트 모델로:```bash python3 nv_extract_identity_events.py your_audit_export.csv your_events.jsonl
이것은 로그인, 동의 부여, 서비스 사용자 및 역할 변경, 사서함 액세스를 유지합니다 — NV가 한 번도 명명하지 않은 ID 작업을 포함하므로 여전히 가추적 계층에 도달합니다 — 나머지는 버립니다. 표준 `AuditData` 열을 포함하는 CSV 또는 각 레코드가 `AuditData` 객체인 JSON/JSONL(invictus-ir 연구 코퍼스가 제공하는 형태)을 읽습니다.
**3 — 범위 제한 재구성.** 엔진은 명시적으로 승인하지 않은 테넌트에서는 실행을 거부합니다:```bash
python3 run_nv.py your_events.jsonl reconstruction.json \
--authorize yourtenant.onmicrosoft.com
4 — 보기. nv_gui.html을 열고 ⤒ load reconstruction.json을 클릭하여 엔진이 방금 생성한 파일을
가리키게 합니다. 같은 화면에 인시던트, 엔터티,
신뢰 대역이 표시됩니다. 임베딩 캔버스의 모든 점은 클릭 시 해당 엔터티의 재구성을
다시 실행합니다.
대신 AWS CloudTrail 분석하기
엔진은 기반(substrate)에 독립적입니다 — 작업 어휘만 공급자별로 다릅니다
(nv/providers.py). AWS 경로도 CloudTrail을 대상으로 동일한 세 단계를 거칩니다:```bash
python3 nv_extract_cloudtrail_events.py cloudtrail.json aws_events.jsonl
python3 run_nv.py aws_events.jsonl reconstruction.json --authorize aws:123456789012
ingest는 IAM/STS/로그인 이벤트(새로운 IAM 작업 포함, abductive 레이어에 도달하도록)와 S3 객체 읽기를 유지하며, 테넌트 도메인이 아닌 AWS **계정**을 기준으로 범위를 제한한다. 동일한 abductive 코어, 신뢰도 모델, 신뢰 하한선이 변경 없이 적용된다.
GUI에는 또한 **데모 데이터 배너**와 앱 내 "자체 데이터 연결" 가이드가 포함되어 있어, 누구든 이 앱을 열면 자체 데이터를 연동하기 전까지는 재구성 결과가 공개 샘플 데이터임을 이해할 수 있다.
## 프로젝트 구조```
run_nv.py reconstruction engine entrypoint (scope-gated)
nv_extract_identity_events.py ingest: M365/Entra unified audit log -> event model
nv_extract_cloudtrail_events.py ingest: AWS CloudTrail -> event model [iteration 3]
update_feeds.py pull + validate threat-intel feeds on a cadence [iteration 1]
calibrate.py fit confidence weights from labeled ground truth [iteration 2]
nv/ the engine package
graph.py patterns.py validation.py confidence.py reconstruct.py scope.py
providers.py per-substrate op->ATT&CK vocabulary packs (Entra + AWS) [iteration 3]
feeds.py ATT&CK STIX / TAXII 2.1 / Sigma clients + scheduler [iteration 1]
calibration.py metrics + parameter fit [iteration 2]
eval/ evals + offline fixtures (no network, no tenant)
nv_gui.html pure view layer (loads engine reconstruction.json)
calibration.proxy.json bundled proxy calibration artifact [iteration 2]
모든 것을 프로젝트 루트에서 실행하여 nv 패키지를 임포트할 수 있게 하세요.
실행하기```bash
1. normalize raw O365/Entra audit logs into the event model
python3 nv_extract_identity_events.py auditrecords.csv nv_identity_events.jsonl
2. reconstruct (scope-gated; add --calibration calibration.json to use fitted weights)
python3 run_nv.py nv_identity_events.jsonl reconstruction.json
--trust-floor 0.6 --authorize your-tenant.onmicrosoft.com
3. view — open nv_gui.html (renders reconstruction.json)
패턴 라이브러리를 최신 상태로 유지하고 신뢰도를 미세 조정하세요:```bash
python3 update_feeds.py # pull + validate feeds that are due
python3 calibrate.py --labeled run.jsonl --origin live --out calibration.json
평가```bash
python3 eval/run_eval.py # attack shapes reconstruct correctly python3 eval/validation_cases.py # poisoned patterns are rejected python3 eval/feeds_offline_test.py # feed connectors + scheduler (offline) python3 eval/providers_aws_test.py # AWS chain reconstructs through the same engine python3 calibrate.py # calibration harness on the bundled proxy corpus
---
## 상태
**실제 데이터에서 엔드투엔드(end-to-end)로 작동 중** (invictus-ir O365 데이터셋), 전체 계획에 걸쳐:
| 단계 | 항목 | 상태 |
|---|---|---|
| 1 | 정규화된 이벤트/엔티티 모델 | 완료 |
| 1 | 수집 + 정규화 (Entra/M365 교두보) | 완료 |
| 2 | 알려진 계층 (ATT&CK 패턴 라이브러리) | 완료 |
| 2 | 증거 확증 신뢰 모델 | 완료 |
| 2 | 출력 계약의 신뢰 하한 | 완료 |
| 2 | 가추적(abductive) 코어 (미지 계층) | 완료, 평가로 입증됨 |
| 2 | 순위가 매겨진 경쟁 가설 | 완료 |
| 3 | 패턴 소스 검증 계층 | 완료 |
| 3 | 승인 범위 제어 | 완료 |
| 3 | 실시간 피드 커넥터 (ATT&CK STIX / TAXII / Sigma) + 스케줄러 | 완료 |
| 4 | 실제 엔진 출력의 2열 화면 | 완료 |
| 4 | 임베딩 / 유사성 캔버스 | 완료 |
| 4 | 캔버스 기반 엔티티별 재구성 (클릭 시 체인 재실행) | 완료 |
| 4 | GUI가 엔진 `reconstruction.json`을 로드 (자신의 파일을 지정) | 완료 |
| 4 | 다중 공급자 기반 (AWS CloudTrail, 평가로 입증됨) | 완료 |
| 5 | 미관 / 테마 | 완료 |
| 5 | 신뢰도 보정 하네스 + 엔진 통합 | 완료 |
### 솔직히 밝히는 알려진 한계 (다음 반복)
- **실제 테넌트 보정 수치.** 보정 *하네스*는 완전하며
인터페이스도 검증되었지만, 제공되는 `calibration.proxy.json`은 문서화된 형태의
프록시 데이터에 맞추어 조정된 것입니다. 배포 가능한 가중치를 얻으려면 실제
BadZure / MAAD-AF 실행에 하네스를 실행해야 합니다 — 이는 도입자가 수행해야 할 운영 단계입니다.
- **피드 기반 어휘 확장.** 커넥터는 NV가 이미 추론하는 작업(operations)들을 갱신할 뿐입니다.
피드가 새 작업을 *도입*하고 이를 초기/피벗/수집 분류에 연결하도록 하는 것은
향후 과제입니다.
- **두 번째 공급자의 지원 깊이.** AWS는 기반(substrate) 독립성의 증명(팩 + 수집 + 평가)으로 포함되어 있지만
IAM/STS/S3만 지원합니다. AWS 팩을 확장하고, 공급자별 피드 커넥터를 추가하며,
세 번째 기반(GCP, Okta)을 도입하는 것이 다음 단계입니다.
---
## 라이선스
Nimbus Vestige는 **source-available**(소스 공개) 방식으로 **PolyForm 비상업적 라이선스
1.0.0** 하에 제공됩니다 ([LICENSE](https://gitlab.com/dobybaxter127/nimbus-vestige/-/blob/main/LICENSE) 참조). 전체 도구 — 재구성 엔진, 두
공급자의 수집(ingest) 모듈, GUI, 평가 하네스 —는 **비상업적** 목적, 즉
개인 프로젝트, 연구, 교육, 비영리 단체, 평가에 한해
자유롭게 열람, 실행, 사용할 수 있습니다. 결정하기 전에 모든 줄을 읽어보십시오.
**상업적 사용에는 유료 라이선스가 필요합니다** — 판매하거나 호스팅하는 제품 또는 서비스,
영리 기업의 프로덕션 또는 내부 시스템, 유료 침해 대응(incident-response) 또는
고객 용역 계약에서 사용하는 경우를 포함합니다. 자세한 내용은
[COMMERCIAL-LICENSE.md](https://gitlab.com/dobybaxter127/nimbus-vestige/-/blob/main/COMMERCIAL-LICENSE.md)를 참조하십시오.
---
### 저자
Doby Baxter 2026