自律型攻撃用LLMエージェントのための決定論的ハーネス兼ハンドブックであり、認可・スコープ・証跡ゲートを強制することで、再現可能かつ誠実なペネトレーションテストを保証します。
自律型攻撃エージェントのための決定的ハーネス。モデルは確率的なままである。ホストアプリケーションが認可、許可されたアクション、証拠記録、受理を所有する。凍結された入力とポリシーの再生は、それらの制御決定を再現できるが、ライブターゲットやモデルの応答を再現可能にするものではない。
python3 -m pip install -r requirements.txt
python3 -m harness.demo --out /tmp/harness-report.json
diff -u harness/report.json /tmp/harness-report.json
python3 -m pytest tests/test_harness.py
このリリースは CPython 3.14 で検証されている。それ以前の Python バージョンはリリース証拠の一部ではない。それを使用する場合は、結果に依存する前に以下の完全なゲート・シーケンスを実行すること。
段階的に構築する: 境界 を副作用境界とステージ順序に設定する; 記述 を測定された事実とカタログを通じてターゲットに対して行う; 証明 をキャプチャと独立したポリシー述語を通じて主張に対して行う; 制御と説明 を認可、ゲート、完了、省略された作業に対して行う。開発順序は実行時順序ではない: 認可とゲートはディスパッチに先行する。
公開ラボはネットワーク要求を行わず、モデルも呼び出さない。その証明述語は合成的であり、そのホストとアダプタは信頼されており、すべての所見は人間によるレビューを必要とするものとしてマークされている。ラボは個人の受理やレポート署名ワークフローを実装していない。逐語的な引用は引用の完全性を確立するが、悪用可能性は確立しない。モデル呼び出しの削減と手戻りの削減は設計目標であり、コーパスによって測定された節約ではない。
以下の章は、以前の core/ および walkthrough/ 実装とその公開された欠陥を説明している。それらの欠如したモデル呼び出し検証器は、その歴史的経路には依然として存在しない。新しい harness/ パッケージは別個のオフライン制御リファレンスであり、コーパスや歴史的モジュールを遡及的に修復するものではない。歴史的コンポーネントをコピーする前に、第07章の境界と修正を読むこと。
有能なモデルをホストに向け、ツールボックスを渡し、ペネトレーションテストを実行するように指示すると、それは何か賢明なことを行う。明日もう一度実行すると、別の賢明なことを行い、どちらの実行も、もう一方が捕捉したものをなぜスキップしたのかを説明できない。このハンドブックは、モデルにより小さな仕事を割り当てることを主張する: すべての決定を、それを正しく行える最も安価な層に与え、モデルの容量は、答えが既に持っているものから導出できない場合にのみ使う。テーブルが行える決定からモデルが必要な少数の決定までのその順序付けが、第00章のタイトルの勾配である。各章は、動作する攻撃的セキュリティエージェントと、その失敗が要求した制御に従う。
歴史的システムには2つのオーケストレーション経路がある。サーバー駆動経路では、オーケストレータが独自のフェーズリストを保持し、そのフェーズが許可するツールのみをモデルに提供する。エージェント駆動経路では、オーケストレーティングモデルが実行を計画し、ツールを自ら呼び出し、その下の層は構築されるが常に参照されるわけではない。共有書き込み経路により、記録されたアクションと所見はレビュー可能になるが、利用可能なシェルはそれを迂回できる。発明されたエンドポイントは、自動的な脆弱性判定ではなく、捕捉された応答を得る。深刻度ガバナーは引き上げることができず、別個の検証器の歴史的な引き上げゲートは引用をチェックするが、悪用可能性を確立しない。認可は、すべての発信要求ではなく、ツール境界で要求される。報告章は、何も見つからなかったスキャンと、入り口で拒否されたスキャンを区別する。意図と執行の間のそれらの違いはケーススタディの一部であり、新しいハーネスにコピーする性質ではない。
最初の章以降のすべての章は、その制御がまだ何を間違えているかを認めて終わり、正直さセクションはそれを示す測定値を運ぶ。残りを信頼するかどうかを決める場合は、最初に正直さセクションを読むこと: コーパスは1つのシステムの運用履歴であり、選択された公開ターゲット実行は著者記録の集計であり、その隣に2つの除外された実行が公開されており、決定的層が実際にどれだけ貢献するかを示すアブレーション研究は実行されていない。リポジトリには、選択された実行の生の所見、グラウンドトゥルース、またはマッチャーが含まれていないため、記録された精度はここで独立して再現可能ではない。設計論は測定ではなく議論されており、第05章はその言葉でそれを述べている。
第00章で正典化され、ここにコピーされている。それぞれが設計意図であり、法則の最後に名前が付けられた章は、このシステムがそれに対して保持される場所である: どの部分が構築によって保持され、どの部分が2つのオーケストレーション経路のうち1つだけで保持され、どの部分がオーケストレータの良好な動作に依存し、どの部分がまだ保持されていないか。
モデルが提案し、決定的コードが処分する。 モデルに、ターゲットへの直接アクセス、生のストレージ、または深刻度に関する最終決定権ではなく、提案インターフェースを与える。決定的コードは、承認された作業を検証、実行、記録する。歴史的システムはその境界をどこでも強制していない: 両方のオーケストレータがシェルに到達でき、その書き込み経路は実行なしで所見を保存するサブコマンドを運ぶ。発明されたエンドポイントは404、ログインページ、またはアプリケーションシェルを返す可能性がある; 応答を記録し、主張を別々に判断する。共有ライターはサンドボックスではない。第01章および第02章。
過去についての主張は引用しなければならない。未来についての提案は実行しなければならない。 これらは異なる種類のステートメントであり、異なるゲートが必要である。既に観察されたものについての主張は、それ自身のキャプチャを引用しなければならない; 一致する引用は引用の完全性を確立するが、結論が真であることを確立しない。歴史的ゲートは漏れる: 何も通過しなくてもバッチごとにアイテムを保持し、1つのオーケストレーション経路では、呼び出し元が提供する信頼度がチェックの代わりになることができる。提案されたテストは、それが行っていない観察を引用することで検証できない。それは、認可、スコープ、ゲート、予算チェックが許可した後にのみ実行でき、その結果は依然として解釈を必要とする。法則はすべての提案を実行する許可ではない。第02章。
深刻度はデフォルトで下がり、証明に対してのみ上がる。 決定的ガバナーは深刻度を下げたり所見を誤検知とマークしたりでき、上げることはできない。それはその権限を制限するが、その結論を正しくするものではない。過少報告は実際の脆弱性を隠す可能性があるため、すべての引き下げルールはマッチングと反例テスト、およびレビュー可能な理由を必要とする。歴史的な引き上げエンドポイントは逐語的な引用をチェックするが、その契約が要求する作成されたスコアを強制しない。引用だけでは悪用可能性の証明ではない。キャプチャを所見にバインドし、レビューされたドメイン証明ポリシーを適用し、別個の人間によるレビューと署名プロセスを保持する。第03章。
スコープは関数であり、文ではない。 プロンプトに書かれた認可は、コンテキストウィンドウ内の他のすべての指示と競合する。オペレーターの許可をレビュー可能なポリシーとしてエンコードし、すべての発信アクションの前にそれを強制し、拒否の記録を保持する。歴史的ガードは不十分である: それはすべての要求ではなくツール境界で要求され、いくつかのホスト境界を広げ、キルスイッチの下またはターゲットなしで構築された場合にフェイルオープンする。ラボは信頼されたコールバックの前にリストにないオリジンを拒否するが、トランスポート封じ込めは依然としてアダプタに属する。ポリシー決定は、それが評価する認可と宛先と同じくらいのみ正しい。第04章。
行わなかったことを報告する。 何も見つからなかったスキャンと、何にも到達できなかったスキャンは異なるスキャンであり、それらを同一にレンダリングするレポートは省略によって嘘をついている。カバレッジ、ゲートステータス、および理由付きでスキップされたすべてのホストの台帳は、所見の隣の成果物に属する。これは歴史的レポートが満たさなかった要件である: カバレッジのみが到着し、その最も弱い分母に対して計算され、異なるものを命名するラベルの下にあった。ラボは、計画されたツールおよびURLアクション、実行された作業、エラー、スキップを説明する; その分母は脆弱性カバレッジを測定しない。第05章。
| 章 | 主題 |
|---|---|
| 第00章: 決定性勾配 (ソース) | なぜ分散が能力問題ではなく設計問題なのか、4つの層、そして五つの法則 |
| 第01章: 固定手順 (ソース) | ステージマシン、決定的ツールスコアリング、ファイル内のカウンタとしての事前分布、そしてあなたが望むことを言わないターン比率 |
| 第02章: 狭いウエスト (ソース) | 副作用ごとに1つのライター、スキーマ検証と修復ループ、そしてなぜ主張と提案が異なるゲートを必要とするのか |
| 第03章: 非対称信頼 (ソース) | エスカレートできないガバナー、証明に対してのみ引き上げられる検証器、そして証明できない攻撃チェーン |
| 第04章: コードとしてのスコープ (ソース) | 関数としての認可、スキップ台帳、どの関数も決定すべきでないフロア、そして選択された実行に記録されたスコープギャップ |
| 第05章: スキャンが到達できなかったもの (ソース) | 記録された値としての到達可能性、カバレッジ分母、統合、正直な部分結果、そして自分のシステムを評価する方法 |
| 第06章: 自分で構築する (ソース) | 順序付きマニュアル: 各ステップが保護する不変条件を述べ、公開ツリーがそれらを運ぶ場所には執行ファイル、テスト、コミットされた成果物を命名する |
| 第07章: ハーネス・ラボ () |
core/ の下の歴史的コードは、読まれ、実行され、異議を唱えられるためにここにある。それはクリーンルームであり、ライブテスターとして意図的に非機能的である: プロファイリング、関連性スコアリング、スケジューリング、ツール呼び出し検証は実際に実行可能であり、ワイヤーにパケットを置くものはすべて差し控えられている。ls core/*.py を実行して、ここに書かれた数値を信頼するのではなく、何が同梱されているかを確認すること。これはモジュールが追加された瞬間に古くなる種類の主張である。後の章が依存する制御はそれらの中にある: 書き込み経路は core/store_protocol.py、深刻度ガバナーは core/severity_governor.py、スコープガードは core/scope_guard.py、ゲートチェックは core/gate_check.py、ステージマシンは walkthrough/run.py である。歴史的なモデル呼び出し検証器は差し控えられている。第06章がそれを指定する; 第07章は別個の決定的証拠ガードを同梱するが、その検証器でも人間の受理ワークフローでもない。それらの仕事を分離しておくこと: グラウンディング批評家は引用封じ込めをチェックし、ガバナーは深刻度を制限し、引き上げ経路は独立してレビューされた証明ポリシーを満たさなければならない。それらのどれも人間のレビューと署名を置き換えない。
walkthrough/ は、コミットされたフィクスチャ上でそのステージマシンを駆動し、章が引用する成果物を walkthrough/artifacts/ に書き込む。python3 -m walkthrough.run でそれらを再生成する。これは、コミットされたコピーに触れたくない場合は --out ディレクトリを受け取り、tests/test_walkthrough_is_in_sync.py は新しいインメモリ実行をそれらのコピーとバイト単位で比較するため、再実行なしで編集されたフィクスチャは出荷される代わりに赤くなる。そのゲートが捕捉しないのは、両方の場所で間違っている成果物であり、その独自のdocstringがそれを述べている。
すべての章のすべての数字は data/stats.json のキーに解決されるか、またはその数字が何であるか、なぜターゲットから取られた測定ではないかを命名する注釈を運ぶ。第00章から第05章およびこのREADME全体で、13の注釈がコードの定数またはプロパティを命名し、35が数字チェックが読めない綴られた数量をカバーし、5がHTTPステータスコードを命名し、1がこのリポジトリ自身の公開されたスナップショットの2つ間の比較を命名する。統計ファイルは公開されたウィンドウを持つ凍結されたスナップショットであり、ライブクエリではなく、第05章はパイプラインを再実行してもそれを再現しない理由を説明する。
第05章は、公開された意図的に脆弱なアプリケーションに対するシステムのF1を報告し、それをOWASP ZAPパッシブスキャンスコアの隣に置く。このリポジトリは算術を証明し、4つの集計スコアファイルを data/stats.json と同期させておく; それは、2つのツールが管理されたヘッドツーヘッドで評価されたことを証明するために必要な生の所見、グラウンドトゥルースエントリ、マッチャー、ターゲット識別子、実行識別子を含まない。そのペアを、公正なベンチマークではなく、歴史的で著者記録のデータポイントとして扱うこと。サンプルサイズ、それがしたがって報告しない広がり、およびそれぞれが除外された理由とともに除外された実行はすべてその章にある。
章の生成コピーは、すべての数字がその場で値に解決され、すべてのコード引用が core/ へのリンクに変えられ、レンダリングされたツリー にあり、GitHubでの読書用である; それは scripts/render.py によって生成され、tests/test_rendered_is_in_sync.py によってソースと歩調を合わせて保たれる。
リポジトリを公開する場合は、PUBLICATION.md に従うこと。履歴のないスナップショットを新しい公開リポジトリに公開する; 開発リポジトリの可視性を変更せず、クリーンな作業ツリーが到達可能なGit履歴をクリアしたと想定しないこと。必須のpre-commit scripts/publication_gate.sh は、プライベートなdenylistが実際にマージされ、公開Git著者IDが承認された値と一致し、ステージングリポジトリに以前のrefs、オブジェクト、またはreflogsがない限り、公開を拒否する。
scripts/audit.sh は識別子についてリポジトリをスイープし、scripts/prose_check.sh と scripts/verify_claims.sh は散文をスイープし、tests/test_gates.sh はそれらに対して違反を植え付けてまだ発火することを証明し、テストスイートは章がそれについて述べることに対してリファレンス実装を保持する。章は、以下のそれぞれが合格するまで完了しない:
python3 -m pip install -r requirements.txt
# pytest、そしてそれ以外は何もない: core/ の下の
# すべてのモジュールは標準ライブラリのみ
export HANDBOOK_ROOT=.
bash scripts/audit.sh . # 常に公開されたパターン; 雇用主、クライアント、
# ホストdenylistは存在する場合のみ、そしてその
# ファイルはプライベートなので、どのクローンもそれを
# 運ばない。どの半分が実行されたかは、この出力の
# "sanitization scope:" 行にあり、終了ステータスには
# ないので、その行を読むこと
./scripts/prose_check.sh handbook # 機械的なAIの兆候
./scripts/verify_claims.sh handbook # 引用、引用されていない数字、相互参照、
# 主張アンカー、ソース帰属
./scripts/prose_check.sh README.md # 両方のゲートはターゲットを取り、デフォルトで handbook/ に、
./scripts/verify_claims.sh README.md # なのでこのファイルはチェックされるために名前を
# 付けられなければならない
./tests/test_gates.sh # 植え付けられた違反に対するゲート、ツリー、
# README、章の主張; 章自身の散文は上記の
# handbook を対象とした散文および主張ゲートによって
# カバーされ、このスイープによってではない
python3 -m pytest tests/ # スイート全体、そしてそれはここに書かれた数ではなく
# 独自のカウントを出力する。上記の各行はゲート
# スクリプトとそれらが配線するpytestファイルを実行する。
# これはこの文書に関するもの; 五つの法則が
# 対象とする制御のテスト -- 深刻度ガバナー、スコープ
# ガード、ゲートチェック、共有書き込み経路、
# グラウンディング批評家 -- はこの行と上記の何にも
# よって到達される。それらの1つの破損は、コミットされた
# walkthrough成果物も動かす場合にのみ上記の行を
# 赤くする
tests/test_chapter_claims.py は、そのスイート内で、盗む価値があるものである。それはリファレンス実装と公開された統計に対するアサーションを保持し、それぞれがそれが裏付ける逐語的な文にアンカーされているため、事実を変更する編集は静かに出荷される代わりにテストに失敗する。
テオドロス・ムテシディス
| 推奨されるオフラインリファレンス: 境界を強制し、完全なレポートを検査し、拒否されなければならないものをテストする |
| 付録A: オーケストレータ契約 (ソース) | モデルに渡される計器。プライベートなオリジナルから汎用化されたもの |
| 付録B: スキーマ (ソース) | ツール呼び出し、所見、ガバナンスレコードの形状。それぞれが保証するものと保証しないもの |
| 付録C: 失敗博物館 (ソース) | 根本原因とそれぞれを殺すルールを持つ実際の誤検知、およびこのリポジトリが固定できるもののうちどれか |