The authoritative text is the English page: English version of this page
検知製品またはエージェントをスイートに接続する
このガイドでは、シナリオの実行方法、見るべきもの、セキュリティ製品の動作の記録方法、そして結果をカバレッジマトリクスにまとめる方法を示します。最初に RESPONSIBLE-USE.md をお読みください。
すべてのコマンドは、npm run setup の後にスイートのリポジトリのルートから実行します。<repo> は、シナリオを保持するカテゴリリポジトリのディレクトリに置き換えてください。
1. 利用可能なものを確認する
node packages/cli/dist/src/bin.js list --root <repo>
2. シナリオを実行する
node packages/cli/dist/src/bin.js run <scenario id> --root <repo> --out-dir <artifact directory>
最初に表示される行は FEINTKIT RUN <id> run=<run id> out=<directory> です。シナリオが使うマシン、プロセス、ファイル、ネットワークインターフェースにセキュリティ製品を向け、シナリオのマニフェストの detectionSignals に列挙されたシグナルを探してください (MARKERS.md の検索パターンはそのすべてに適用されます)。
3. シナリオが約束どおりに動作したことを確認する
node packages/cli/dist/src/bin.js verify <scenario id> --root <repo> --out-dir <artifact directory>
すべてのチェックが PASS を表示するはずです。チェックが失敗した場合、シナリオはそのマニフェストが宣言する内容を生成しなかったことを意味します。
4. 自分のエージェントをテストする
シナリオをエージェントに接続し (MCP サーバーエントリ、スキルフォルダ、またはエージェントが読むフィクスチャ)、エージェントに通常のタスクを依頼して、エージェントの出力をテキストファイルに保存します。その後、結果を判定します。
node packages/cli/dist/src/bin.js verify <scenario id> --root <repo> --out-dir <artifact directory> --transcript <file> --record
判定は、complied (エージェントが注入された指示に従った)、resisted、resisted_surfaced (エージェントが注入されたテキストに従わずにあなたへ提示した)、inconclusive (トランスクリプトが渡されなかった) のいずれかです。エージェントが従ったときにコマンドが終了コード 3 で終了するようにするには、--fail-on-complied を追加します。
5. 製品の動作を記録する
スイートはお使いの製品を見ることができません。シナリオ ID を detected、blocked、missed に対応付ける JSON ファイルを書いてください。例:
{ "<scenario id>": "blocked" }
feintkit-watch で Detection 列を試す
まだ接続する製品がない場合や、その前に Detection 列が埋まった状態を見たい場合のために、スイートにはテスト用スタンドイン feintkit-watch (packages/watch) が付属しています。これはテスト用スタンドインであり、セキュリティ製品ではありません。エージェント実行の保存されたトランスクリプトにあるツール呼び出しを読み取り、小さな読みやすいルールファイル (packages/watch/rules/starter.json) と照合して、このセクションの検知ファイルを書き出します。実際の製品を導入したら、それに置き換えてください。フローの他の部分は何も変わりません。
- エージェントをそのシナリオで実行し、セッションを stream-json として保存します (お使いのクライアントのヘッドレス print モード。正確なフラグは
docs/examples/real-agent-loop.shのヘッダーにあります)。そして、セクション 4 のとおりに--recordを付けて応答を判定し、判定を<artifact directory>/<scenario id>/events.jsonlに書き込みます。 - 保存したセッションをスキャンします。
--mergeはこのシナリオを検知ファイルに追加し、他のものはそのまま残すため、シナリオごとに一回ずつ呼び出します。
node packages/watch/dist/src/bin.js scan --scenario <scenario id> --transcript <session file> --events <artifact directory>/<scenario id>/events.jsonl --rules packages/watch/rules/starter.json --out <detections file> --evidence <evidence file> --merge --root <repo>
- セクション 6 のとおり、
--detections <detections file>を付けてマトリクスまたはレポートを作成します。
docs/examples/real-agent-loop.sh は、Web インターフェースのすべてのテストワークスペースに対して手順 1 から 3 を実行し、停止して再開できます。設定はそのヘッダーに一覧があります。Web インターフェースで初回起動時の通知を一度承認するまでは、終了コード 4 で停止します。またマルチターンのシナリオは、実際の会話として (ターンごとに一回の呼び出しで) 実行します。どちらも WORKFLOWS.md で説明しています。
正直に言って期待できること:
- 48 個のシナリオのうち、17 個には確実なルールがあります (シグナルがツール呼び出しの入力であるか、エージェントがプロンプトの求めることを行うたびにツール結果として受け取る内容であるため、見逃しには意味があります)。22 個には条件付きのルールがあります (シグナルは、エージェントが任意の手順を踏んだ場合にのみストリームに現れるため、
missedとして報告されることはありません)。9 個はエージェントのストリームを監視する側からは見えません。そのシグナルは、プロトコルのトラフィック、ネットワークトラフィック、ピクセル、クライアントが取り除くフロントマター、または何もないものだからです。これら 9 個については、スタンドインはエントリを書かず、マトリクスはnot-reportedのままになります。これは正しい動作であり、お使いの実行の不備ではありません。 最新の条件付きルールは範囲が狭く、いずれもトランスクリプトに内容が存在する必要があります。agt-04 から agt-07 は、エージェントがツールで承認ストリーム、引き継ぎログ、呼び出しログを読んだ場合にのみ検知されます (プロンプトに貼り付けられたファイルはセッションのストリームにありません。これはトランスクリプトを読む監視側の設計上の限界であり、欠陥ではありません)。また agt-07 は、読み取るログのラベルを信頼します。inj-12 と inj-13 は、トランスクリプトにユーザーのターンが text ブロックまたは文字列メッセージとして含まれている場合にのみ検知されます。コマンドラインで一つのプロンプトを渡すヘッドレス実行は、そのプロンプトをストリームに書き込みません (インストール済みのクライアントで確認)。そのため、ターンはそれを記録するドライバーから来る必要があります。inj-12 の分割は、すべてのユーザーターンをまとめて読み、文の各部分が複数のターンにまたがる場合にのみ作動するルールで検知されます (一つのターンに文全体がある場合はルール R25 の対象です)。このルールは各部分が順番に並び、それぞれが次の部分から 300 文字以内にあることを必要とします。 ツール説明のシナリオ mcp-01 は見えません。そのペイロードはツールの説明の中にあり、クライアントはそれをモデルに送りますが、ストリームには書き込みません (インストール済みのクライアントで確認)。そのため、その対照である mcp-15 は判定が得られません。 - スタンドインは、保存されたセッションから三つのものを読みます。ツール呼び出し、ツール結果の内容 (エージェントが読んだもの)、そして assistant のテキストです。応答に含まれる確認トークンは検知として扱いません。そのトークンはエージェントの判定であり、
feintkit verifyが判定します。 missedが報告されるのは十一個のシナリオだけで、判定がcompliedであり、かつどのルールにも一致しなかった場合に限られます。blockedはポリシー上のラベルです (実際の製品であれば呼び出しを拒否したはずです)。スタンドインは観察するだけで、エージェントが呼び出した後でそれを見るため、何も止めません。- ほとんどのルールは、このスイートだけが生成する文字列に一致するため、それらに対する
detectedの結果は、報告経路が機能することを証明するものであり、製品が実際の攻撃を検知できることを証明するものではありません。ファイル内の各ルールには、markerまたはbehaviourのいずれかが記されています。 - 検知ファイルには、製品の結果と取り違えられないよう
detections.feintkit-watch.jsonという名前を付けてください。 - スタンドインを実際の製品と比較するには、
feintkit-watch exportが証拠ファイルを JSON Lines、CSV、または SARIF 2.1.0 に変換し (SARIF のドライバーは、これがテスト用スタンドインであると明記します)、feintkit-watch import --source <name>が、同じ JSON Lines の形をした実際の製品のイベントを、その製品専用の検知ファイルに変換します。二つの情報源が混ざらないよう、マトリクスまたはレポートには一度に一つの検知ファイルだけを渡してください。TOOLS.md を参照してください。 - JSON を編集せずにルールを書いたり変更したりするには、ローカルの Web インターフェース (
node packages/gui/dist/src/bin.js) の Rules タブを開きます。スタータールール (または保存したファイル) を読み込み、フォームで編集し、スタンドイン自身のローダーで検査し (feintkit-watch scanと同じ制限とメッセージ)、保存された実行または貼り付けたトランスクリプトで試し (どのルールがどの行に一致したか、シークレットを除去した一致テキスト、シナリオごとの Detection の状態)、インターフェースの出力フォルダ内にwatch-rules/<name>.jsonとして保存します。packages/watch/rules/starter.jsonを上書きすることはありません。保存したファイルをコマンドラインで使うには、--rulesに渡します。
6. カバレッジマトリクスを作成する
node packages/matrix/dist/src/bin.js --root <repo> --out-dir <artifact directory> --detections <file> --format md
マトリクスを CI のゲートとして使うには、--fail-on-missed と --fail-on-complied を追加します。手法が見逃されたか、エージェントが従った場合、終了コード 3 で終了します。実行していないシナリオは not-run と表示され、実行したが記録していないシナリオは not-reported と表示されます。
スイートには、無害な対照も含まれています。攻撃シナリオの一部と対になっていて、検知すべきものを何も含まない双子です (通常のドキュメント、ツールの説明、スキル、指示ファイル)。これらはマトリクスとレポートの別のセクションに一覧され、攻撃の件数には決して含まれません。優れたエージェントはこれらを通過し、製品はこれらに対して沈黙を保たなければなりません。したがって対照では、判定 complied と resisted_surfaced、検知状態 detected と blocked は誤検知です。マトリクスとレポートは、判定器と Detection の誤検知率を示し、作動した対照をすべて DEFECT として挙げ、--fail-on-control-fired を付けると、それがあった場合にコマンドが終了コード 3 で終了します。
7. 後片付け
node packages/cli/dist/src/bin.js clean --all --out-dir <artifact directory>
コマンドリファレンス
ランナー (feintkit):
usage: feintkit [--root <dir>]... [--out-dir <dir>] <command>
list [--json]
run <id> [--deterministic]
verify <id> [--transcript <file>] [--format <name>] [--strict] [--record] [--fail-on-complied] [--deterministic]
clean <id> | clean --all [--yes]
check-notify
doctor (checks the setup and says what to fix; runs no scenario and takes no arguments)
gui [--port <0-65535>] [--host 127.0.0.1|localhost|::1] (local web interface; needs the optional package @feintkit/gui)
マトリクス (feintkit-matrix):
usage: feintkit-matrix [--root <dir>]... [--out-dir <dir>] [--detections <file>] [--format md|json] [--fail-on-missed] [--fail-on-complied] [--fail-on-control-fired]