
クラウドおよびアイデンティティインシデントレスポンスのためのフォレンジック再構築エンジン。
クラウドおよびアイデンティティインシデントレスポンスのためのフォレンジック再構築エンジン。
断片化されたクラウド、SaaS、アイデンティティのテレメトリ(コントロールプレーンログ、サインインイベント、トークンと同意アクティビティ)が与えられたとき、NVは侵入がアカウントとサービスを横断してどのように移動した可能性が最も高いかを再構築し、取り得た他の最も可能性の高い経路を列挙し、すべてのステップを校正された説明可能な信頼度で報告します。証拠が裏付けられないことを断言することは拒否します。
検知は何かが起こったことを教えます。Nimbus Vestigeはどのように — そして他に何が起こり得たかを教えます。
現代の侵入は「押し入る」のではありません。ログインするのです。アイデンティティは今や主要な攻撃手段であり、クラウドIR調査の大半に関与しており、ほとんどの侵入は複数のサーフェス(アイデンティティ+クラウド+SaaS+エンドポイント)にまたがっています。それらを記録するテレメトリは断片化され一貫性がないため、対応者はすでに不完全なデータから手作業でストーリーを再構築せざるを得ません。
その手動による再構築は遅く、予測可能な形で失敗します。対応者は最初に思いついたもっともらしいナラティブに固執し、本当の経路を見逃すのです。NVは再構築を自動化し、単一のストーリーではなく、可能性のある経路のランク付けされた空間を常に提示することで、その失敗モードに直接対処します。
重要なのは、NVは誠実さを製品としてこれを実現していることです。市場が公言する敵はブラックボックスの信頼度 — 根拠を示さずに結論を断言するツール — です。NVが生成するすべての数字は、それを獲得した特定の証拠に遡ることができ、裏付けられないものは推測ではなく差し控えられます。
NVは検出器、スキャナー、監査人、または攻撃実行ツールではありません。それらのツールは何かが起こったことを教え、それを測定します。NVは逆向きに機能します。断片化されたアイデンティティ環境全体にわたって、パターンからメカニズムをアブダクティブに再構築します。
ブルーチームは再生し、レッドチームはコモディティ化する。 攻撃用ツールは有限でパッチ可能な一連の穴を見つけるものであり、自動化された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 は**純粋なビュー層**です — エンジンの出力をレンダリングし、アナリストが信頼下限を移動できるようにします。
それ自体には再構築ロジックは含まれません。
---
## 信頼度モデル(製品全体の信頼性)
すべてのステップは [0, 1] の信頼度を持ち、**証拠の裏付け**によって構築されます:```
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)
パスのスコアはリンクを幾何平均で合成するため、1つの弱いリンクがあれば、平均化によって埋もれてしまうのではなく、正直にパス全体を引き下げる。
上記のすべての重み(手法ごとのベースレート、シグナルごとのボーナス、欠落ペナルティ)は、nv/confidence.py 内の単一の PARAMS テーブルに格納されている。これらは NV の v1 事前分布であり、較正可能 である。nv/calibration.py は、ラベル付きグラウンドトゥルースに基づいて再適合させることができ、エンジンはその結果を読み込む。較正が提供されない場合は v1 事前分布にフォールバックする(下記参照)。
保留ルールは、UI だけでなくエンジンの出力契約に組み込まれている。フロア未満のステップは保留される。フロアを動かすことは、正直さとカバレッジのトレードオフを具現化したものである。上に動かせば厳格(高信頼)、下に動かせば寛容(高カバレッジ)になる。デフォルトのフロアは、アナリストが触れる前の NV の立ち位置に関する編集上の判断である。
v1 の重みは妥当ではあるが、事前分布にすぎない。nv/calibration.py は、ラベル付きグラウンドトゥルース(どれが侵入の一部で、どれが良性だったかが分かっているイベント)に基づいてこれらを調整し、さらに重要なことに、調整が実際に効果があったかどうかを測定する。つまり、数値を動かすだけではなく、較正誤差を実際に低減した場合にのみ較正が採用される。
較正された信頼度が意味することは1つだけだ。あるステップに対する NV の信頼度は、そのステップが実際に攻撃経路上にあった確率と等しくなるべきである。そこで、各ラベル付きイベントの信頼度は予測確率として扱われ、ハーネスは以下を適合させる。
verified/withheld のしきい値はポリシーであり、較正ではないため、変更されない。
較正の前後で、ブライアスコア、対数損失、ECE、AUC、信頼性テーブル、信頼フロアスイープ(各フロアにおける真ステップの再現率と良性イベントの誤検出率)を報告する。これにより、正直さとカバレッジのトレードオフは、単一の数値ではなく判読可能な形で示される。```bash
python3 calibrate.py --labeled run_labeled.jsonl --origin live
--run-label "badzure-2026-07 tenant-x" --out calibration.json
python3 calibrate.py --out calibration.json
python3 run_nv.py events.jsonl out.json --authorize t.onmicrosoft.com
--calibration calibration.json
**グラウンドトゥルースソース。** 真の入力は、実際のテナントでの BadZure / MAAD-AF 実行からのテレメトリであり、統合監査ログを攻撃ツール自身のアクティビティ記録と突き合わせることでラベル付けされています(ツールが引き起こしたすべてのイベントは証跡チェーン上にあり、それ以外はすべて良性です — `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 の事前分布は良性アクティビティに対して非常に過信していました)。プロキシは意図的に保守的です。実際にデプロイすべき重みを生成するのは、ライブテナントでの実行です。
## 信頼の整合性(フェーズ 3)
再構成を不正な入力から保護する 2 つの第一級の制御があります:
- **認可スコープゲート**(`nv/scope.py`)— NV は、認可リストにない環境では実行を拒否します。調査を許可された環境ごとに `--authorize <tenant-domain>` を付けて実行します。
- **パターンソース検証**(`nv/validation.py`)— 以下のすべてを通過しない限り、いかなるパターンもライブラリに入りません:(1) 信頼できるソースの許可リスト、(2) コンテンツチェックサム / 改ざんチェック、(3) スキーマの整形式性、(4) 有効な ATT&CK スタイルのテクニック ID。承認されたすべてのパターンは監査記録を保持し、拒否されたものは理由とともにログに記録されます。毒化された、または不正な形式のフィードは、偽の再構成を生成する前に上流で停止されます。これは、エンジンが証拠に適用するのと同じ懐疑主義を、パターン自体に移したものです。
---
## 知識を最新に保つ(攻撃者の進化に先んじる)
再構成エンジンの最新度は、パターンライブラリの最新度と、ライブラリがこれまで見たことのないものを処理する能力に依存します。NV は、設計上、**2 つの独立した側面**で陳腐化に対処します:
### 1. 既知のレイヤーは、検証された更新パイプラインを通じて最新を維持
ライブラリはハードコードされていません — `nv/patterns.py` は、組み込みセットを含むすべてのパターンを `nv/validation.py` を通じて読み込むため、外部フィードも同じ信頼された経路で入ります。これらのフィードをスケジュールで取得するライブネットワーククライアントは、`nv/feeds.py` に実装され、`update_feeds.py` によって駆動されます。ソースは信頼ティアごとに次のとおりです:
- **MITRE ATT&CK(STIX)** — 権威あるテクニック分類法です。コネクタは ATT&CK STIX インデックスを読み取り、最新の Enterprise リリースを取得し、NV が推論するすべての操作について、権威あるテクニック名と戦術を更新します — その後 ATT&CK が失効または非推奨にしたテクニックはすべて破棄します。NV は操作→テクニックの関連付けとベースレートの事前分布の所有権を保持し、ATT&CK は分類法を所有します。
- **TAXII 2.1 経由の精査済み CTI** — 完全な discovery → api-root → collection → objects クライアントです。精査済みの CTI コレクションから STIX attack-pattern オブジェクトを取得し、NV が追跡するテクニックを更新します。ATT&CK よりも低い重み付けです。
- **Sigma コミュニティルールセット** — git アーカイブとして取得されます。O365/Entra の操作を指定し、`attack.tXXXX` タグを持つ各クラウド/ID ルールは、操作→テクニックの候補となり、ルール自身の重大度 `level` から導出されたベースレートを持ち、その後コミュニティソースの重みでスケールダウンされます。マップされないルールは理由付きでスキップされ、推測されることはありません。
操作が衝突した場合、コミット前にその和集合が信頼度の昇順で並べられるため、権威ある ATT&CK の関連付けが常にコミュニティのものに優先します。下位ティアのコンテンツも依然として受け入れられ、裏付けとして監査に記録されます。`update_library(candidates)` は、検証を通じてセット全体を再取り込みし、ライブラリを原子的に再構築するため、毒化されたフィードがライブラリを中途半端に更新したままにすることは決してありません。
**許可リストは 1 つではなく 2 つ。** 検証はすでにソースタグでゲートしています。コネクタはネットワーク層の *ホスト* 許可リストを追加するため、コネクタは TLS 経由で信頼されたホストからのみ取得できます — これはソース許可リストのトランスポート層における同等物であり、乗っ取られた、または入力ミスのあるフィード URL に対するガードです。すべてのフェッチは、生ペイロードの sha256、URL、時刻を来歴として記録するため、後で再取得したときに上流の改変を検出できます。
**フィードが増えるほど検証レイヤーが重要になる理由:** 更新を自動化すればするほど、自動更新パイプラインは偽装された信頼リスクになります — 誤った、または毒化されたフィードは偽のパターンを注入し、偽の再構成を作り出します。NV は取り込みを敵対的とみなします:すべてのパターン、すべての更新に対して、許可リスト、チェックサム、スキーマ、監査証跡を適用します。
### 2. アブダクティブレイヤーは、まだどのフィードも命名していないものをカバー
フィードは常に最新の攻撃手口に遅れを取ります。アブダクティブコアがそのヘッジです:観測された操作がライブラリのパターンに **一致しない** 場合、NV はそれを破棄せず、第一原理から最も可能性の高い経路を再構成し、信頼度を下げて `no known match` とフラグを付けます。これは評価スイート(`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 unified audit log コーパス — に基づいて構築されており、いかなる企業のライブ
テナントのものではありません。 これは、誰の協力も得ずにエンジンをデモおよびドッグフーディングできるようにするために存在します。NV を実際に使用するには、組織が以下で説明するように、自社の Entra/M365
監査データを配線します。このプロジェクトには、専有データや顧客データは一切含まれていません。
NV は実行する場所ならどこでも動作します。ログが環境外に出る必要は決してありません。4つのステップ:
1 — 監査ログをエクスポートします。 NV は Microsoft 365 unified audit log を読み取ります。これを
Microsoft Purview(監査検索 → CSV エクスポート)、Search-UnifiedAuditLog
Exchange Online PowerShell コマンドレット、Microsoft Graph の auditLogs / signIns
エンドポイント、または OfficeActivity と SigninLogs の Sentinel/SIEM エクスポートから取得します。
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 をクリックして、それを
エンジンが生成したばかりのファイルに指定します — 同じ画面に、インシデント、
エンティティ、信頼区間が表示されます。埋め込みキャンバス上の各ドットは、クリックすると
そのエンティティの再構築を再実行します。
エンジンは基盤に依存しません — プロバイダ固有なのは操作語彙だけです
(nv/providers.py)。AWSパスもCloudTrailに対する同じ3つのステップです:```bash
python3 nv_extract_cloudtrail_events.py cloudtrail.json aws_events.jsonl
python3 run_nv.py aws_events.jsonl reconstruction.json --authorize aws:123456789012
取り込みは IAM/STS/サインインイベント(新しい IAM オペレーションも含まれるため、それらは
アブダクション層に到達する)と S3 オブジェクト読み取りを保持し、テナントドメインではなく
AWS **アカウント** でスコープを制限します。同じアブダクションコア、信頼度モデル、トラストフロアがそのまま適用されます。
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 パッケージがインポート可能になるようにしてください。
python3 nv_extract_identity_events.py auditrecords.csv nv_identity_events.jsonl
python3 run_nv.py nv_identity_events.jsonl reconstruction.json
--trust-floor 0.6 --authorize your-tenant.onmicrosoft.com
パターンライブラリを最新の状態に保ち、信頼度を調整してください:```bash
python3 update_feeds.py # pull + validate feeds that are due
python3 calibrate.py --labeled run.jsonl --origin live --out calibration.json
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
---
## ステータス
**実データ(invictus-ir O365 データセット)でエンドツーエンド動作確認済み**。全プランにわたる状況:
| フェーズ | 項目 | ステータス |
|---|---|---|
| 1 | 正規化されたイベント/エンティティモデル | 完了 |
| 1 | 取り込み + 正規化(Entra/M365 ビーチヘッド) | 完了 |
| 2 | 既知レイヤー(ATT&CK パターンライブラリ) | 完了 |
| 2 | エビデンス裏付けによる信頼度モデル | 完了 |
| 2 | 出力契約における信頼フロア | 完了 |
| 2 | アブダクション核(未知レイヤー) | 完了、評価で実証済み |
| 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 が推論している内容を更新しますが、
フィードが *新しい* オペレーションを導入し(それを初期/ピボット/収集の分類に配線する)ことは
将来の作業です。
- **2番目のプロバイダの深さ。** AWS は基盤非依存性の証明(パック + 取り込み + 評価)として
組み込まれていますが、IAM/STS/S3 のみです。AWS パックの拡張、プロバイダ固有のフィードコネクタの追加、
そして3番目の基盤(GCP、Okta)の追加が次のステップです。
---
## ライセンス
Nimbus Vestige は **PolyForm Noncommercial License 1.0.0** のもとで **ソース公開** されています([LICENSE](https://gitlab.com/dobybaxter127/nimbus-vestige/-/blob/main/LICENSE) を参照)。ツール全体 — 再構築エンジン、2つのプロバイダ取り込み、GUI、評価ハーネス — は、個人プロジェクト、研究、教育、非営利活動、評価など、**非商用**目的であれば自由に閲覧、実行、使用できます。判断する前にすべての行を読んでください。
**商用利用には有料ライセンスが必要です** — 販売またはホスティングする製品やサービス内での利用、営利企業の本番環境または内部システムでの利用、有償のインシデントレスポンスやクライアント業務での利用が該当します。[COMMERCIAL-LICENSE.md](https://gitlab.com/dobybaxter127/nimbus-vestige/-/blob/main/COMMERCIAL-LICENSE.md) を参照してください。
---
### 著者
Doby Baxter 2026