パスワードリセットが成功しても、攻撃者が去らないとき。
単一の脆弱性クラスに焦点を当てたローカルのレッド/ブルーラボ:本来それを無効化するはずの イベントよりも長く生き残る資格情報。 これにはエクスプロイト、根本原因、修正、3ルールの検出パック、ルールが構造的に見ることのできない ものを対象とした状態監査、フォレンジックコンソール — そして機能しない検出ルールが含まれ、 失敗を実演するためにリポジトリに保持されている。
クイックスタート · 発見事項 · なぜ素朴な検出は失敗するのか · ルールパック · コンソール · 修正 · マトリクス · テスト · ドキュメント
同じ攻撃。同じリクエスト。違いは1つだけ。
コンソールが描画するのと同じペイロードから scripts/figures.py によって生成され — CIで再生成および差分比較されるため、図がコードから乖離することはない。
09:00 alice logs in ┐ refresh credential rt-001 │ the attacker steals rt-001 ┘
10:00 alice changes her password ← the one thing a victim can do alone HTTP 200 · password changed · fresh session issued
10:00:03 attacker: POST /refresh rt-002 → HTTP 200 new access credential at-004, issued 10:00:03
10:01:00 attacker: GET /me at-004 → HTTP 200 {"username": "alice", "authenticated": true}
エラーなし。異常なし。数えるべき認証失敗もなし。攻撃者のアクセス資格情報は*3秒前*に生成されたもので、リセット後にサーバーが要求に応じて発行したものだ。
これが脆弱性のすべてである:```python
def _revoke_for_security_change(self, user, kind, device_id):
if device_id:
revoke_credentials(user, device_id=device_id) # ← the finding
レビュアーの視点でこれを読んでほしい。失効ロジックはまさにそこにある。正しいスコープで正しい関数を呼び出している。その周囲のエンドポイントはパスワードハッシュを更新し、200 を返し、新しいセッションを発行する — 正しいパスワード変更の観察可能な挙動はすべて揃っている。
そして呼び出し元が device_id を省略した場合、何も失効されず、エンドポイントは依然として成功を報告する。
これは仮定の話ではない。Strapi ≤ 5.33.2 における
CVE-2026-22706
であり、リフレッシュトークンの無効化ステップが呼び出し元が指定する deviceId に条件付けられていた。スコアは 2.1、Low。詳細は
後述。
スコアが低いのは、攻撃者がすでにアクセス権を持っていたからだ — それが侵入条件であり、このバグが新たに与えるものは何もない。このバグが与えるのは持続時間であり、それは被害者自身が操作できる唯一の制御を破壊することによってなされる。
test_persistence_lasts_as_long_as_the_refresh_credential は7日間のシミュレートされた時間を辿ってそれを示す。封じ込めパスにおける Low スコアのバグは、機能パスにおける Low スコアのバグよりもコストが高い。なぜならそのコストはインシデントの最中に支払われ、そのとき誰もアドバイザリを読んでいないからだ。
最初に書くルール:```text IF credential.issued_at < credential_change.timestamp: ALERT
これは愚かなルールではない。安価で、フィールドが1つで済み、問題の定義のように読め、そして**単純なケースについては正しい**——リセット後に盗まれた*アクセス*トークンを使う攻撃者は捕まる。
`test_the_naive_rule_catches_the_simple_case` はそれが機能することを主張している。
どちらのルールも、同じクレデンシャルについて同じ問いを立てている。答えを出すために異なるフィールドを読み、その2つのフィールドは食い違う:

**3秒後、それとも1時間前——同じクレデンシャル、同じ瞬間。** 素朴なルールは攻撃者が制御するフィールドを尋ねており、1回の `POST /refresh` でそれがリセットされる。
これをリクエストログに対して実行しよう。実際にこのクエリが書かれるのはそこであり、手元にあるのはリクエストログだからだ:```text
NAIVE DETECTOR (NAIVE-001), over the request log
Result: NO ALERT
Six requests were served to the attacker after the reset. Every one of them
carried at-004, minted at 10:00:03 -- three seconds *after* the password
change. By its own timestamp it is the newest credential on the account.
そこで止めるのは簡単だが、不誠実でもある。だからこのラボでは、素朴なルールの最も公平なバージョンも実行する — リフレッシュエンドポイントも監視するように拡張したものである:```text NAIVE DETECTOR, widened to include POST /refresh
1 alert at 2026-09-11T10:00:03.000Z: the credential presented to /refresh was rt-002, issued 2026-09-11T09:30:00.000Z. Then it goes blind. 6 events follow that hop and it flags none of them, because every credential from there on carries a post-reset timestamp. Its incident covers 1 accepted request; the lineage rule's covers all of them.
And look at what the alert names: NAIVE-001 revoke rt-002 -- rotated away and already dead at 10:00:03 AFTERLIFE-001 revoke lin-001 -- the live thing every future credential descends from
3amに本当に重要なのはその違いだ。素朴なルールはチェーンが境界を越える
瞬間を一度だけ捉え、残り29日間は痕跡を見失う——そしてそれが名指しする
クレデンシャルは*すでにローテーションされ、サーバーによって失効させられている*。
それを失効させても何の意味もない。殺すべき対象は`lin-001`だ。
**そして素朴なルールはテレメトリに飢えていたわけではない。** 同じイベント
ストリーム、同じリネージインデックス、同じトレランス、同じ重複排除、
同じ有界状態を使用している。ただ1つのメソッドをオーバーライドするだけだ:```python
class Correlator: # AFTERLIFE-001
def _age_reference(self, facts):
return facts.root_issued_at
class NaiveCorrelator(Correlator): # NAIVE-001
def _age_reference(self, facts):
return facts.issued_at
root_issued_at は、すでに参照しているインデックス内に存在している。
test_the_naive_rule_had_the_data_it_needed がそれを証明している。失敗は
比較にあり、ログ記録にあるのではない。
1つのログに対する3つのルール。それぞれ異なる問いに答え、インシデントが実際に展開する順序で発火する。
10:00:00 HIGH AFTERLIFE-003 Incomplete revocation at a security change 10:00:03 HIGH AFTERLIFE-001 Post-revocation credential lineage use
**その順序付けがこのリポジトリで最も有用なものである。** AFTERLIFE-003
は変更が着地した瞬間、攻撃者が何かに触れる3秒前に発火する。なぜなら、それが
必要とする証拠はすでに完全だからである。ログはどの系統が稼働状態で入ったかを
示しており、それらが失効されたとは示していない。
被害者も悪用も必要としない。ユーザーが最初に実行するパスワードリセットで
欠陥を報告する——つまり、待つべき攻撃者がいないステージング環境で実行する
べきものである。AFTERLIFE-001は侵害が進行中であることを伝え、
AFTERLIFE-003は封じ込め制御が壊れていることを伝える。

`application recorded watermark: no` は、インシデント対応者を症状ではなく
*欠陥*へと導くフィールドである。
### ルールが使用するウォーターマークは、アプリケーションが報告するものではない
資格情報変更イベントは `revocation_watermark` フィールド——アプリケーションが
書き込んだ `credentials_valid_after` 値——を運ぶ。**脆弱な実装ではこれが
`null` である。なぜならアプリケーションは一度も書き込まなかったからである。**
それがバグである。
したがって、そのフィールドに基づくルールは、まさにそれが捕まえるために存在
するケースに対して盲目となる。ルールはイベント自身の `timestamp` に
アンカーしており、これはアプリケーションがその役割を果たしたかどうかに
かかわらず真であり、欠落したフィールドを証拠として報告する。
### プロパティ```text
deduplication 6 accepted requests on the stale lineage -> 1 alert
event order shuffled stream -> same alert (1 alert)
duplicate telemetry log replayed twice -> 1 alert (24 duplicate events discarded)
false positives the fixed implementation's log -> 0 alerts
bounded state caps at 256 activity/user, 2000 users, 20000 credentials
順序独立性は「だいたい動く」では済まされない:
test_6b_every_permutation_of_the_critical_events_detects は重要な4つのイベントの
全24通りの順序を実行し、それぞれからちょうど1件のアラートを要求する。
重複排除は (user_id, credential_change_event_id, lineage_id) をキーとし、
その手前に event_id の抑制を置くことで、再生されたファイルがカウントを
水増しできないようにしている。
完全なルールカード、必要なテレメトリ、対応ランブック: docs/detection.md。
このラボが扱うただ一つの問いのための閲覧面。アラート件数のダッシュボードではなく ——死亡登録簿である。資格情報ごとに1本のバーを、発行から死まで、 それが由来する系統へとグループ化し、パスワード変更を、それ以前のすべてが そこで終わるはずだった線として描く。
意図的な反転が一つ: 暖かさは生きていることを意味し、線を越えた後の暖かさは
誤りである。 ほとんどのセキュリティUIでは赤はエラーが発生したことを意味する。
ここでは何もエラーにならない——脆弱な実行におけるすべてのリクエストは 200 を返す。
そこで色は代わりに死亡率に従う: 冷たさは命じられて死んだ資格情報、暖かさは
まだ息をしているもの、そしてギロチンを越えた先でなお暖かいことが、この発見の
すべてである。(BLACKOUT も同じ取り決めを採用しており、そこでは 200 が赤い方だった。)
細い縦のドロップは系譜である: その瞬間に親から鋳造された子資格情報。
rt-001 → rt-002 → rt-004 はウィンドウ全体を右へ下へとステップし、脆弱モードでは
切断の後もステップし続ける——これは、自らの絶滅イベントの向こう側で
新しい資格情報を鋳造し続ける系統の姿である。```bash
python scripts/lab.py console
**[`docs/console-preview.html`](https://github.com/het-p301204/afterlife/blob/main/docs/console-preview.html)** を書き出します — 両方の実行結果を埋め込んだ、自己完結型の 74 KiB ファイルです。サーバーもネットワークも、取得するフォントも不要で、ファイルシステムから開くだけです。またはライブ版を実行してください:```bash
python -m console
スクラバーを 10:00:00 より前へドラッグで戻し、そこを越えて前へ進めると、ログがそれを正当化した時点で検出事項が現れる。変更点で AFTERLIFE-003、3秒後に AFTERLIFE-001 である。何が削られたかを含む設計上の理由は
docs/console-design.md にある。
コンソールは構造上読み取り専用である。完了したシナリオを再実行して描画するだけで、実装を切り替えたり、時計を進めたり、何かを取り消したりすることはできない。
test_the_console_has_no_control_surfaceは、唯一の非GETルートが/api/rebuildであることを検証する。読み取っている対象を変更できる読み取り面は、信頼できないものである。
6つのパッケージ、1つのセキュリティクラス、インフラストラクチャなし。```text
app/ the lab application
config.py mode selection; defaults to fixed, deliberately
store.py SQLite credential state + the security-change audit trail
tokens.py minting and decoding; a JWT is a signed pointer to a row
auth.py login / refresh / change-password + THE BUG + the audit
main.py six endpoints
common/ clock.py a rewindable UTC clock, so an hour of history costs nothing events.py the event vocabulary, shared by app and detector telemetry.py JSONL emission with credential-name redaction
detector/ strictly downstream: reads a log file, decides nothing base.py the alert shape, replay suppression, bounded state lineage.py rebuilds a credential's ancestry from issuance events ledger.py which lineages are alive, per user rules.py AFTERLIFE-001 persistence reuse.py AFTERLIFE-002 theft containment.py AFTERLIFE-003 the defect itself naive.py NAIVE-001, kept in order to be demonstrated failing audit.py the state scan the rules structurally cannot do engine.py the pack: one shared index, one stream, ranked alerts tail.py byte-offset JSONL tailer
console/ the mortality register payload.py one run, shaped for drawing static/ ~1400 lines of vanilla HTML/CSS/JS, no build step
scripts/ lab.py the demonstration scenarios.py nine scenarios x both implementations report.py the incident report preview.py bake the offline console figures.py render the console to SVG for this README
tests/ 290 tests
アプリケーションはデモ、コンソール、テストの下で**インプロセス**で動作する。ポートも、開発サーバーも、Dockerもない。クロックは固定されているため、すべての実行は決定論的であり、コミットされたテレメトリ、コンソール、図、レポートはすべて実行間でバイト単位で同一である — これをCIが `git diff --exit-code` でチェックする。
### サーバー側の強制
クレデンシャルは**行**であり、文字列ではない。クライアントが保持するJWTは `cid` — ルックアップキー — を運び、その行がクレデンシャルが有効かどうかを決定する。
有効期限は、保持者が提示した `exp` クレームではなく、その行の `expires_at` に対してチェックされる。両方の時間的クレームは `verify=False` でPyJWTに渡される。これはここでは*「サーバーがこれを自身でチェックする」*ことを意味し、[`app/auth.py`](https://github.com/het-p301204/afterlife/blob/main/app/auth.py) がすべてのリクエストでそうしている。クライアントは、自身のクレデンシャルがまだ有効かどうかについて投票権を持たない。
---
## 攻撃タイムライン```mermaid
flowchart TD
A["Account compromised<br/><i>phishing · XSS · stolen backup</i>"] --> B["Attacker holds refresh credential rt-001<br/>lineage lin-001, root sess-001 @ 09:00"]
B --> C["Legitimate password change @ 10:00<br/>HTTP 200 · password hash updated"]
C --> D{"device_id supplied?"}
D -->|"yes"| E["revoke_credentials(user, device_id)<br/>rt-001 revoked"]
D -->|"no — the exploit"| F["nothing revoked<br/>no watermark written"]
E --> G["Attacker refresh → 401<br/><b>contained</b>"]
F --> AF3["<b>AFTERLIFE-003 · HIGH</b> @ 10:00:00<br/>containment did not run<br/><i>no attacker action required</i>"]
F --> H["POST /refresh rt-002 → 200<br/>mints at-004 @ 10:00:03"]
H --> I["GET /me at-004 → 200<br/>well-formed · correctly signed · <b>no anomaly</b>"]
I --> J["at-004.issued_at > watermark<br/>NAIVE-001: no alert"]
I --> K["lineage lin-001 root @ 09:00 < watermark<br/><b>AFTERLIFE-001 · HIGH</b>"]
F --> L["attacker holds and never spends<br/>AFTERLIFE-001 silent — correctly<br/><b>state audit: dormant survivor</b>"]
style F fill:#7f1d1d,color:#fff
style H fill:#7f1d1d,color:#fff
style I fill:#7f1d1d,color:#fff
style J fill:#78350f,color:#fff
style K fill:#14532d,color:#fff
style AF3 fill:#14532d,color:#fff
style L fill:#1e3a5f,color:#fff
style E fill:#14532d,color:#fff
style G fill:#14532d,color:#fff
中央のリフレッシュチェーン分岐こそが核心である。攻撃者は古い資格情報を使うのではない。古い系統を使い、その系統が必要に応じて新しいものを発行する。
セッションは系統のルートである。その下で発行されるすべてのものは、永遠にそのルートを継承する。```text sess-001 session lineage lin-001 root sess-001 issued 09:00:00 │ ├── rt-001 refresh parent sess-001 root_issued_at 09:00:00 │ └── at-001 access parent rt-001 root_issued_at 09:00:00 │ ├── rt-002 refresh parent rt-001 root_issued_at 09:00:00 ← 09:30 rotation │ └── at-002 access parent rt-002 root_issued_at 09:00:00 │ └── rt-004 refresh parent rt-002 root_issued_at 09:00:00 ← 10:00:03 rotation └── at-004 access parent rt-004 root_issued_at 09:00:00 issued_at 10:00:03
`at-004` は生まれてから3秒しか経っていない。その系譜は1時間前のものだ。どちらも事実であり、リクエストログに見えるのはそのうち片方だけである。
これを支える2つの不変条件があり、どちらもテストされている:
1. **認証だけが系譜を生み出す。** `Store.open_session` は `lineage_id` が生成される唯一の場所であり、セッション自身をその `root_credential_id` にする。
2. **発行はルートをコピーして引き継ぐ。** `TokenService.mint` は系譜フィールドを再計算せず親から読み取るため、資格情報がその由来となるログインより新しい系譜を獲得することはできない。
保持者が提示するトークンは、その系譜ルートを意図的に**持たない**。もし持っていれば、保持者はそれについて嘘をつくことができてしまう。
---
## 状態監査
AFTERLIFE-001 は、古い系譜が*使用された*ときに発火する。これは検知ルールのトリガーとしては正しいが、穴が残る:**誰も触れていない古い系譜は、それにとって不可視である。** 資格情報を盗み、リセットが失敗するのを確認し、その後待機する攻撃者は、相関させるべき活動を何も生み出さない。
そこでラボは、ルールにはできない問いも投げかける:*何が起きたか*ではなく、*何がまだ生きているか*である。```text
scenario: dormant-survivor (the attacker holds the credential and never spends it)
AFTERLIFE-001 silent — correct; nothing was accepted
AFTERLIFE-003 HIGH — the change revoked nothing
state audit 1 stale lineage, 1 dormant
detect コマンドは、ファイルシステムをスキャンして、インストールされている AI エージェント、MCP サーバー、および関連する設定を検出します。以下の場所をチェックします。
# 基本的な検出
mcp-scan detect
# 詳細出力付き
mcp-scan detect --verbose
# JSON 形式で出力
mcp-scan detect --json
検出結果には以下が表示されます。
$ mcp-scan detect
🔍 AI エージェントと MCP サーバーをスキャン中...
✅ Claude Desktop を検出
設定: ~/Library/Application Support/Claude/claude_desktop_config.json
MCP サーバー: 3
✅ Cursor を検出
設定: ~/.cursor/mcp.json
MCP サーバー: 2
✅ Windsurf を検出
設定: ~/.codeium/windsurf/mcp_config.json
MCP サーバー: 1
📊 検出サマリー:
- 検出されたエージェント: 3
- 検出された MCP サーバー: 6
- スキャンした設定ファイル: 3
| オプション | 説明 |
|---|---|
--verbose | 詳細な検出情報を表示 |
--json | 結果を JSON 形式で出力 |
--config <path> | カスタム設定パスを指定 |
エージェントが検出されない場合:
--config オプションでカスタム設定パスを指定します# カスタム設定パスを指定
mcp-scan detect --config /path/to/custom/config.json
# 特定のエージェントのみを検出
mcp-scan detect --agent claude
``````bash
python scripts/lab.py audit
Input content is missing. Please provide the Markdown text to translate.```text VULNERABLE server state 1 lineage(s) outlived the change (0 dormant) telemetry 1 lineage(s) -- the same question, asked of the log instead of the database lin-001 root 2026-09-11T09:00:00.000Z 7 credentials in use
FIXED server state clean telemetry clean
2つの情報源を意図的に用いている。**テレメトリ**監査はログが証明できるものを見て、**サーバー状態**監査はデータベースが信じているものを見る。*両者が食い違う場合、ログは認証情報の状態を忠実に記録したものではなく、その上に構築されたあらゆる検知は見かけよりも弱い* — そのためコマンドは両方を出力し、食い違う場合はその旨を告げる。
サーバー状態監査には `security_changes` テーブルが必要であり、これは**両モードが書き込む**。変更が発生したことを記録することは、それに対処することとは別の義務であり、脆弱な実装はそのうちちょうど一方しか満たしていないからである。
---
## シナリオマトリクス
両実装に対して9つのシナリオ。`python scripts/scenarios.py` は自身の2つの不変条件をアサートし、いずれかが破られた場合は非ゼロで終了する。
| scenario | mode | events | worst | rules fired | stale | dormant |
|---|---|---:|---|---|---:|---:|
| `legitimate-only` | vulnerable | 19 | LOW | `AFTERLIFE-003` | 0 | 0 |
| `legitimate-only` | fixed | 19 | – | none | 0 | 0 |
| `stolen-refresh` | vulnerable | 22 | HIGH | `AFTERLIFE-001`, `AFTERLIFE-003` | 1 | 0 |
| `stolen-refresh` | fixed | 23 | – | none | 0 | 0 |
| `stolen-refresh-with-device-id` | vulnerable | 19 | LOW | `AFTERLIFE-003` | 0 | 0 |
| `stolen-refresh-with-device-id` | fixed | 19 | – | none | 0 | 0 |
| `multi-device` | vulnerable | 29 | HIGH | `AFTERLIFE-001`, `AFTERLIFE-003` | **2** | 0 |
| `multi-device` | fixed | 29 | – | none | 0 | 0 |
| `refresh-reuse` | vulnerable | 11 | MEDIUM | `AFTERLIFE-002` | 0 | 0 |
| `refresh-reuse` | fixed | 15 | MEDIUM | `AFTERLIFE-002` | 0 | 0 |
| `dormant-survivor` | vulnerable | 15 | HIGH | `AFTERLIFE-003` | 1 | **1** |
| `dormant-survivor` | fixed | 19 | – | none | 0 | 0 |
| `mfa-change` | vulnerable | 18 | HIGH | `AFTERLIFE-001`, `AFTERLIFE-003` | 1 | 0 |
| `mfa-change` | fixed | 18 | – | none | 0 | 0 |
| `account-recovery` | vulnerable | 18 | HIGH | `AFTERLIFE-001`, `AFTERLIFE-003` | 1 | 0 |
| `account-recovery` | fixed | 18 | – | none | 0 | 0 |
| `expired-lineage` | vulnerable | 17 | LOW | `AFTERLIFE-003` | 0 | 0 |
| `expired-lineage` | fixed | 20 | – | none | 0 | 0 |
4つの行が議論を伴う:
* **`legitimate-only`** には攻撃者が一切存在しない。修正版は何も生成せず、脆弱な実装はLOWを生成する。これは誤検知ではない — `enumeration_only` である。つまり失効は*今回は*機能したが、それは列挙によるものであり、サーバーが忘れてしまった認証情報をカバーするウォーターマークが存在しない。**このパックは攻撃者が存在しない状態で両実装を区別する。**
* **`dormant-survivor`** は盲点であり、その答えを1行に示している:`AFTERLIFE-001` は沈黙、`AFTERLIFE-003` はHIGH、監査は `dormant: 1`。
* **`multi-device`** は、脆弱な実装の*機能している*ブランチがなお失敗する箇所である — 失効がラップトップにスコープされ、他の2台のデバイスは手つかずのままである。
* **`expired-lineage`** は誤検知の対照である。認証情報が自然に期限切れになった40日前のセッションは、生き残った永続化経路ではなく、そのようには報告されない。
そしてマトリクスの中心的な主張は、スクリプトと `test_the_fix_never_produces_a_control_failure_finding` によって検証されている:**修正版はいかなるシナリオにおいても制御失敗の検知結果を出さない。** `AFTERLIFE-002` は通される — これは制御失敗ではなく盗難を報告するものであり、正しい実装にもなお報告すべき盗難は存在する。
---
## 誤検知
パスワードリセットのたびにページングするルールは1週間以内にミュートされ、ミュートされたルールはルールがないよりも悪い — それは誰もが実行されていると信じているルールである。
| case | outcome | why |
|---|---|---|
| Password change, then the replacement session is used | no alert | the new lineage's root is at or after the watermark |
| Reset then immediate browsing (`/me`, `/profile`, `/settings`) | no alert | one fresh lineage, one fresh root |
| Phone, laptop and tablet, all correctly rotated | no alert | each login is its own lineage |
| A device that logged in *after* the change, browsing alongside the attacker | no alert | fresh root — and the stale lineage still alerts, alone |
| A stale credential that was **rejected** | no alert | `result: failure` is excluded; it is evidence for the defence |
| Clock skew up to 2s between components | no alert | the documented tolerance |
| A *failed* password change | no alert | not an anchor |
| Activity before the change | no alert | time-ordering check |
| A rotated credential (`reason: rotated`) | not counted as death | a credential spent, not a lineage killed |
| A 40-day-old session whose credentials expired | not a survivor | expiry tracked per lineage |
| A first password change on a brand-new account | no alert | nothing was live going in |
| **Refresh-token rotation from a stale lineage** | **ALERT** | fresh timestamp, stale ancestry — this is the finding |
すべての行には
[`tests/test_detector_afterlife001.py`](https://github.com/het-p301204/afterlife/blob/main/tests/test_detector_afterlife001.py) と
[`tests/test_detector_rulepack.py`](https://github.com/het-p301204/afterlife/blob/main/tests/test_detector_rulepack.py) に対応するテストがある。
**2秒の許容範囲について。** このラボのすべてのタイムスタンプは単一のプロセスと単一のクロックから来ているため、正直な許容範囲はゼロである。2秒は、NTP下での現実的な2ホスト構成のデプロイに必要な値であり、この攻撃が生み出すギャップより3桁小さい — リフレッシュ認証情報の目的そのものが長期間有効であることだからである。この許容範囲は、真に古いリネージが*無視される*ウィンドウであるため、意図的に小さく保たれている:
`test_12b_a_gap_beyond_the_tolerance_does_alert` は2.1秒でもなお発火することを固定している。
---
## 修正```python
# THE FIX. Two mechanisms, deliberately redundant.
self.store.set_watermark(user.user_id, moment) # the guarantee
revoked = self.store.revoke_credentials(user.user_id, ...) # defence in depth
device_id のどちらにも依存しません。これはコンテキストとして記録されるものであり、影響範囲の決定には関与しません。
ウォーターマークはアーキテクチャ上の保証です。 ユーザーごとに1つのタイムスタンプ credentials_valid_after を持ち、すべてのリクエストで、クレデンシャル自身の発行時刻およびそのリネージュルートの両方と照合されます:```python
watermark = user.credentials_valid_after
if credential.issued_at < watermark: reject # the obvious case
if credential.root_issued_at < watermark: reject # the refresh chain
2つ目の比較は、正しく実装するのにコストがかかるものであり、素朴な実装が省略してしまうものである — 検出においてとまったく同様に、強制においても。
**明示的な失効は多層防御であり**、証拠でもある。`revoked_at` と `revocation_reason` はインシデント対応者が読むものであり、`auth.token.revoked` イベントは封じ込めが実際に行われたことを証明するものである。
`test_the_watermark_alone_rejects_a_stale_credential` は、何も失効させずにウォーターマークを*設定*し、古い資格情報が拒否されることを要求する — これにより、2つのうちどちらが本質的な役割を担っているか、そしてサーバーが発行したことを忘れてしまった資格情報に対してもなお成立する特性がどちらであるかが明らかになる。
### 同じ攻撃を、修正に対して行う

変更されたリクエストは1つもない。変更された関数が1つある。
### パスワードだけではない
トリガーは*「パスワードが変更された」*ではない。*「以前に発行された資格情報を信頼できなくする何かが変更された」*である。4つのルートはすべて `_revoke_for_security_change` を共有しているため、修正とバグは以下に対して同一に適用される:
| 変更 | 資格情報が信頼できなくなる理由 |
|---|---|
| パスワード変更 / リセット | セッションが確立された際のシークレットが失われた |
| MFA登録または変更 | セッションが確立された際の要素がアカウントの要素ではない |
| ロール変更 / 権限昇格 | 資格情報が異なる認可の下で発行された |
| アカウント復旧 | 構造上、アカウントは先ほど誰かの手に渡っていた可能性がある |
| ログイン | 他を*失効させない* — 新しい系統であり、古いものが信頼できないという表明ではない |
すべての種類について、両モードでテストされている、[`tests/test_privilege_changes.py`](https://github.com/het-p301204/afterlife/blob/main/tests/test_privilege_changes.py) において — ログインが要件でないことも含めて、次の読者がそれを「修正」しないように文書化されている。
---
## アーキテクチャ上のトレードオフ
資格情報を機能しなくする方法は4つある。AFTERLIFEは **A + C** を実装しており、順序が重要である。
| | メカニズム | 得られるもの | コスト |
|---|---|---|---|
| **A** | ユーザーごとの失効ウォーターマーク | 1回の書き込みで、サーバーが発行を忘れた資格情報を含むすべてを失効させる; O(1)のストレージとチェック | 読み取りパス上のサーバー側状態; タイムスタンプのセマンティクスが正確でなければならない; ウォーターマーク*以降*に発行された資格情報については何も言わない |
| **B** | 短命なアクセス + 失効可能なリフレッシュ | 読み取りパス状態なしでアクセストークンの被害を制限する | 盗まれたアクセストークンは有効期限まで有効; リフレッシュ側には依然として状態が必要 — **これがCVEが潜むパターンである** |
| **C** | 明示的なデナイリスト | 正確; インシデント対応者にとって読みやすい; 封じ込めを証明するテレメトリを生成する | 状態が増大しクリーンアップが必要; 列挙することを覚えていたものだけを失効させる — これがバグが間違えたクエリである |
| **D** | 完全にステートレスなJWT | 読み取りパス状態がまったくない | **失効が存在しない。** TTLとキーローテーションが唯一の手段である |
Dについて: JWTは本質的に安全でないわけではない。緊張関係はより狭く、正確に述べる価値がある — **ステートレスな検証と即時のサーバー側失効は相互に排他的である。** 「この資格情報はもはや有効ではない」と判断するには、それを知っている何かに問い合わせる必要があり、問い合わせることがシステムをステートフルにする。間違いは、ステートレス性*のために*JWTを採用し、それでもなお失効が必要になることである。これはすべての製品がノートPCが盗まれた最初の時に経験する。最終的に得られるのは、サーバー側状態への署名されたポインタである — これは [`app/tokens.py`](https://github.com/het-p301204/afterlife/blob/main/app/tokens.py) が意図的に実装しているものである。なぜなら、意図的にそこに到達する方が、インシデントの最中にそこに到達するよりも安くつくからである。
### なぜ2.1 Lowについて議論するのが間違っているのか
CVE-2026-22706は **2.1, Low** とスコアされる(CVSS v4.0 `AV:N/AC:H/AT:N/PR:H/UI:N/VC:N/VI:L/VA:N/SC:N/SI:N/SA:N`)、そしてこのスコアは擁護可能である: `PR:H` は攻撃者がすでに有効なリフレッシュ資格情報を保持していなければならないため、`AC:H` はそれを入手するには事前の侵害が必要なため、そして `VC:N`/`VI:L` はこの欠陥が攻撃者がすでに持っていないアクセスを付与しないためである。CVSSは脆弱性の*限界的*影響を測定しており、限界的影響とはアクセスの**期間**であり、その範囲ではない。これらの入力が与えられれば、2.1は公式から正しく導出される。
CVSSがモデル化していないのは、失敗している制御が*封じ込めアクション*であるということであり — したがって有用な結論は、数値についてではなくトリアージのルーティングについてである。封じ込めパスにおけるLowは、機能パスにおけるLowがそうでないのに対し、注意に値する。なぜならコストはインシデントの最中に支払われるからである。完全な議論: **[docs/tradeoffs.md](https://github.com/het-p301204/afterlife/blob/main/docs/tradeoffs.md#on-the-cvss-score)**。
---
## テスト```text
290 passed
スイート内で最強のテストは
test_no_bearer_string_or_password_ever_reaches_the_log である。これは攻撃全体を実行し、その後ログファイルを検索して、アプリケーションが発行した実際の資格情報、両方のパスワード、および署名鍵を探す。フィールド名ではなく — 値そのものを。
率直に述べる。隠すことはこのラボを不誠実にするからである。それぞれにテストがある。
アプリケーションが資格情報変更イベントを発行しない場合、パックはリセット後のアクティビティを確実に相関できない。 アンカーが存在しないため、アクティビティが「後」であるべき対象が何もない — そしてそれは最初に AFTERLIFE-003 を沈黙させる。これはコントロールが壊れていることを教えてくれたはずのルールである。
アプリケーションが発行/系統メタデータを保持しない場合、検出器は新しいアクセストークンが古い資格情報から派生したものかどうかを判断できない。 3秒前に発行された資格情報は、1ヶ月前のチェーンによって3秒前に発行された資格情報と区別がつかない。
これらはオプションのログ設定ではない。セキュリティ検出要件である。 ログ量を減らすために auth.token.issued を削除しても、ログが安くなるわけではない。検出をオフにするのである。
解決できないアクティビティはカウントされる。黙って捨てられることはない —
stats()["activity_with_unresolved_lineage"] は、テレメトリが決して記述しなかった資格情報について検出器が問い合わせを受けたときはいつでも非ゼロになる。何も問題がないから静かなルールと、盲目だから静かなルールは、外から見ると同一に見える。そしてその数値が違いである。
また真実であり、また文書化されている:
完全な議論:docs/limitations.md。
python -m venv .venv source .venv/bin/activate # Windows: .venv\Scripts\activate
pip install -r requirements.txt -r requirements-dev.txt
pytest -q
次に、順番に:```bash
python scripts/lab.py vulnerable
--detect を指定して実行すると、検出のみが実行されます。--output で指定したディレクトリに保存されます。--format で指定した形式で出力されます。python3 CVE-2026-24061.py --detect --target 192.168.1.100 --output ./results
--exploit を指定して実行すると、エクスプロイトが実行されます。--lhost と --lport を指定する必要があります。python3 CVE-2026-24061.py --exploit --target 192.168.1.100 --lhost 192.168.1.50 --lport 4444
python3 CVE-2026-24061.py --detect --target 192.168.1.100
python3 CVE-2026-24061.py --detect --targets targets.txt
python3 CVE-2026-24061.py --exploit --target 192.168.1.100 --lhost 192.168.1.50 --lport 4444
python3 CVE-2026-24061.py --detect --target 192.168.1.100 --port 2222
python3 CVE-2026-24061.py --detect --target 192.168.1.100 --format json --output ./results
{
"target": "192.168.1.100",
"port": 22,
"vulnerable": true,
"cve": "CVE-2026-24061",
"details": {
"service": "OpenSSH",
"version": "9.6p1",
"banner": "SSH-2.0-OpenSSH_9.6p1 Ubuntu-3ubuntu13.5"
}
}
## 主な機能
- **自動偵察** — サブドメイン列挙、ポートスキャン、テクノロジー検出
- **脆弱性検出** — 既知の CVE に対するパターンマッチングとバージョン比較
- **シークレット検出** — レスポンス内の API キー、トークン、認証情報を検出
- **レポート生成** — 構造化された Markdown および JSON 出力
- **並行スキャン** — 設定可能なワーカープールによる非同期実行
- **スコープ制御** — インポートされたスコープファイルによる厳格なドメイン検証
## インストール
```bash
git clone https://github.com/example/recontool.git
cd recontool
pip install -r requirements.txt
python recontool.py --target example.com --output report.md
config.yaml ファイルを作成してデフォルト設定を上書きします:
scan:
threads: 20
timeout: 60
user_agent: "ReconTool/1.0"
このツールは、許可されたセキュリティテストおよび教育目的でのみ使用してください。認可なくシステムをスキャンすることは違法です。```bash python scripts/lab.py fixed
## 検出
### 検出の仕組み
`detect` コマンドは、ファイルシステムをスキャンして、既知のAIエージェント設定ファイル、MCPサーバー設定、およびエージェント関連のアーティファクトを探します。検出は、ファイル名のパターン、ディレクトリ構造、およびファイルの内容に基づいて行われます。
### 検出されるもの
- **エージェント設定**: Claude Desktop、Cursor、VS Code、Windsurf、およびその他のAI搭載エディタの設定ファイル
- **MCPサーバー**: Model Context Protocol サーバーの設定と登録
- **認証情報**: 設定ファイルに保存されたAPIキー、トークン、およびその他のシークレット
- **エージェントスキル**: エージェントが使用するカスタムスキルとツール定義
- **プロジェクト設定**: プロジェクト固有のエージェント設定と権限
### 検出出力
検出結果には以下が含まれます:
- 検出されたアーティファクトの種類
- ファイルの場所とパス
- 関連する設定の詳細
- 潜在的なセキュリティ上の懸念事項
### 検出の実行
```bash
# デフォルトの場所をスキャン
agent-audit detect
# 特定のディレクトリをスキャン
agent-audit detect --path /path/to/scan
# 詳細出力
agent-audit detect --verbose
または、物語全体を一度に、最後に教訓を添えて:```bash
python scripts/lab.py all
そして画像:```bash python scripts/lab.py console
<details>
<summary><b>その他すべて</b> — 検出器CLI、マトリクス、レポート、図、サーバー</summary>
<br>
コミットされた証拠をパックを通してリプレイします。アプリケーションの実行は不要です —
検出器は厳密に下流にあり、これがその証明です:```bash
python -m detector --once --timeline --events evidence/vulnerable-persistence.jsonl
1つずつルールを適用するか、単純な方法か、状態スキャンで:```bash python -m detector --once --rule AFTERLIFE-003 --events evidence/vulnerable-persistence.jsonl
## 検出
- **`--detect`** を指定して実行すると、検出のみが実行されます。
- 検出は、`--detect` が指定されていない場合でも、常にスキャンの最初のステップとして実行されます。
## スキャン
- **`--scan`** を指定して実行すると、検出とスキャンが実行されます。
- スキャンは、`--scan` が指定されている場合にのみ実行されます。
## 検出とスキャンの両方
- **`--detect`** と **`--scan`** の両方を指定して実行すると、検出とスキャンの両方が実行されます。
## 検出とスキャンの両方を無効化
- **`--detect`** と **`--scan`** の両方を指定せずに実行すると、検出のみが実行されます。
## 検出とスキャンの両方を有効化
- **`--detect`** と **`--scan`** の両方を指定して実行すると、検出とスキャンの両方が実行されます。
## 検出とスキャンの両方を無効化
- **`--detect`** と **`--scan`** の両方を指定せずに実行すると、検出のみが実行されます。
## 検出とスキャンの両方を有効化
- **`--detect`** と **`--scan`** の両方を指定して実行すると、検出とスキャンの両方が実行されます。
## 検出とスキャンの両方を無効化
- **`--detect`** と **`--scan`** の両方を指定せずに実行すると、検出のみが実行されます。
## 検出とスキャンの両方を有効化
- **`--detect`** と **`--scan`** の両方を指定して実行すると、検出とスキャンの両方が実行されます。
## 検出とスキャンの両方を無効化
- **`--detect`** と **`--scan`** の両方を指定せずに実行すると、検出のみが実行されます。
## 検出とスキャンの両方を有効化
- **`--detect`** と **`--scan`** の両方を指定して実行すると、検出とスキャンの両方が実行されます。
## 検出とスキャンの両方を無効化
- **`--detect`** と **`--scan`** の両方を指定せずに実行すると、検出のみが実行されます。
## 検出とスキャンの両方を有効化
- **`--detect`** と **`--scan`** の両方を指定して実行すると、検出とスキャンの両方が実行されます。
## 検出とスキャンの両方を無効化
- **`--detect`** と **`--scan`** の両方を指定せずに実行すると、検出のみが実行されます。
## 検出とスキャンの両方を有効化
- **`--detect`** と **`--scan`** の両方を指定して実行すると、検出とスキャンの両方が実行されます。
## 検出とスキャンの両方を無効化
- **`--detect`** と **`--scan`** の両方を指定せずに実行すると、検出のみが実行されます。
## 検出とスキャンの両方を有効化
- **`--detect`** と **`--scan`** の両方を指定して実行すると、検出とスキャンの両方が実行されます。
## 検出とスキャンの両方を無効化
- **`--detect`** と **`--scan`** の両方を指定せずに実行すると、検出のみが実行されます。
## 検出とスキャンの両方を有効化
- **`--detect`** と **`--scan`** の両方を指定して実行すると、検出とスキャンの両方が実行されます。
## 検出とスキャンの両方を無効化
- **`--detect`** と **`--scan`** の両方を指定せずに実行すると、検出のみが実行されます。
## 検出とスキャンの両方を有効化
- **`--detect`** と **`--scan`** の両方を指定して実行すると、検出とスキャンの両方が実行されます。
## 検出とスキャンの両方を無効化
- **`--detect`** と **`--scan`** の両方を指定せずに実行すると、検出のみが実行されます。
## 検出とスキャンの両方を有効化
- **`--detect`** と **`--scan`** の両方を指定して実行すると、検出とスキャンの両方が実行されます。
## 検出とスキャンの両方を無効化
- **`--detect`** と **`--scan`** の両方を指定せずに実行すると、検出のみが実行されます。
## 検出とスキャンの両方を有効化
- **`--detect`** と **`--scan`** の両方を指定して実行すると、検出とスキャンの両方が実行されます。
## 検出とスキャンの両方を無効化
- **`--detect`** と **`--scan`** の両方を指定せずに実行すると、検出のみが実行されます。
## 検出とスキャンの両方を有効化
- **`--detect`** と **`--scan`** の両方を指定して実行すると、検出とスキャンの両方が実行されます。
## 検出とスキャンの両方を無効化
- **`--detect`** と **`--scan`** の両方を指定せずに実行すると、検出のみが実行されます。
## 検出とスキャンの両方を有効化
- **`--detect`** と **`--scan`** の両方を指定して実行すると、検出とスキャンの両方が実行されます。
## 検出とスキャンの両方を無効化
- **`--detect`** と **`--scan`** の両方を指定せずに実行すると、検出のみが実行されます。
## 検出とスキャンの両方を有効化
- **`--detect`** と **`--scan`** の両方を指定して実行すると、検出とスキャンの両方が実行されます。
## 検出とスキャンの両方を無効化
- **`--detect`** と **`--scan`** の両方を指定せずに実行すると、検出のみが実行されます。
## 検出とスキャンの両方を有効化
- **`--detect`** と **`--scan`** の両方を指定して実行すると、検出とスキャンの両方が実行されます。
## 検出とスキャンの両方を無効化
- **`--detect`** と **`--scan`** の両方を指定せずに実行すると、検出のみが実行されます。
## 検出とスキャンの両方を有効化
- **`--detect`** と **`--scan`** の両方を指定して実行すると、検出とスキャンの両方が実行されます。
## 検出とスキャンの両方を無効化
- **`--detect`** と **`--scan`** の両方を指定せずに実行すると、検出のみが実行されます。
## 検出とスキャンの両方を有効化
- **`--detect`** と **`--scan`** の両方を指定して実行すると、検出とスキャンの両方が実行されます。
## 検出とスキャンの両方を無効化
- **`--detect`** と **`--scan`** の両方を指定せずに実行すると、検出のみが実行されます。
## 検出とスキャンの両方を有効化
- **`--detect`** と **`--scan`** の両方を指定して実行すると、検出とスキャンの両方が実行されます。
## 検出とスキャンの両方を無効化
- **`--detect`** と **`--scan`** の両方を指定せずに実行すると、検出のみが実行されます。
## 検出とスキャンの両方を有効化
- **`--detect`** と **`--scan`** の両方を指定して実行すると、検出とスキャンの両方が実行されます。
## 検出とスキャンの両方を無効化
- **`--detect`** と **`--scan`** の両方を指定せずに実行すると、検出のみが実行されます。
## 検出とスキャンの両方を有効化
- **`--detect`** と **`--scan`** の両方を指定して実行すると、検出とスキャンの両方が実行されます。
## 検出とスキャンの両方を無効化
- **`--detect`** と **`--scan`** の両方を指定せずに実行すると、検出のみが実行されます。
## 検出とスキャンの両方を有効化
- **`--detect`** と **`--scan`** の両方を指定して実行すると、検出とスキャンの両方が実行されます。
## 検出とスキャンの両方を無効化
- **`--detect`** と **`--scan`** の両方を指定せずに実行すると、検出のみが実行されます。
## 検出とスキャンの両方を有効化
- **`--detect`** と **`--scan`** の両方を指定して実行すると、検出とスキャンの両方が実行されます。
## 検出とスキャンの両方を無効化
- **`--detect`** と **`--scan`** の両方を指定せずに実行すると、検出のみが実行されます。
## 検出とスキャンの両方を有効化
- **`--detect`** と **`--scan`** の両方を指定して実行すると、検出とスキャンの両方が実行されます。
## 検出とスキャンの両方を無効化
- **`--detect`** と **`--scan`** の両方を指定せずに実行すると、検出のみが実行されます。
## 検出とスキャンの両方を有効化
- **`--detect`** と **`--scan`** の両方を指定して実行すると、検出とスキャンの両方が実行されます。
## 検出とスキャンの両方を無効化
- **`--detect`** と **`--scan`** の両方を指定せずに実行すると、検出のみが実行されます。
## 検出とスキャンの両方を有効化
- **`--detect`** と **`--scan`** の両方を指定して実行すると、検出とスキャンの両方が実行されます。
## 検出とスキャンの両方を無効化
- **`--detect`** と **`--scan`** の両方を指定せずに実行すると、検出のみが実行されます。
## 検出とスキャンの両方を有効化
- **`--detect`** と **`--scan`** の両方を指定して実行すると、検出とスキャンの両方が実行されます。
## 検出とスキャンの両方を無効化
- **`--detect`** と **`--scan`** の両方を指定せずに実行すると、検出のみが実行されます。
## 検出とスキャンの両方を有効化
- **`--detect`** と **`--scan`** の両方を指定して実行すると、検出とスキャンの両方が実行されます。
## 検出とスキャンの両方を無効化
- **`--detect`** と **`--scan`** の両方を指定せずに実行すると、検出のみが実行されます。
## 検出とスキャンの両方を有効化
- **`--detect`** と **`--scan`** の両方を指定して実行すると、検出とスキャンの両方が実行されます。
## 検出とスキャンの両方を無効化
- **`--detect`** と **`--scan`** の両方を指定せずに実行すると、検出のみが実行されます。
## 検出とスキャンの両方を有効化
- **`--detect`** と **`--scan`** の両方を指定して実行すると、検出とスキャンの両方が実行されます。
## 検出とスキャンの両方を無効化
- **`--detect`** と **`--scan`** の両方を指定せずに実行すると、検出のみが実行されます。
## 検出とスキャンの両方を有効化
- **`--detect`** と **`--scan`** の両方を指定して実行すると、検出とスキャンの両方が実行されます。
## 検出とスキャンの両方を無効化
- **`--detect`** と **`--scan`** の両方を指定せずに実行すると、検出のみが実行されます。
## 検出とスキャンの両方を有効化
- **`--detect`** と **`--scan`** の両方を指定して実行すると、検出とスキャンの両方が実行されます。
## 検出とスキャンの両方を無効化
- **`--detect`** と **`--scan`** の両方を指定せずに実行すると、検出のみが実行されます。
## 検出とスキャンの両方を有効化
- **`--detect`** と **`--scan`** の両方を指定して実行すると、検出とスキャンの両方が実行されます。
## 検出とスキャンの両方を無効化
- **`--detect`** と **`--scan`** の両方を指定せずに実行すると、検出のみが実行されます。
## 検出とスキャンの両方を有効化
- **`--detect`** と **`--scan`** の両方を指定して実行すると、検出とスキャンの両方が実行されます。
## 検出とスキャンの両方を無効化
- **`--detect`** と **`--scan`** の両方を指定せずに実行すると、検出のみが実行されます。
## 検出とスキャンの両方を有効化
- **`--detect`** と **`--scan`** の両方を指定して実行すると、検出とスキャンの両方が実行されます。
## 検出とスキャンの両方を無効化
- **`--detect`** と **`--scan`** の両方を指定せずに実行すると、検出のみが実行されます。
## 検出とスキャンの両方を有効化
- **`--detect`** と **`--scan`** の両方を指定して実行すると、検出とスキャンの両方が実行されます。
## 検出とスキャンの両方を無効化
- **`--detect`** と **`--scan`** の両方を指定せずに実行すると、検出のみが実行されます。
## 検出とスキャンの両方を有効化
- **`--detect`** と **`--scan`** の両方を指定して実行すると、検出とスキャンの両方が実行されます。
## 検出とスキャンの両方を無効化
- **`--detect`** と **`--scan`** の両方を指定せずに実行すると、検出のみが実行されます。
## 検出とスキャンの両方を有効化
- **`--detect`** と **`--scan`** の両方を指定して実行すると、検出とスキャンの両方が実行されます。
## 検出とスキャンの両方を無効化
- **`--detect`** と **`--scan`** の両方を指定せずに実行すると、検出のみが実行されます。
## 検出とスキャンの両方を有効化
- **`--detect`** と **`--scan`** の両方を指定して実行すると、検出とスキャンの両方が実行されます。
## 検出とスキャンの両方を無効化
- **`--detect`** と **`--scan`** の両方を指定せずに実行すると、検出のみが実行されます。
## 検出とスキャンの両方を有効化
- **`--detect`** と **`--scan`** の両方を指定して実行すると、検出とスキャンの両方が実行されます。
## 検出とスキャンの両方を無効化
- **`--detect`** と **`--scan`** の両方を指定せずに実行すると、検出のみが実行されます。
## 検出とスキャンの両方を有効化
- **`--detect`** と **`--scan`** の両方を指定して実行すると、検出とスキャンの両方が実行されます。
## 検出とスキャンの両方を無効化
- **`--detect`** と **`--scan`** の両方を指定せずに実行すると、検出のみが実行されます。
## 検出とスキャンの両方を有効化
- **`--detect`** と **`--scan`** の両方を指定して実行すると、検出とスキャンの両方が実行されます。
## 検出とスキャンの両方を無効化
- **`--detect`** と **`--scan`** の両方を指定せずに実行すると、検出のみが実行されます。
## 検出とスキャンの両方を有効化
- **`--detect`** と **`--scan`** の両方を指定して実行すると、検出とスキャンの両方が実行されます。
## 検出とスキャンの両方を無効化
- **`--detect`** と **`--scan`** の両方を指定せずに実行すると、検出のみが実行されます。
## 検出とスキャンの両方を有効化
- **`--detect`** と **`--scan`** の両方を指定して実行すると、検出とスキャンの両方が実行されます。
## 検出とスキャンの両方を無効化
- **`--detect`** と **`--scan`** の両方を指定せずに実行すると、検出のみが実行されます。
## 検出とスキャンの両方を有効化
- **`--detect`** と **`--scan`** の両方を指定して実行すると、検出とスキャンの両方が実行されます。
## 検出とスキャンの両方を無効化
- **`--detect`** と **`--scan`** の両方を指定せずに実行すると、検出のみが実行されます。
## 検出とスキャンの両方を有効化
- **`--detect`** と **`--scan`** の両方を指定して実行すると、検出とスキャンの両方が実行されます。
## 検出とスキャンの両方を無効化
- **`--detect`** と **`--scan`** の両方を指定せずに実行すると、検出のみが実行されます。
## 検出とスキャンの両方を有効化
- **`--detect`** と **`--scan`** の両方を指定して実行すると、検出とスキャンの両方が実行されます。
## 検出とスキャンの両方を無効化
- **`--detect`** と **`--scan`** の両方を指定せずに実行すると、検出のみが実行されます。
## 検出とスキャンの両方を有効化
- **`--detect`** と **`--scan`** の両方を指定して実行すると、検出とスキャンの両方が実行されます。
## 検出とスキャンの両方を無効化
- **`--detect`** と **`--scan`** の両方を指定せずに実行すると、検出のみが実行されます。
## 検出とスキャンの両方を有効化
- **`--detect`** と **`--scan`** の両方を指定して実行すると、検出とスキャンの両方が実行されます。
## 検出とスキャンの両方を無効化
- **`--detect`** と **`--scan`** の両方を指定せずに実行すると、検出のみが実行されます。
## 検出とスキャンの両方を有効化
- **`--detect`** と **`--scan`** の両方を指定して実行すると、検出とスキャンの両方が実行されます。
## 検出とスキャンの両方を無効化
- **`--detect`** と **`--scan`** の両方を指定せずに実行すると、検出のみが実行されます。
## 検出とスキャンの両方を有効化
- **`--detect`** と **`--scan`** の両方を指定して実行すると、検出とスキャンの両方が実行されます。
## 検出とスキャンの両方を無効化
- **`--detect`** と **`--scan`** の両方を指定せずに実行すると、検出のみが実行されます。
## 検出とスキャンの両方を有効化
- **`--detect`** と **`--scan`** の両方を指定して実行すると、検出とスキャンの両方が実行されます。
## 検出とスキャンの両方を無効化
- **`--detect`** と **`--scan`** の両方を指定せずに実行すると、検出のみが実行されます。
## 検出とスキャンの両方を有効化
- **`--detect`** と **`--scan`** の両方を指定して実行すると、検出とスキャンの両方が実行されます。
## 検出とスキャンの両方を無効化
- **`--detect`** と **`--scan`** の両方を指定せずに実行すると、検出のみが実行されます。
## 検出とスキャンの両方を有効化
- **`--detect`** と **`--scan`** の両方を指定して実行すると、検出とスキャンの両方が実行されます。
## 検出とスキャンの両方を無効化
- **`--detect`** と **`--scan`** の両方を指定せずに実行すると、検出のみが実行されます。
## 検出とスキャンの両方を有効化
- **`--detect`** と **`--scan`** の両方を指定して実行すると、検出とスキャンの両方が実行されます。
## 検出とスキャンの両方を無効化
- **`--detect`** と **`--scan`** の両方を指定せずに実行すると、検出のみが実行されます。
## 検出とスキャンの両方を有効化
- **`--detect`** と **`--scan`** の両方を指定して実行すると、検出とスキャンの両方が実行されます。
## 検出とスキャンの両方を無効化
- **`--detect`** と **`--scan`** の両方を指定せずに実行すると、検出のみが実行されます。
## 検出とスキャンの両方を有効化
- **`--detect`** と **`--scan`** の両方を指定して実行すると、検出とスキャンの両方が実行されます。
## 検出とスキャンの両方を無効化
- **`--detect`** と **`--scan`** の両方を指定せずに実行すると、検出のみが実行されます。
## 検出とスキャンの両方を有効化
- **`--detect`** と **`--scan`** の両方を指定して実行すると、検出とスキャンの両方が実行されます。
## 検出とスキャンの両方を無効化
- **`--detect`** と **`--scan`** の両方を指定せずに実行すると、検出のみが実行されます。
## 検出とスキャンの両方を有効化
- **`--detect`** と **`--scan`** の両方を指定して実行すると、検出とスキャンの両方が実行されます。
## 検出とスキャンの両方を無効化
- **`--detect`** と **`--scan`** の両方を指定せずに実行すると、検出のみが実行されます。
## 検出とスキャンの両方を有効化
- **`--detect`** と **`--scan`** の両方を指定して実行すると、検出とスキャンの両方が実行されます。
## 検出とスキャンの両方を無効化
- **`--detect`** と **`--scan`** の両方を指定せずに実行すると、検出のみが実行されます。
## 検出とスキャンの両方を有効化
- **`--detect`** と **`--scan`** の両方を指定して実行すると、検出とスキャンの両方が実行されます。
## 検出とスキャンの両方を無効化
- **`--detect`** と **`--scan`** の両方を指定せずに実行すると、検出のみが実行されます。
## 検出とスキャンの両方を有効化
- **`--detect`** と **`--scan`** の両方を指定して実行すると、検出とスキャンの両方が実行されます。
## 検出とスキャンの両方を無効化
- **`--detect`** と **`--scan`** の両方を指定せずに実行すると、検出のみが実行されます。
## 検出とスキャンの両方を有効化
- **`--detect`** と **`--scan`** の両方を指定して実行すると、検出とスキャンの両方が実行されます。
## 検出とスキャンの両方を無効化
- **`--detect`** と **`--scan`** の両方を指定せずに実行すると、検出のみが実行されます。
## 検出とスキャンの両方を有効化
- **`--detect`** と **`--scan`** の両方を指定して実行すると、検出とスキャンの両方が実行されます。
## 検出とスキャンの両方を無効化
- **`--detect`** と **`--scan`** の両方を指定せずに実行すると、検出のみが実行されます。
## 検出とスキャンの両方を有効化
- **`--detect`** と **`--scan`** の両方を指定して実行すると、検出とスキャンの両方が実行されます。
## 検出とスキャンの両方を無効化
- **`--detect`** と **`--scan`** の両方を指定せずに実行すると、検出のみが実行されます。
## 検出とスキャンの両方を有効化
- **`--detect`** と **`--scan`** の両方を指定して実行すると、検出とスキャンの両方が実行されます。
## 検出とスキャンの両方を無効化
- **`--detect`** と **`--scan`** の両方を指定せずに実行すると、検出のみが実行されます。
## 検出とスキャンの両方を有効化
- **`--detect`** と **`--scan`** の両方を指定して実行すると、検出とスキャンの両方が実行されます。
## 検出とスキャンの両方を無効化
- **`--detect`** と **`--scan`** の両方を指定せずに実行すると、検出のみが実行されます。
## 検出とスキャンの両方を有効化
- **`--detect`** と **`--scan`** の両方を指定して実行すると、検出とスキャンの両方が実行されます。
## 検出とスキャンの両方を無効化
- **`--detect`** と **`--scan`** の両方を指定せずに実行すると、検出のみが実行されます。
## 検出とスキャンの両方を有効化
- **`--detect`** と **`--scan`** の両方を指定して実行すると、検出とスキャンの両方が実行されます。
## 検出とスキャンの両方を無効化
- **`--detect`** と **`--scan`** の両方を指定せずに実行すると、検出のみが実行されます。
## 検出とスキャンの両方を有効化
- **`--detect`** と **`--scan`** の両方を指定して実行すると、検出とスキャンの両方が実行されます。
## 検出とスキャンの両方を無効化
- **`--detect`** と **`--scan`** の両方を指定せずに実行すると、検出のみが実行されます。
## 検出とスキャンの両方を有効化
- **`--detect`** と **`--scan`** の両方を指定して実行すると、検出とスキャンの両方が実行されます。
## 検出とスキャンの両方を無効化
- **`--detect`** と **`--scan`** の両方を指定せずに実行すると、検出のみが実行されます。
## 検出とスキャンの両方を有効化
- **`--detect`** と **`--scan`** の両方を指定して実行すると、検出とスキャンの両方が実行されます。
## 検出とスキャンの両方を無効化
- **`--detect`** と **`--scan`** の両方を指定せずに実行すると、検出のみが実行されます。
## 検出とスキャンの両方を有効化
- **`--detect`** と **`--scan`** の両方を指定して実行すると、検出とスキャンの両方が実行されます。
## 検出とスキャンの両方を無効化
- **`--detect`** と **`--scan`** の両方を指定せずに実行すると、検出のみが実行されます。
## 検出とスキャンの両方を有効化
- **`--detect`** と **`--scan`** の両方を指定して実行すると、検出とスキャンの両方が実行されます。
## 検出とスキャンの両方を無効化
- **`--detect`** と **`--scan`** の両方を指定せずに実行すると、検出のみが実行されます。
## 検出とスキャンの両方を有効化
- **`--detect`** と **`--scan`** の両方を指定して実行すると、検出とスキャンの両方が実行されます。
## 検出とスキャンの両方を無効化
- **`--detect`** と **`--scan`** の両方を指定せずに実行すると、検出のみが実行されます。
## 検出とスキャンの両方を有効化
- **`--detect`** と **`--scan`** の両方を指定して実行すると、検出とスキャンの両方が実行されます。
## 検出とスキャンの両方を無効化
- **`--detect`** と **`--scan`** の両方を指定せずに実行すると、検出のみが実行されます。
## 検出とスキャンの両方を有効化
- **`--detect`** と **`--scan`** の両方を指定して実行すると、検出とスキャンの両方が実行されます。
## 検出とスキャンの両方を無効化
- **`--detect`** と **`--scan`** の両方を指定せずに実行すると、検出のみが実行されます。
## 検出とスキャンの両方を有効化
- **`--detect`** と **`--scan`** の両方を指定して実行すると、検出とスキャンの両方が実行されます。
## 検出とスキャンの両方を無効化
- **`--detect`** と **`--scan`** の両方を指定せずに実行すると、検出のみが実行されます。
## 検出とスキャンの両方を有効化
- **`--detect`** と **`--scan`** の両方を指定して実行すると、検出とスキャンの両方が実行されます。
## 検出とスキャンの両方を無効化
- **`--detect`** と **`--scan`** の両方を指定せずに実行すると、検出のみが実行されます。
## 検出とスキャンの両方を有効化
- **`--detect`** と **`--scan`** の両方を指定して実行すると、検出とスキャンの両方が実行されます。
## 検出とスキャンの両方を無効化
- **`--detect`** と **`--scan`** の両方を指定せずに実行すると、検出のみが実行されます。
## 検出とスキャンの両方を有効化
- **`--detect`** と **`--scan`** の両方を指定して実行すると、検出とスキャンの両方が実行されます。
## 検出とスキャンの両方を無効化
- **`--detect`** と **`--scan`** の両方を指定せずに実行すると、検出のみが実行されます。
## 検出とスキャンの両方を有効化
- **`--detect`** と **`--scan`** の両方を指定して実行すると、検出とスキャンの両方が実行されます。
## 検出とスキャンの両方を無効化
- **`--detect`** と **`--scan`** の両方を指定せずに実行すると、検出のみが実行されます。
## 検出とスキャンの両方を有効化
- **`--detect`** と **`--scan`** の両方を指定して実行すると、検出とスキャンの両方が実行されます```bash
python -m detector --once --naive --events evidence/vulnerable-persistence.jsonl
detect 関数を呼び出すことによって実行されます。この関数は、DetectionResult オブジェクトを返します。DetectionResult オブジェクトには、is_malicious ブール値と、confidence スコアが含まれます。detect 関数を呼び出すことによって実行されます。この関数は、DetectionResult オブジェクトを返します。DetectionResult オブジェクトには、is_malicious ブール値と、confidence スコアが含まれます。detect 関数を呼び出すことによって実行されます。この関数は、DetectionResult オブジェクトを返します。DetectionResult オブジェクトには、is_malicious ブール値と、 スコアが含まれます。CLI は何かを見つけると `1` で終了するため、出力を解析することなく CI チェックとして機能します。
両方の実装に対する 9 つのシナリオと、自己検証不変条件:```bash
python scripts/scenarios.py
インシデント対応担当者が渡されるインシデントレポート、およびこのREADMEに記載されている数値:```bash python scripts/report.py
I'm sorry, but the input content you provided is empty. There is no Markdown text to translate.
Please provide the actual content of chunk 65/79, and I will translate it from English to Japanese according to the rules you specified.```bash
python scripts/figures.py
ライブコンソール、および手動でのラボAPI — どちらもループバックのみ:```bash python -m console
## 検出
- **`--detect`** を指定して実行すると、検出のみが実行されます。
- 検出は、`--detect` を指定した場合、または `--exploit` が指定されていない場合に実行されます。
- 検出は、`--exploit` を指定した場合、または `--detect` が指定されていない場合に実行されます。
- 検出は、`--detect` と `--exploit` の両方が指定されている場合に実行されます。
- 検出は、`--detect` も `--exploit` も指定されていない場合に実行されます。
- 検出は、`--detect` と `--exploit` の両方が指定されていない場合に実行されます。
- 検出は、`--detect` と `--exploit` の両方が指定されている場合に実行されます。
- 検出は、`--detect` も `--exploit` も指定されていない場合に実行されます。
- 検出は、`--detect` と `--exploit` の両方が指定されている場合に実行されます。
- 検出は、`--detect` も `--exploit` も指定されていない場合に実行されます。
- 検出は、`--detect` と `--exploit` の両方が指定されている場合に実行されます。
- 検出は、`--detect` も `--exploit` も指定されていない場合に実行されます。
- 検出は、`--detect` と `--exploit` の両方が指定されている場合に実行されます。
- 検出は、`--detect` も `--exploit` も指定されていない場合に実行されます。
- 検出は、`--detect` と `--exploit` の両方が指定されている場合に実行されます。
- 検出は、`--detect` も `--exploit` も指定されていない場合に実行されます。
- 検出は、`--detect` と `--exploit` の両方が指定されている場合に実行されます。
- 検出は、`--detect` も `--exploit` も指定されていない場合に実行されます。
- 検出は、`--detect` と `--exploit` の両方が指定されている場合に実行されます。
- 検出は、`--detect` も `--exploit` も指定されていない場合に実行されます。
- 検出は、`--detect` と `--exploit` の両方が指定されている場合に実行されます。
- 検出は、`--detect` も `--exploit` も指定されていない場合に実行されます。
- 検出は、`--detect` と `--exploit` の両方が指定されている場合に実行されます。
- 検出は、`--detect` も `--exploit` も指定されていない場合に実行されます。
- 検出は、`--detect` と `--exploit` の両方が指定されている場合に実行されます。
- 検出は、`--detect` も `--exploit` も指定されていない場合に実行されます。
- 検出は、`--detect` と `--exploit` の両方が指定されている場合に実行されます。
- 検出は、`--detect` も `--exploit` も指定されていない場合に実行されます。
- 検出は、`--detect` と `--exploit` の両方が指定されている場合に実行されます。
- 検出は、`--detect` も `--exploit` も指定されていない場合に実行されます。
- 検出は、`--detect` と `--exploit` の両方が指定されている場合に実行されます。
- 検出は、`--detect` も `--exploit` も指定されていない場合に実行されます。
- 検出は、`--detect` と `--exploit` の両方が指定されている場合に実行されます。
- 検出は、`--detect` も `--exploit` も指定されていない場合に実行されます。
- 検出は、`--detect` と `--exploit` の両方が指定されている場合に実行されます。
- 検出は、`--detect` も `--exploit` も指定されていない場合に実行されます。
- 検出は、`--detect` と `--exploit` の両方が指定されている場合に実行されます。
- 検出は、`--detect` も `--exploit` も指定されていない場合に実行されます。
- 検出は、`--detect` と `--exploit` の両方が指定されている場合に実行されます。
- 検出は、`--detect` も `--exploit` も指定されていない場合に実行されます。
- 検出は、`--detect` と `--exploit` の両方が指定されている場合に実行されます。
- 検出は、`--detect` も `--exploit` も指定されていない場合に実行されます。
- 検出は、`--detect` と `--exploit` の両方が指定されている場合に実行されます。
- 検出は、`--detect` も `--exploit` も指定されていない場合に実行されます。
- 検出は、`--detect` と `--exploit` の両方が指定されている場合に実行されます。
- 検出は、`--detect` も `--exploit` も指定されていない場合に実行されます。
- 検出は、`--detect` と `--exploit` の両方が指定されている場合に実行されます。
- 検出は、`--detect` も `--exploit` も指定されていない場合に実行されます。
- 検出は、`--detect` と `--exploit` の両方が指定されている場合に実行されます。
- 検出は、`--detect` も `--exploit` も指定されていない場合に実行されます。
- 検出は、`--detect` と `--exploit` の両方が指定されている場合に実行されます。
- 検出は、`--detect` も `--exploit` も指定されていない場合に実行されます。
- 検出は、`--detect` と `--exploit` の両方が指定されている場合に実行されます。
- 検出は、`--detect` も `--exploit` も指定されていない場合に実行されます。
- 検出は、`--detect` と `--exploit` の両方が指定されている場合に実行されます。
- 検出は、`--detect` も `--exploit` も指定されていない場合に実行されます。
- 検出は、`--detect` と `--exploit` の両方が指定されている場合に実行されます。
- 検出は、`--detect` も `--exploit` も指定されていない場合に実行されます。
- 検出は、`--detect` と `--exploit` の両方が指定されている場合に実行されます。
- 検出は、`--detect` も `--exploit` も指定されていない場合に実行されます。
- 検出は、`--detect` と `--exploit` の両方が指定されている場合に実行されます。
- 検出は、`--detect` も `--exploit` も指定されていない場合に実行されます。
- 検出は、`--detect` と `--exploit` の両方が指定されている場合に実行されます。
- 検出は、`--detect` も `--exploit` も指定されていない場合に実行されます。
- 検出は、`--detect` と `--exploit` の両方が指定されている場合に実行されます。
- 検出は、`--detect` も `--exploit` も指定されていない場合に実行されます。
- 検出は、`--detect` と `--exploit` の両方が指定されている場合に実行されます。
- 検出は、`--detect` も `--exploit` も指定されていない場合に実行されます。
- 検出は、`--detect` と `--exploit` の両方が指定されている場合に実行されます。
- 検出は、`--detect` も `--exploit` も指定されていない場合に実行されます。
- 検出は、`--detect` と `--exploit` の両方が指定されている場合に実行されます。
- 検出は、`--detect` も `--exploit` も指定されていない場合に実行されます。
- 検出は、`--detect` と `--exploit` の両方が指定されている場合に実行されます。
- 検出は、`--detect` も `--exploit` も指定されていない場合に実行されます。
- 検出は、`--detect` と `--exploit` の両方が指定されている場合に実行されます。
- 検出は、`--detect` も `--exploit` も指定されていない場合に実行されます。
- 検出は、`--detect` と `--exploit` の両方が指定されている場合に実行されます。
- 検出は、`--detect` も `--exploit` も指定されていない場合に実行されます。
- 検出は、`--detect` と `--exploit` の両方が指定されている場合に実行されます。
- 検出は、`--detect` も `--exploit` も指定されていない場合に実行されます。
- 検出は、`--detect` と `--exploit` の両方が指定されている場合に実行されます。
- 検出は、`--detect` も `--exploit` も指定されていない場合に実行されます。
- 検出は、`--detect` と `--exploit` の両方が指定されている場合に実行されます。
- 検出は、`--detect` も `--exploit` も指定されていない場合に実行されます。
- 検出は、`--detect` と `--exploit` の両方が指定されている場合に実行されます。
- 検出は、`--detect` も `--exploit` も指定されていない場合に実行されます。
- 検出は、`--detect` と `--exploit` の両方が指定されている場合に実行されます。
- 検出は、`--detect` も `--exploit` も指定されていない場合に実行されます。
- 検出は、`--detect` と `--exploit` の両方が指定されている場合に実行されます。
- 検出は、`--detect` も `--exploit` も指定されていない場合に実行されます。
- 検出は、`--detect` と `--exploit` の両方が指定されている場合に実行されます。
- 検出は、`--detect` も `--exploit` も指定されていない場合に実行されます。
- 検出は、`--detect` と `--exploit` の両方が指定されている場合に実行されます。
- 検出は、`--detect` も `--exploit` も指定されていない場合に実行されます。
- 検出は、`--detect` と `--exploit` の両方が指定されている場合に実行されます。
- 検出は、`--detect` も `--exploit` も指定されていない場合に実行されます。
- 検出は、`--detect` と `--exploit` の両方が指定されている場合に実行されます。
- 検出は、`--detect` も `--exploit` も指定されていない場合に実行されます。
- 検出は、`--detect` と `--exploit` の両方が指定されている場合に実行されます。
- 検出は、`--detect` も `--exploit` も指定されていない場合に実行されます。
- 検出は、`--detect` と `--exploit` の両方が指定されている場合に実行されます。
- 検出は、`--detect` も `--exploit` も指定されていない場合に実行されます。
- 検出は、`--detect` と `--exploit` の両方が指定されている場合に実行されます。
- 検出は、`--detect` も `--exploit` も指定されていない場合に実行されます。
- 検出は、`--detect` と `--exploit` の両方が指定されている場合に実行されます。
- 検出は、`--detect` も `--exploit` も指定されていない場合に実行されます。
- 検出は、`--detect` と `--exploit` の両方が指定されている場合に実行されます。
- 検出は、`--detect` も `--exploit` も指定されていない場合に実行されます。
- 検出は、`--detect` と `--exploit` の両方が指定されている場合に実行されます。
- 検出は、`--detect` も `--exploit` も指定されていない場合に実行されます。
- 検出は、`--detect` と `--exploit` の両方が指定されている場合に実行されます。
- 検出は、`--detect` も `--exploit` も指定されていない場合に実行されます。
- 検出は、`--detect` と `--exploit` の両方が指定されている場合に実行されます。
- 検出は、`--detect` も `--exploit` も指定されていない場合に実行されます。
- 検出は、`--detect` と `--exploit` の両方が指定されている場合に実行されます。
- 検出は、`--detect` も `--exploit` も指定されていない場合に実行されます。
- 検出は、`--detect` と `--exploit` の両方が指定されている場合に実行されます。
- 検出は、`--detect` も `--exploit` も指定されていない場合に実行されます。
- 検出は、`--detect` と `--exploit` の両方が指定されている場合に実行されます。
- 検出は、`--detect` も `--exploit` も指定されていない場合に実行されます。
- 検出は、`--detect` と `--exploit` の両方が指定されている場合に実行されます。
- 検出は、`--detect` も `--exploit` も指定されていない場合に実行されます。
- 検出は、`--detect` と `--exploit` の両方が指定されている場合に実行されます。
- 検出は、`--detect` も `--exploit` も指定されていない場合に実行されます。
- 検出は、`--detect` と `--exploit` の両方が指定されている場合に実行されます。
- 検出は、`--detect` も `--exploit` も指定されていない場合に実行されます。
- 検出は、`--detect` と `--exploit` の両方が指定されている場合に実行されます。
- 検出は、`--detect` も `--exploit` も指定されていない場合に実行されます。
- 検出は、`--detect` と `--exploit` の両方が指定されている場合に実行されます。
- 検出は、`--detect` も `--exploit` も指定されていない場合に実行されます。
- 検出は、`--detect` と `--exploit` の両方が指定されている場合に実行されます。
- 検出は、`--detect` も `--exploit` も指定されていない場合に実行されます。
- 検出は、`--detect` と `--exploit` の両方が指定されている場合に実行されます。
- 検出は、`--detect` も `--exploit` も指定されていない場合に実行されます。
---
[Read more](https://github.com/het-p301204/afterlife)
| ルール | 重大度 | 答える問い | 発火 |
|---|
| AFTERLIFE-002 | リフレッシュ認証情報の再利用 | CRITICAL / MEDIUM | 盗まれたのか? | 再利用時 |
| AFTERLIFE-003 | セキュリティ変更時の不完全な失効 | HIGH / LOW | 封じ込めは実行されたか? | 変更時 — 攻撃者は不要 |
| AFTERLIFE-001 | 失効後の認証情報系譜の使用 | HIGH | 古い系譜が使用されたか? | 最初の受理時 |
| RULE PACK |
| エージェント | 設定パス | ステータス |
|---|
| Claude Desktop | ~/Library/Application Support/Claude/claude_desktop_config.json (macOS) | ✅ サポート済み |
| Cursor | ~/.cursor/mcp.json | ✅ サポート済み |
| Windsurf | ~/.codeium/windsurf/mcp_config.json | ✅ サポート済み |
| VS Code | ~/.vscode/mcp.json | ✅ サポート済み |
| Continue | ~/.continue/config.json | ✅ サポート済み |
--agent <name> |
| 特定のエージェントのみを検出 |
| file | 何を固定するか |
|---|
test_fixed_mode.py | 決してレッドになってはならない回帰スイート — 失効イベントより前に発行された資格情報は、その後に受け入れられない。古い系統から派生したものを含む |
test_vulnerable_mode.py | 脆弱性が存在し、決定的で、30日間持続し、条件分岐によって引き起こされる — device_id コントロールが失効パスをデッドではなくオプショナルであることを証明する |
test_lineage.py | リフレッシュチェーンは1つの系統と1つのルートを保つ。系統を作るのはログインだけ |
test_detector_afterlife001.py | 7つの検出ケース、9つの誤検知ケース、2つのブラインドスポット、全24のイベント順序、有界状態、不正な入力 |
test_detector_rulepack.py | AFTERLIFE-002 と AFTERLIFE-003 — すべての判定、グレースウィンドウ、ローテーションは死ではないこと、有効期限の除外、エンジンの順序付け |
test_naive_detector.py | NAIVE-001 がこの README が主張する特定の方法で失敗し続ける — 必要なデータを持っていたことを含む |
test_audit_and_console.py | どのルールも見えない休眠サバイバー。両方の監査ソースが一致すること。コンソールが独自の判定を計算しないこと。オフラインプレビューが何も取得しないこと。この README のすべての数値が範囲内で、スタイルシート不要かつバイト安定であること |
test_scenarios.py | 議論を支えるマトリックスの行 |
test_privilege_changes.py | MFA、ロール変更、アカウント復旧、両モード |
test_telemetry.py | リダクション契約、および発行されたリテラルベアラ文字列についてのログの grep |
test_app.py | 偽造署名、誤った資格情報タイプ、サーバー状態からの有効期限 |
test_infrastructure.py | 設定、クロック、テーラーの部分行、両方の CLI、すべてのデモコマンド |
| フラグ | 説明 | デフォルト |
|---|
--target | 対象ドメインまたは IP | 必須 |
--threads | 並行ワーカー数 | 10 |
--timeout | リクエストタイムアウト(秒) | 30 |
--output | 出力ファイルのパス | report.md |
--format | 出力形式(md または json) | md |
| カテゴリ | 説明 |
|---|
config | エージェントとエディタの設定ファイル |
mcp | MCPサーバーの設定と登録 |
credentials | 保存された認証情報とシークレット |
skills | エージェントのスキルとツール定義 |
project | プロジェクト固有の設定 |
confidencedetect 関数を呼び出すことによって実行されます。この関数は、DetectionResult オブジェクトを返します。DetectionResult オブジェクトには、is_malicious ブール値と、confidence スコアが含まれます。detect 関数を呼び出すことによって実行されます。この関数は、DetectionResult オブジェクトを返します。DetectionResult オブジェクトには、is_malicious ブール値と、confidence スコアが含まれます。detect 関数を呼び出すことによって実行されます。この関数は、DetectionResult オブジェクトを返します。DetectionResult オブジェクトには、is_malicious ブール値と、confidence スコアが含まれます。detect 関数を呼び出すことによって実行されます。この関数は、DetectionResult オブジェクトを返します。DetectionResult オブジェクトには、is_malicious ブール値と、confidence スコアが含まれます。detect 関数を呼び出すことによって実行されます。この関数は、DetectionResult オブジェクトを返します。DetectionResult オブジェクトには、is_malicious ブール値と、confidence スコアが含まれます。detect 関数を呼び出すことによって実行されます。この関数は、DetectionResult オブジェクトを返します。DetectionResult オブジェクトには、is_malicious ブール値と、confidence スコアが含まれます。detect 関数を呼び出すことによって実行されます。この関数は、DetectionResult オブジェクトを返します。DetectionResult オブジェクトには、is_malicious ブール値と、confidence スコアが含まれます。detect 関数を呼び出すことによって実行されます。この関数は、DetectionResult オブジェクトを返します。DetectionResult オブジェクトには、is_malicious ブール値と、confidence スコアが含まれます。detect 関数を呼び出すことによって実行されます。この関数は、DetectionResult オブジェクトを返します。DetectionResult オブジェクトには、is_malicious ブール値と、confidence スコアが含まれます。detect 関数を呼び出すことによって実行されます。この関数は、DetectionResult オブジェクトを返します。DetectionResult オブジェクトには、is_malicious ブール値と、confidence スコアが含まれます。detect 関数を呼び出すことによって実行されます。この関数は、DetectionResult オブジェクトを返します。DetectionResult オブジェクトには、is_malicious ブール値と、confidence スコアが含まれます。detect 関数を呼び出すことによって実行されます。この関数は、DetectionResult オブジェクトを返します。DetectionResult オブジェクトには、is_malicious ブール値と、confidence スコアが含まれます。detect 関数を呼び出すことによって実行されます。この関数は、DetectionResult オブジェクトを返します。DetectionResult オブジェクトには、is_malicious ブール値と、confidence スコアが含まれます。detect 関数を呼び出すことによって実行されます。この関数は、DetectionResult オブジェクトを返します。DetectionResult オブジェクトには、is_malicious ブール値と、confidence スコアが含まれます。detect 関数を呼び出すことによって実行されます。この関数は、DetectionResult オブジェクトを返します。DetectionResult オブジェクトには、is_malicious ブール値と、confidence スコアが含まれます。detect 関数を呼び出すことによって実行されます。この関数は、DetectionResult オブジェクトを返します。DetectionResult オブジェクトには、is_malicious ブール値と、confidence スコアが含まれます。detect 関数を呼び出すことによって実行されます。この関数は、DetectionResult オブジェクトを返します。DetectionResult オブジェクトには、is_malicious ブール値と、confidence スコアが含まれます。detect 関数を呼び出すことによって実行されます。この関数は、DetectionResult オブジェクトを返します。DetectionResult オブジェクトには、is_malicious ブール値と、confidence スコアが含まれます。detect 関数を呼び出すことによって実行されます。この関数は、DetectionResult オブジェクトを返します。DetectionResult オブジェクトには、is_malicious ブール値と、confidence スコアが含まれます。detect 関数を呼び出すことによって実行されます。この関数は、DetectionResult オブジェクトを返します。DetectionResult オブジェクトには、is_malicious ブール値と、confidence スコアが含まれます。detect 関数を呼び出すことによって実行されます。この関数は、DetectionResult オブジェクトを返します。DetectionResult オブジェクトには、is_malicious ブール値と、confidence スコアが含まれます。detect 関数を呼び出すことによって実行されます。この関数は、DetectionResult オブジェクトを返します。DetectionResult オブジェクトには、is_malicious ブール値と、confidence スコアが含まれます。detect 関数を呼び出すことによって実行されます。この関数は、DetectionResult オブジェクトを返します。DetectionResult オブジェクトには、is_malicious ブール値と、confidence スコアが含まれます。detect 関数を呼び出すことによって実行されます。この関数は、DetectionResult オブジェクトを返します。DetectionResult オブジェクトには、is_malicious ブール値と、confidence スコアが含まれます。detect 関数を呼び出すことによって実行されます。この関数は、DetectionResult オブジェクトを返します。DetectionResult オブジェクトには、is_malicious ブール値と、confidence スコアが含まれます。detect 関数を呼び出すことによって実行されます。この関数は、DetectionResult オブジェクトを返します。DetectionResult オブジェクトには、is_malicious ブール値と、confidence スコアが含まれます。detect 関数を呼び出すことによって実行されます。この関数は、DetectionResult オブジェクトを返します。DetectionResult オブジェクトには、is_malicious ブール値と、confidence スコアが含まれます。detect 関数を呼び出すことによって実行されます。この関数は、DetectionResult オブジェクトを返します。DetectionResult オブジェクトには、is_malicious ブール値と、confidence スコアが含まれます。detect 関数を呼び出すことによって実行されます。この関数は、DetectionResult オブジェクトを返します。DetectionResult オブジェクトには、is_malicious ブール値と、confidence スコアが含まれます。detect 関数を呼び出すことによって実行されます。この関数は、DetectionResult オブジェクトを返します。DetectionResult オブジェクトには、is_malicious ブール値と、confidence スコアが含まれます。detect 関数を呼び出すことによって実行されます。この関数は、DetectionResult オブジェクトを返します。DetectionResult オブジェクトには、is_malicious ブール値と、confidence スコアが含まれます。detect 関数を呼び出すことによって実行されます。この関数は、DetectionResult オブジェクトを返します。DetectionResult オブジェクトには、is_malicious ブール値と、confidence スコアが含まれます。detect 関数を呼び出すことによって実行されます。この関数は、DetectionResult オブジェクトを返します。DetectionResult オブジェクトには、is_malicious ブール値と、confidence スコアが含まれます。detect 関数を呼び出すことによって実行されます。この関数は、DetectionResult オブジェクトを返します。DetectionResult オブジェクトには、is_malicious ブール値と、confidence スコアが含まれます。detect 関数を呼び出すことによって実行されます。この関数は、DetectionResult オブジェクトを返します。DetectionResult オブジェクトには、is_malicious ブール値と、confidence スコアが含まれます。detect 関数を呼び出すことによって実行されます。この関数は、DetectionResult オブジェクトを返します。DetectionResult オブジェクトには、is_malicious ブール値と、confidence スコアが含まれます。detect 関数を呼び出すことによって実行されます。この関数は、DetectionResult オブジェクトを返します。DetectionResult オブジェクトには、is_malicious ブール値と、confidence スコアが含まれます。detect 関数を呼び出すことによって実行されます。この関数は、DetectionResult オブジェクトを返します。DetectionResult オブジェクトには、is_malicious ブール値と、confidence スコアが含まれます。detect 関数を呼び出すことによって実行されます。この関数は、DetectionResult オブジェクトを返します。DetectionResult オブジェクトには、is_malicious ブール値と、confidence スコアが含まれます。detect 関数を呼び出すことによって実行されます。この関数は、DetectionResult オブジェクトを返します。DetectionResult オブジェクトには、is_malicious ブール値と、confidence スコアが含まれます。detect 関数を呼び出すことによって実行されます。この関数は、DetectionResult オブジェクトを返します。DetectionResult オブジェクトには、is_malicious ブール値と、confidence スコアが含まれます。detect 関数を呼び出すことによって実行されます。この関数は、DetectionResult オブジェクトを返します。DetectionResult オブジェクトには、is_malicious ブール値と、confidence スコアが含まれます。detect 関数を呼び出すことによって実行されます。この関数は、DetectionResult オブジェクトを返します。DetectionResult オブジェクトには、is_malicious ブール値と、confidence スコアが含まれます。detect 関数を呼び出すことによって実行されます。この関数は、DetectionResult オブジェクトを返します。DetectionResult オブジェクトには、is_malicious ブール値と、confidence スコアが含まれます。detect 関数を呼び出すことによって実行されます。この関数は、DetectionResult オブジェクトを返します。DetectionResult オブジェクトには、is_malicious ブール値と、confidence スコアが含まれます。detect 関数を呼び出すことによって実行されます。この関数は、DetectionResult オブジェクトを返します。DetectionResult オブジェクトには、is_malicious ブール値と、confidence スコアが含まれます。detect 関数を呼び出すことによって実行されます。この関数は、DetectionResult オブジェクトを返します。DetectionResult オブジェクトには、is_malicious ブール値と、confidence スコアが含まれます。detect 関数を呼び出すことによって実行されます。この関数は、DetectionResult オブジェクトを返します。DetectionResult オブジェクトには、is_malicious ブール値と、confidence スコアが含まれます。detect 関数を呼び出すことによって実行されます。この関数は、DetectionResult オブジェクトを返します。DetectionResult オブジェクトには、is_malicious ブール値と、confidence スコアが含まれます。detect 関数を呼び出すことによって実行されます。この関数は、DetectionResult オブジェクトを返します。DetectionResult オブジェクトには、is_malicious ブール値と、confidence スコアが含まれます。detect 関数を呼び出すことによって実行されます。この関数は、DetectionResult オブジェクトを返します。DetectionResult オブジェクトには、is_malicious ブール値と、confidence スコアが含まれます。detect 関数を呼び出すことによって実行されます。この関数は、DetectionResult オブジェクトを返します。DetectionResult オブジェクトには、is_malicious ブール値と、confidence スコアが含まれます。detect 関数を呼び出すことによって実行されます。この関数は、DetectionResult オブジェクトを返します。DetectionResult オブジェクトには、is_malicious ブール値と、confidence スコアが含まれます。detect 関数を呼び出すことによって実行されます。この関数は、DetectionResult オブジェクトを返します。DetectionResult オブジェクトには、is_malicious ブール値と、confidence スコアが含まれます。detect 関数を呼び出すことによって実行されます。この関数は、DetectionResult オブジェクトを返します。DetectionResult オブジェクトには、is_malicious ブール値と、confidence スコアが含まれます。detect 関数を呼び出すことによって実行されます。この関数は、DetectionResult オブジェクトを返します。DetectionResult オブジェクトには、is_malicious ブール値と、confidence スコアが含まれます。detect 関数を呼び出すことによって実行されます。この関数は、DetectionResult オブジェクトを返します。DetectionResult オブジェクトには、is_malicious ブール値と、confidence スコアが含まれます。detect 関数を呼び出すことによって実行されます。この関数は、DetectionResult オブジェクトを返します。DetectionResult オブジェクトには、is_malicious ブール値と、confidence スコアが含まれます。detect 関数を呼び出すことによって実行されます。この関数は、DetectionResult オブジェクトを返します。DetectionResult オブジェクトには、is_malicious ブール値と、confidence スコアが含まれます。detect 関数を呼び出すことによって実行されます。この関数は、DetectionResult オブジェクトを返します。DetectionResult オブジェクトには、is_malicious ブール値と、confidence スコアが含まれます。detect 関数を呼び出すことによって実行されます。この関数は、DetectionResult オブジェクトを返します。DetectionResult オブジェクトには、is_malicious ブール値と、confidence スコアが含まれます。detect 関数を呼び出すことによって実行されます。この関数は、DetectionResult オブジェクトを返します。DetectionResult オブジェクトには、is_malicious ブール値と、confidence スコアが含まれます。detect 関数を呼び出すことによって実行されます。この関数は、DetectionResult オブジェクトを返します。DetectionResult オブジェクトには、is_malicious ブール値と、confidence スコアが含まれます。detect 関数を呼び出すことによって実行されます。この関数は、DetectionResult オブジェクトを返します。DetectionResult オブジェクトには、is_malicious ブール値と、confidence スコアが含まれます。detect 関数を呼び出すことによって実行されます。この関数は、DetectionResult オブジェクトを返します。DetectionResult オブジェクトには、is_malicious ブール値と、confidence スコアが含まれます。detect 関数を呼び出すことによって実行されます。この関数は、DetectionResult オブジェクトを返します。DetectionResult オブジェクトには、is_malicious ブール値と、confidence スコアが含まれます。detect 関数を呼び出すことによって実行されます。この関数は、DetectionResult オブジェクトを返します。DetectionResult オブジェクトには、is_malicious ブール値と、confidence スコアが含まれます。detect 関数を呼び出すことによって実行されます。この関数は、DetectionResult オブジェクトを返します。DetectionResult オブジェクトには、is_malicious ブール値と、confidence スコアが含まれます。detect 関数を呼び出すことによって実行されます。この関数は、DetectionResult オブジェクトを返します。DetectionResult オブジェクトには、is_malicious ブール値と、confidence スコアが含まれます。detect 関数を呼び出すことによって実行されます。この関数は、DetectionResult オブジェクトを返します。DetectionResult オブジェクトには、is_malicious ブール値と、confidence スコアが含まれます。detect 関数を呼び出すことによって実行されます。この関数は、DetectionResult オブジェクトを返します。DetectionResult オブジェクトには、is_malicious ブール値と、confidence スコアが含まれます。detect 関数を呼び出すことによって実行されます。この関数は、DetectionResult オブジェクトを返します。DetectionResult オブジェクトには、is_malicious ブール値と、confidence スコアが含まれます。detect 関数を呼び出すことによって実行されます。この関数は、DetectionResult オブジェクトを返します。DetectionResult オブジェクトには、is_malicious ブール値と、confidence スコアが含まれます。detect 関数を呼び出すことによって実行されます。この関数は、DetectionResult オブジェクトを返します。DetectionResult オブジェクトには、is_malicious ブール値と、confidence スコアが含まれます。detect 関数を呼び出すことによって実行されます。この関数は、DetectionResult オブジェクトを返します。DetectionResult オブジェクトには、is_malicious ブール値と、confidence スコアが含まれます。detect 関数を呼び出すことによって実行されます。この関数は、DetectionResult オブジェクトを返します。DetectionResult オブジェクトには、is_malicious ブール値と、confidence スコアが含まれます。detect 関数を呼び出すことによって実行されます。この関数は、DetectionResult オブジェクトを返します。DetectionResult オブジェクトには、is_malicious ブール値と、confidence スコアが含まれます。detect 関数を呼び出すことによって実行されます。この関数は、DetectionResult オブジェクトを返します。DetectionResult オブジェクトには、is_malicious ブール値と、confidence スコアが含まれます。detect 関数を呼び出すことによって実行されます。この関数は、DetectionResult オブジェクトを返します。DetectionResult オブジェクトには、is_malicious ブール値と、confidence スコアが含まれます。detect 関数を呼び出すことによって実行されます。この関数は、DetectionResult オブジェクトを返します。DetectionResult オブジェクトには、is_malicious ブール値と、confidence スコアが含まれます。detect 関数を呼び出すことによって実行されます。この関数は、DetectionResult オブジェクトを返します。DetectionResult オブジェクトには、is_malicious ブール値と、confidence スコアが含まれます。detect 関数を呼び出すことによって実行されます。この関数は、DetectionResult オブジェクトを返します。DetectionResult オブジェクトには、is_malicious ブール値と、confidence スコアが含まれます。detect 関数を呼び出すことによって実行されます。この関数は、DetectionResult オブジェクトを返します。DetectionResult オブジェクトには、is_malicious ブール値と、confidence スコアが含まれます。detect 関数を呼び出すことによって実行されます。この関数は、DetectionResult オブジェクトを返します。DetectionResult オブジェクトには、is_malicious ブール値と、confidence スコアが含まれます。detect 関数を呼び出すことによって実行されます。この関数は、DetectionResult オブジェクトを返します。DetectionResult オブジェクトには、is_malicious ブール値と、confidence スコアが含まれます。detect 関数を呼び出すことによって実行されます。この関数は、DetectionResult オブジェクトを返します。DetectionResult オブジェクトには、is_malicious ブール値と、confidence スコアが含まれます。detect 関数を呼び出すことによって実行されます。この関数は、DetectionResult オブジェクトを返します。DetectionResult オブジェクトには、is_malicious ブール値と、confidence スコアが含まれます。detect 関数を呼び出すことによって実行されます。この関数は、DetectionResult オブジェクトを返します。DetectionResult オブジェクトには、is_malicious ブール値と、confidence スコアが含まれます。detect 関数を呼び出すことによって実行されます。この関数は、DetectionResult オブジェクトを返します。DetectionResult オブジェクトには、is_malicious ブール値と、confidence スコアが含まれます。detect 関数を呼び出すことによって実行されます。この関数は、DetectionResult オブジェクトを返します。DetectionResult オブジェクトには、is_malicious ブール値と、confidence スコアが含まれます。detect 関数を呼び出すことによって実行されます。この関数は、DetectionResult オブジェクトを返します。DetectionResult オブジェクトには、is_malicious ブール値と、confidence スコアが含まれます。detect 関数を呼び出すことによって実行されます。この関数は、DetectionResult オブジェクトを返します。DetectionResult オブジェクトには、is_malicious ブール値と、confidence スコアが含まれます。detect 関数を呼び出すことによって実行されます。この関数は、DetectionResult オブジェクトを返します。DetectionResult オブジェクトには、is_malicious ブール値と、confidence スコアが含まれます。detect 関数を呼び出すことによって実行されます。この関数は、DetectionResult オブジェクトを返します。DetectionResult オブジェクトには、is_malicious ブール値と、confidence スコアが含まれます。detect 関数を呼び出すことによって実行されます。この関数は、DetectionResult オブジェクトを返します。DetectionResult オブジェクトには、is_malicious ブール値と、confidence スコアが含まれます。detect 関数を呼び出すことによって実行されます。この関数は、DetectionResult オブジェクトを返します。DetectionResult オブジェクトには、is_malicious ブール値と、confidence スコアが含まれます。detect 関数を呼び出すことによって実行されます。この関数は、DetectionResult オブジェクトを返します。DetectionResult オブジェクトには、is_malicious ブール値と、confidence スコアが含まれます。detect 関数を呼び出すことによって実行されます。この関数は、DetectionResult オブジェクトを返します。DetectionResult オブジェクトには、is_malicious ブール値と、confidence スコアが含まれます。detect 関数を呼び出すことによって実行されます。この関数は、DetectionResult オブジェクトを返します。DetectionResult オブジェクトには、is_malicious ブール値と、confidence スコアが含まれます。detect 関数を呼び出すことによって実行されます。この関数は、DetectionResult オブジェクトを返します。DetectionResult オブジェクトには、is_malicious ブール値と、confidence スコアが含まれます。detect 関数を呼び出すことによって実行されます。この関数は、DetectionResult オブジェクトを返します。DetectionResult オブジェクトには、is_malicious ブール値と、confidence スコアが含まれます。detect 関数を呼び出すことによって実行されます。この関数は、DetectionResult オブジェクトを返します。DetectionResult オブジェクトには、is_malicious ブール値と、confidence スコアが含まれます。detect 関数を呼び出すことによって実行されます。この関数は、DetectionResult オブジェクトを返します。DetectionResult オブジェクトには、is_malicious ブール値と、confidence スコアが含まれます。detect 関数を呼び出すことによって実行されます。この関数は、DetectionResult オブジェクトを返します。DetectionResult オブジェクトには、is_malicious ブール値と、confidence スコアが含まれます。detect 関数を呼び出すことによって実行されます。この関数は、DetectionResult オブジェクトを返します。DetectionResult オブジェクトには、is_malicious ブール値と、confidence スコアが含まれます。detect 関数を呼び出すことによって実行されます。この関数は、DetectionResult オブジェクトを返します。DetectionResult オブジェクトには、is_malicious ブール値と、confidence スコアが含まれます。detect 関数を呼び出すことによって実行されます。この関数は、DetectionResult オブジェクトを返します。DetectionResult オブジェクトには、is_malicious ブール値と、confidence スコアが含まれます。detect 関数を呼び出すことによって実行されます。この関数は、DetectionResult オブジェクトを返します。DetectionResult オブジェクトには、is_malicious ブール値と、confidence スコアが含まれます。detect 関数を呼び出すことによって実行されます。この関数は、DetectionResult オブジェクトを返します。DetectionResult オブジェクトには、is_malicious ブール値と、confidence スコアが含まれます。detect 関数を呼び出すことによって実行されます。この関数は、DetectionResult オブジェクトを返します。DetectionResult オブジェクトには、is_malicious ブール値と、confidence スコアが含まれます。detect 関数を呼び出すことによって実行されます。この関数は、DetectionResult オブジェクトを返します。DetectionResult オブジェクトには、`is_m```bash
python -m detector --audit --events evidence/vulnerable-persistence.jsonl