
keyhog v0.5.73-action
Rust製のオープンソースシークレットスキャナー
ウェブサイト · ドキュメント · アーキテクチャ · Vyre GPUエンジン
KeyHog: コード、クラウド、CI向けGPUアクセラレーション対応シークレットスキャナ
KeyHogはRust製のオープンソースシークレットスキャナで、ソースコード、Git履歴、コンテナ、クラウドストレージ、ブラウザ資産、コラボレーションコンテンツ、稼働中のシステムから漏洩したAPIキー、トークン、パスワード、認証情報を検出・検証します。
ほとんどのシークレットスキャナは、リポジトリチェックアウト内のCPU正規表現マッチで止まります。KeyHogは 926のサービス別検出器、隠された認証情報を対象としたデコード透過、コンテキストを認識した信頼度・抑制、ライブプロバイダ検証、そしてVyreによるファーストクラスのCUDA、Metal、WGPU実行を組み合わせています。キャリブレーションは、対象となるすべての純Rust CPU、Hyperscan/SIMD、GPUバックエンドを測定します。その後、自動ルーティングは、特定のホストとワークロードクラスに対して、同等性が実証された最速の経路を使用します。
| GPUは本物のバックエンド | 実際の攻撃対象領域をスキャン | ノイズからシグナルを分離 | 結果に基づいて行動 |
|---|---|---|---|
| CUDA、ネイティブMetal、WGPUは、静かなフォールバックチェーンではなく、測定された同等のバックエンドです。 | Git履歴、Dockerレイヤー、アーカイブ、クラウドバケット、ソースマップ、WASM、HARキャプチャ、ホスト型Gitコレクション、システム全体をスキャンします。 | 信頼度、例の抑制、ベースラインを適用する前に、base64、hex、URL、protobuf、複数行、構造化設定をデコードします。 | 対象となる認証情報をプロバイダAPIで検証し、SARIFまたは構造化エンベロープを出力し、正確なカバレッジと終了セマンティクスを維持します。 |
| cargo install --locked keyhog | |||
| keyhog scan . |
<p align="center">
<img src="https://assets.kitploit.com/production/public/readmes/7654/dfb768a9b8e8fa64082992f11d0b284d5ec6a199fc1eac85e0352fb20452186f.gif" alt="重大度、信頼度、ファイルと行、修復、結果、およびカバレッジステータスを示すKeyHogスキャン" width="900" />
</p>
## GPUを中心に構築されたシークレットスキャナ
KeyHogは、いくつかの正規表現を汎用コンピュートシェーダーに渡すだけではありません。
GPUパスは、KeyHogと並行して開発されたRust GPUコンピュート基盤である[Vyre](https://github.com/santhreal/vyre)上に構築されています。検出トリガーは、イミュータブルなGPU常駐テーブルにコンパイルされます。制限付きソースバッチは、CPUおよびHyperscanルートで使用されるのと同じ確認、抑制、信頼度、レポートパイプラインに対して、完全なマッチ位置を生成します。
- **3つの物理GPUピア。** CUDA、ネイティブMetal、ポータブルWGPUは、それぞれ独立して取得、測定、報告されます。
- **完全な結果のパリティ。** キャリブレーションは、参照ルートと検出IDが異なる候補を拒否します。高速でも誤った答えがルーティングテーブルに入ることはありません。
- **永続的なルート証跡。** KeyHogは、バイナリ、検出器コーパス、構成、ワークロードクラス、ホスト、アクセラレータ、ドライバ、および測定されたタイミングの証跡を記録します。通常のスキャンでは、ホットパスでベンチマークを行いません。
- **常駐実行。** デーモンワーカーは、ファイル、アーカイブ、履歴、リモート、クラウドの各バッチを繰り返し処理するために、コンパイル済みの検出器とアクセラレータの状態をウォームに保ちます。
- **隠れたCPUエスケープハッチなし。** 明示的に選択されたアクセラレータが初期化またはディスパッチできない場合、GPUラベルの下でCPU検出結果を返すのではなく、可視的に失敗します。
デフォルトのcrates.ioインストールは、ポータブルな純Rust CPUルートを使用するため、クリーンなRustホストで動作します。Hyperscanを導入せずに3つのGPUピアを有効にできます:```sh
cargo install --locked keyhog --no-default-features --features portable,gpu
本番バックエンドの診断を実行し、測定されたルートを検査してください:```sh keyhog backend --self-test keyhog calibrate-autoroute --policy all keyhog backend --autoroute --json
[バックエンドガイド](https://santhreal.github.io/keyhog/backends.html)には、常駐テーブル、境界付きディスパッチモデル、パリティ契約、再現可能なクロスオーバー証拠が記載されています。
## はじめに
### インストールして最初のスキャンを実行する
上記の2つのコマンドは、最新の crates.io リリースをインストールし、ポータブルな純Rustルートで現在のツリーをスキャンします。
CI環境を1つの正確なリリースに固定するには、`cargo install --locked --version '=0.5.75' keyhog` を使用します。KeyHog には Rust 1.89 以降が必要です。GPU、Hyperscan、CI、ポータブル、ソースビルドの各プロファイルについては、[インストールガイド](https://santhreal.github.io/keyhog/install.html) を参照してください。
KeyHog は、スキャンがクリーンな場合は終了コード `0` を返し、重大度の基準を超える検出結果を報告した場合は `1` を返します。終了コード `1` はスキャナーが正常に機能したことを意味します。各検出結果のファイル、行、検出器、および修復方法を確認してから、認証情報を削除、ローテーション、または抑制するかを決定してください。その他の非ゼロのコードは、入力、システム、検証、またはカバレッジの失敗を示します。[終了コードリファレンス](https://santhreal.github.io/keyhog/reference/exit-codes.html) を参照してください。
完全なプロセス契約は次のとおりです:
| 終了コード | 意味 |
|---|---|
| `0` clean | スキャンは、報告可能な検出結果やカバレッジ失敗なしに完了しました。 |
| `1` findings | 検出結果は存在しますが、ライブ確認されたものはありません。 |
| `2` operator error | 引数、設定、検出器コーパス、または操作者が修正可能な入力を修正してください。 |
| `3` system error | ランナーを修復するか再試行してください。これには、低レベルI/O、致命的なデーモンサービス、インクリメンタルキャッシュ、明示的に選択されたSIMDの失敗が含まれます。 |
| `4` `backend --self-test` or maintenance failure | 要求されたインストール、修復、バックエンド、またはオートルートのヘルスチェックが正常ではありませんでした。 |
| `10` live credentials | 少なくとも1つの認証情報がライブであると確認されました。`update --check` も、新しいリリースが存在する場合にこのコードを使用します。 |
| `11` scanner panic | スキャナー状態が信頼できないため、スキャン結果を破棄してください。 |
| `12` required GPU failure | 明示的に選択された、または必須のGPUパスを実行できませんでした。 |
| `13` incomplete coverage | 要求されたソースが失敗したか、入力カバレッジが不完全で、検出結果の結果が優先されませんでした。 |
| `130` interrupted | SIGINT または Ctrl-C によってプロセスが中断されました。 |
**フィルタ、フォーマット、ゲート:**
フィルタとして使用する前に、ベースラインを作成してください:```sh
keyhog scan . --create-baseline .keyhog-baseline.json
keyhog scan . --baseline .keyhog-baseline.json --format json-envelope --output keyhog.json
最初のコマンドはレビュー済みの検出結果のスナップショットを作成し、それらを出力せずに終了コード 0 を返します。そのファイルをコミットし、その後2番目のコマンドで新しい検出結果のIDのみを報告します。ベースラインエントリは、検出器と認証情報の値で一致し、ファイルパスでは決して一致しないため、記録済みのシークレットを移動してもゲートは失敗しませんが、ローテーションすると失敗します。変更された認証情報や不完全なカバレッジは引き続き表示されます。モノレポのパーティションを含む完全なパスは、新しいシークレットのみで失敗 です。
次のスキャンでは、レシピクックブック または 適切なワークフローの選択 内のコピー可能なコマンドを使用してください。ツールを変更することなく、Git履歴、コンテナイメージ、クラウドバケット、リポジトリコレクション、URL、マシン全体をスキャンできます。
GitHub Actions に追加する
.github/workflows/keyhog.yml を作成します:```yaml
name: keyhog
on:
push:
branches: [main]
pull_request:
permissions:
contents: read
security-events: write
jobs:
scan:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
- uses: santhreal/keyhog@v0
with:
path: .
severity: high
このActionは、チェックアウトされたツリーをスキャンし、`high` または `critical` の検出結果で失敗し、SARIF を Code Scanning にアップロードし、レポートをワークフローアーティファクトとして保持します。インストール、カバレッジ、バックエンド、レポート公開の失敗もジョブを失敗させます。
入力、出力、ベースライン採用、モノレポの分割、検証、失敗時の動作については、[GitHub Actionガイド](https://santhreal.github.io/keyhog/workflows/github-action.html) を参照してください。GitLab、CircleCI、Jenkins、Buildkite、および一般的なシェルジョブについては、[CIガイド](https://santhreal.github.io/keyhog/workflows/ci.html) を参照してください。リポジトリ組織、ホスト型Gitグループ、クラウドバケット、分割されたインベントリについては、[mass-scanningガイド](https://santhreal.github.io/keyhog/guides/mass-scanning.html) を参照してください。
## 他のツールが別製品として扱うスキャン対象
KeyHogは、追跡されたソースファイルだけでなく、漏洩する可能性のある境界のバイトをスキャンします。CIが正確なカバレッジと失敗状態を保持できるよう、境界ごとに1つのレポートを使用してください。
| 露出面 | 例 |
|---|---|
| 最終パッケージアーティファクト | `npm pack` を実行し、生成された `.tgz` を `keyhog scan package.tgz` でスキャンします。アーカイブ展開では、期待されるソースツリーに存在しない生成ファイル、ソースマップ、フィクスチャ、メタデータがチェックされます。 |
| デプロイされたブラウザアプリケーション | `keyhog scan --url https://app.example.com/assets/app.js` は、制限付きのJavaScript、ソースマップ、WASM、レスポンスデコードを追跡し、スキャナーを無制限のクローラーにはしません。 |
| GitHub issues、プルリクエスト、discussions、wikis、gists | `keyhog scan --github-collaboration owner/repo --github-all` は、チェックアウト外のすべてのコラボレーション面をスキャンします。 |
| AIエージェントおよびMCP構成 | `keyhog scan ~/.config ~/.claude ~/.codex` は、同じ検出器、デコード、信頼度、レポートパイプラインをローカルツール構成に適用します。 |
| コンテナイメージレイヤー | `keyhog scan --docker-image registry.example.com/team/app:v1` は、実行されるイメージコンテンツをスキャンします。ビルド中に導入されたファイルも含みます。 |
| クラウドオブジェクトインベントリ | `keyhog scan --s3-bucket BUCKET`、`--gcs-bucket BUCKET`、または `--azure-container-url URL` は、プロバイダーのページネーション、オブジェクト、バイト制限のカバレッジをターミナルレポートに保持します。 |
| 開発ホスト全体 | `sudo keyhog scan-system --space 50G` は、ハードなストレージ予算の下で、マウントされたファイルシステムと到達可能なGit履歴を検出します。 |
これらの経路は、単一の検出およびレポート契約を共有します。ソース固有の失敗が、暗黙的により狭いローカルスキャンに変わることはありません。
## 適切なワークフローの選択
最初にソース境界を選択してください。プリセットは検出作業を変更し、バックエンドは実行を変更します。どちらも、作業ツリースキャンをGit履歴、プロバイダーインベントリ、クラウドストレージ、またはホスト監査に拡張しません。
正直な `scan everything` ショートカットはありません。完全な資産レビューでは、以下の関連する境界を個別のジョブとして実行し、各 `json-envelope` レポートを生の終了コードとともに保持します。
| ニーズ | 開始方法 | スループットと再利用 | カバレッジ境界 |
|---|---|---|---|
| 素早いローカルフィードバック | `keyhog scan . --fast --incremental` | 変更されていないファイルのハッシュを再利用します。fastプリセットは、デコード、エントロピー、ML処理をスキップします。 | fastは意図的に範囲が狭いため、マージ前にデフォルトポリシーを実行してください。 |
| 完全なリポジトリースキャン | `keyhog scan .` | 調整済みの `auto` とCPUコアのワーカーがデフォルトです。同じ信頼済みツリーの繰り返しスキャンには `--incremental` を追加します。 | 現在のファイルのみ。Git履歴は追加されません。 |
| ステージングされたコミットゲート | `keyhog scan --git-staged` または `keyhog hook install` | 正確なインデックスブロブを読み取るため、ステージングされていない編集は結果を変更できません。 | ステージングされたコンテンツのみ。ローカルのステージングされていないバイトが重要な場合は、作業ツリースキャンを別途実行してください。 |
| 永続的なリポジトリガード | `keyhog guard add . --mode repo` を実行してから `keyhog guard status .` | 7状態マシン、クリーンな証明キャッシュ、ポリシーID追跡を備えたデーモン常駐のルートレジストリ。 | 実行中のデーモンが必要です。ガードはステージングおよび作業ツリースキャンを補完するものであり、置き換えるものではありません。 |
| GitHubプルリクエストゲート | `santhreal/keyhog@v0` | Actionがインストール、スキャン、SARIFとアーティファクトの公開を行い、KeyHogのステータスを保持します。 | チェックアウトされた1つのパス。組織の場合はプロバイダーインベントリスキャンを使用します。 |
| GitLab、Jenkins、Buildkite、またはシェルCI | `keyhog scan . --format json-envelope --output keyhog.json` | 成功、検出結果、エラーについて、レポートと終了コードを保持します。`--git-diff <base>` は、明示的により狭い変更行ゲートの場合にのみ使用します。 | チェックアウトに存在するバイト、または選択されたdiff。 |
| 既知の検出結果があるリポジトリを採用する | `.keyhog-baseline.json` を作成し、コミットしてから、`--baseline .keyhog-baseline.json` でスキャンします。 | 既存のIDはベースラインに表示されたままになり、新しい検出結果だけがゲートを失敗させます。 | ベースラインは、変更された資格情報や不完全なカバレッジを抑制しません。 |
| 再帰的Gitリカバリ | `keyhog scan --deep --git-history . --git-blobs . --daemon=off` | deepポリシーをワーカークラスごとに1回調整します。プロセス内で実行します。 | 1つのリポジトリ。`--git-history` は現在のチェックアウトの祖先のみを対象とするため、チェックアウトしたことのないブランチはカバレッジギャップなしで見落とされます。`--git-blobs` は、ダングリングブロブ、amendで消えたコミット、スタッシュ、ノート、注釈付きタグメッセージ、パックされた参照にも到達します。 |
| コンテナまたはアーカイブの検査 | `keyhog scan --docker-image registry/app:v1` または `keyhog scan incoming/` | スキップされた、壊れた、暗号化された、安全でない、またはサイズ超過のメンバーが表示されたままになるよう、エンベロープレポートを保持します。 | 選択したイメージまたはファイルシステムパスと、サポートされているネストされた形式のみ。 |
| URL、レスポンス、またはHARの検査 | `keyhog scan --url https://api.example.com/config` または `keyhog scan capture.har` | 制限付きのソース制限を使用し、ターミナルエンベロープを保持します。 | 取得したレスポンスまたはキャプチャエントリのみ。これはクローラーではありません。 |
| 組織またはクラウドインベントリ | `keyhog scan --daemon=off --github-org acme --format json-envelope --output acme.json` | プロバイダー、所有者、またはバケットごとに分割します。独立したパーティションを並行して実行し、それぞれ1つのレポートとステータスを維持します。 | ジョブごとに選択された1つのプロバイダーインベントリ。ページネーションまたはオブジェクト制限はカバレッジ境界のままです。 |
| 対象となる検出結果が実際に有効かどうかを確認する | `keyhog scan . --verify` | プロバイダーの並行性とレート制御は、スキャナーワーカーとは別です。 | 資格情報から導出されたリクエストを宣言されたプロバイダーエンドポイントに送信します。すべての検出器が検証に対応しているわけではありません。 |
| ホスト全体の健全性スキャン | `sudo keyhog scan-system --space 50G` | デフォルトですべてのCPUコアを使用し、ファイルシステムデータの後に検出されたGit履歴をスキャンします。 | ローカルのマウントされたファイルシステム。ネットワークマウントはオプトインであり、スペース上限はハードリミットです。 |
| Unix上のGPU対応ディレクトリ、履歴、アーカイブ、リモート、またはクラウドインベントリ | autorouteを調整し、`keyhog daemon start --mass` を開始してから、`keyhog scan --daemon=mass <SOURCE>` を実行します。 | 制限付きバッチを、コンパイルされた1つのCPU、Hyperscan、CUDA、Metal、またはWGPUワーカーにストリーミングします。ウォームな未変更ファイルシステムツリーには `--incremental` を追加します。ターミナルのレシートには、正確な合計およびGPUバッチ、チャンク、バイト、GPUシェア、スループットが報告されます。 | ベースライン、検証、ロックダウン、プリセット、オーバーレイ、その他のスキャナーポリシー変更は、取得前に拒否されます。インクリメンタル状態は、デーモンローカルのファイルシステムルートにのみ適用されます。 |
### サポートされているすべてのソース境界をスキャンする
境界ごとに1つのコマンドを使用します。各インベントリパーティションについて、`json-envelope` レポートと生の終了ステータスを保持してください。
| ソースまたはユースケース | コマンド |
|---|---|
| 複数のローカルルート | `keyhog scan services/api services/web deploy/` |
| 継続的に変更されるファイル | `keyhog watch services/api deploy/` |
| ステージングされたバイト、変更された行、到達可能な履歴、またはブロブ | `keyhog scan --git-staged`、`--git-diff main`、`--git-history .`、または `--git-blobs .` |
| ネイティブバイナリとファームウェア文字列 | `keyhog scan --binary firmware.bin`(通常のディレクトリスキャンはバイナリをスキップし、それでも `0` で終了します) |
| アーカイブと圧縮ソース | `keyhog scan incoming/`(サポートされているメンバーは自動的に展開されます) |
| Dockerイメージレイヤー | `keyhog scan --docker-image registry/app:v1` |
| JavaScript、ソースマップ、WASM、またはエンドポイントレスポンス | `keyhog scan --url https://api.example.com/config` |
| HTTPリクエストとレスポンスのキャプチャ | `keyhog scan capture.har` |
| GitHub issues、プルリクエスト、discussions、wikis、gists | `keyhog scan --github-collaboration owner/repo --github-all` |
| GitHub、GitLab、またはBitbucketインベントリ | `--github-org ORG`、`--gitlab-group GROUP`、または `--bitbucket-workspace WORKSPACE` |
| S3、GCS、またはAzure Blobインベントリ | `--s3-bucket BUCKET`、`--gcs-bucket BUCKET`、または `--azure-container-url URL` |
| 別のツールからの制限付きストリーム | `producer \| keyhog scan --stdin`(`set -o pipefail` を使用して、失敗したプロデューサーがゼロバイトのスキャンではなく自身のエラーを表面化させるようにします) |
通常のディレクトリスキャンはネイティブバイナリを読み取りません。それぞれが `binary (extension or content sniff)` のカバレッジギャップになり、スキャンはそれでも `0` で終了し、`--no-default-excludes` はそれを変更しないため、コンパイル済みアーティファクトが対象の場合は `--binary` を渡してください。このフラグには `binary` フィーチャーを含むビルドが必要であり、デフォルトのcrates.ioインストールには含まれますが、リーンな `ci` フィーチャーには含まれません。
ネイティブバイナリ抽出は、名前付き検出器の明示的な形状契約を満たす完全な資格情報を報告します。コンパイル済みデータセクションの短いプレフィックス断片や一般的な代入形状の文字列は、ソースコンテキストを保持しないため抑制されます。
エンドポイントフェッチは制限付きで、SSRFチェック済みです。これはクローラーではありません。プライベートクラウドエンドポイントと資格情報の転送には、明示的なトラストフラグが必要です。プロバイダートークンは、プロセス引数ではなく、文書化された環境変数に属します。
ソースとポリシーの詳細については[ワークフローチューザー](https://santhreal.github.io/keyhog/capabilities.html)、保守されたリポジトリゲートについては[GitHub Actionガイド](https://santhreal.github.io/keyhog/workflows/github-action.html)、永続的なレポートと終了処理については[直接CIガイド](https://santhreal.github.io/keyhog/workflows/ci.html)、分割と集約については[mass-scanningガイド](https://santhreal.github.io/keyhog/guides/mass-scanning.html) を参照してください。[レシピクックブック](https://santhreal.github.io/keyhog/recipes.html)は、コンテナ、アーカイブ、URL、GitHubコラボレーションコンテンツ、クラウドソースを対象としています。
### 推測を必要としない速度と並行性
デフォルトから始めてください。実績のある検証済みバイナリアセットインストーラーは、それ自体でキャリブレーションを実行します。Cargo は `cargo install` 後に KeyHog を実行できないため、マルチバックエンドの Cargo ビルドをインストールした後に一度、そしてホスト、バイナリ、検出器コーパス、ドライバー、またはワークロードクラスが変更された後に再度、以下のコマンドを実行してください:```sh
keyhog calibrate-autoroute --policy all
keyhog backend --autoroute --json
| 制御 | 用途 | 維持すべき不変条件 |
|---|---|---|
調整済み --backend auto | 通常のCPU、Hyperscan、GPUの選択。 | 明示的なバックエンドは診断用のオーバーライドであり、高速化のためのデフォルトではありません。 |
--threads <N> | 共有ランナー上でCPU容量を予約するため。専用ホストでは通常は未設定のままにし、KeyHogが利用可能なコアを使用するようにします。 | すべての値は正でなければなりません。複数の同時KeyHogプロセスはそれぞれワーカープールを所有するため、ホストの予算をパーティション間で分割してください。 |
--reader-threads <N> | リーダー処理がスキャンではなくボトルネックとなる、測定済みのストレージパイプライン。 | デフォルトはスキャンワーカープールから派生します。プロファイリングがリーダーのボトルネックを示すまで未設定のままにしてください。 |
--incremental および --incremental-cache <PATH> | 同じ信頼済みツリーの繰り返しスキャン。 | 無関係なリポジトリや信頼できないジョブ間で1つのインデックスを共有しないでください。 |
| プロバイダーまたはリポジトリのパーティション | 同時並行の資産スキャンと独立した再試行。 | パーティションごとに1つの終端エンベロープと生の終了コードを保持します。検出結果を連結してカバレッジ状態を破棄しないでください。 |
--verify-concurrency、--verify-rate、--verify-batch | ファイルスキャンとは独立してライブプロバイダーチェックを制限するため。 | 検証は資格情報から派生したリクエストを送信します。この並行性を制御するのはCPU数ではなくプロバイダーのレート制限です。 |
| Massデーモン | 1つのUnixワーカー上でのTB規模のディレクトリ、履歴、アーカイブ、リモート、またはクラウドストリーム。 | 各フレームは8 MiBと1,024チャンクに制限されます。デーモンはフラグメント状態を直列化し、正確なCPU/GPU実行レシートを返します。 |
--fast、default、--deep、または --precision | 明示的な検出コストと再現率ポリシーを選択するため。 | これらのプリセットは相互に排他的で、カバレッジを変更します。それらは交換可能な速度調整ノブではありません。 |
解決済みポリシーは keyhog config --effective で確認してください。--profile を使用して
固定スキャナーステージと完全なオペレーター実行を、変更する前に
reader、batch、channel-depth 各制御を計測します。低オーバーヘッドのレポートには
source、backend、cache、workload、thread、input、state-transition、CPU-time、
peak memory、exact binary SHA-256、enabled-feature SHA-256、target triple、build
profile、compiler、allocator、linked-backend SHA-256、detector-corpus SHA-256、
enabled-detector BLAKE3、compiled-plan BLAKE3、hashed detector-provenance、
complete resolved-configuration BLAKE3、performance-policy BLAKE3、preset、
applied protection state、source adapters、hashed source-target BLAKE3、
hashed source-partition BLAKE3、raw source bytes、source-unit fanout、
decode-derived bytes、completed backend-dispatch bytes、そして安定した size/fanout
バケットが記録されます。ソースアダプターがまだ区別できないバイト領域は、
0として計測されるのではなく、明示的に利用不可として残ります。レポートは
ソースコンテンツ、資格情報の値、生のパス、生のURL、生の設定値を記録しません。
--perf-trace は高コストなパターン単位および
バックエンド診断カウンターにのみ使用してください。
高度なパイプライン制御は、対象ワーカーでの再現可能な測定が改善を示すまで
未設定のままにしてください。
定期的な完全リポジトリスキャンの場合:```sh
keyhog scan . --incremental
--format json-envelope --output keyhog.json
共有ランナーの場合、ジョブに4つのスキャナーワーカーと1つの
リーダーワーカーが割り当てられると:```sh
keyhog scan . --threads 4 --reader-threads 1 \
--format json-envelope --output keyhog.json
2番目のコマンドはリソース予算であり、普遍的な最適値ではありません。明示的なワーカー数を選択する前に、対象ホストを測定してください。
ディープリカバリ およびシステム全体のトリアージについては、対象範囲と完了ルールが通常のリポジトリースキャンと異なるため、専用のガイドを使用してください。
シークレットスキャナーのベンチマーク
これらのパネルは、検出ポリシー、CPU および GPU の実行リクエスト、インクリメンタルキャッシュの動作、ウォームデーモンリクエストを比較します。すべての値は、チェックされたベンチマークスナップショットから生成されます。スナップショットは、スキャナーバージョン、実行可能ダイジェスト、検出器ダイジェスト、コーパス、ホスト、実行タイムスタンプをバインドします。競合他社の来歴とカテゴリ別再現率については、完全なベンチマークエビデンス を使用してください。
検出精度
KeyHog KeyHog v0.5.70 は mirror コーパスをスキャンしました: 15,000 フィクスチャ、3,000 のラベル付きポジティブ、2,431,242 入力バイト。解答キーのマニフェストはスキャンツリーから除外されました。この行は、AMD Ryzen 9 9950X 16-Core Processor 上の明示的な Hyperscan/SIMD ルートでデフォルトポリシーを使用しています。
| 適合率 | 再現率 | F1 | 真陽性 | 偽陽性 | 偽陰性 |
|---|---|---|---|---|---|
| 0.9651 | 0.9027 | 0.9328 | 2,708 | 98 | 292 |
追跡対象のソースツリーはクリーンでした。
実行ルート、プリセット、キャッシュ
AMD Ryzen 9 9950X 16-Core Processor と NVIDIA GeForce RTX 5090、32 論理コア、15,000 フィクスチャ、3,000 のラベル付きポジティブ、2,431,242 入力バイトで測定。スキャナー: KeyHog v0.5.70。追跡対象のソースツリーはクリーンでした。
実行ルート別のフルスキャン
すべての行は、インクリメンタルキャッシュとデーモンをオフにしたデフォルトの検出ポリシーを使用しています。automatic の行は要求されたポリシーを記録しますが、ベンチマーク結果は選択された永続化ルートにバインドされないため、ルーティングの証明にはなりません。GPU の行は、この小さなコーパスでの取得とスキャナーのフル起動を含みます。GPU カーネルのクロスオーバー測定ではありません。
| 要求ルート | 実時間 | スループット | ピーク RSS | F1 |
|---|---|---|---|---|
| Hyperscan/SIMD | 860 ms | 2.70 MB/s | 416 MiB | 0.9328 |
| Pure-Rust CPU | 903 ms | 2.57 MB/s | 509 MiB | 0.9328 |
| CUDA | 2.03 s | 1.14 MB/s | 963 MiB | 0.9328 |
| WGPU | 1.97 s | 1.18 MB/s | 1264 MiB | 0.9328 |
| Automatic | 1.46 s | 1.59 MB/s | 634 MiB | 0.9328 |
Hyperscan/SIMD における検出ポリシー
ルート、キャッシュ、デーモン状態、コーパス、ホストは固定されています。プリセットは検出作業を変更するため、時間だけでなく適合率と再現率も比較してください。
| ポリシー | 実時間 | 適合率 | 再現率 | F1 | ファインディング |
|---|---|---|---|---|---|
| Fast | 737 ms | 0.9700 | 0.8837 | 0.9248 | 2,738 |
| Default | 860 ms | 0.9651 | 0.9027 | 0.9328 | 2,816 |
| Deep | 861 ms | 0.9645 | 0.9067 | 0.9347 | 2,845 |
| Precision | 849 ms | 0.9590 | 0.6397 | 0.7674 | 2,001 |
インクリメンタルウォーム再実行
ベンチマークは BLAKE3 Merkle インデックスを構築し、その後、2 回目の同一スキャンの時間を測定します。スキャナーの起動が支配的であるため、小さな合成ツリーでは変化はほとんどありません。高速化を主張する前に、リポジトリーを測定してください。
| Hyperscan/SIMD デフォルトポリシー | 実時間 | スループット | ピーク RSS |
|---|---|---|---|
| キャッシュオフ | 860 ms | 2.70 MB/s | 416 MiB |
| ウォームインクリメンタルキャッシュ | 617 ms | 3.76 MB/s | 457 MiB |
ウォームデーモンリクエスト
決定的な 8 MiB の通常ファイル(sha256:afafbe7b6487fd62866f510e7c281a9e7bfeaa8dc585d7b0478c92ee6c4f5ef5)を、プロセス内で 1 回、所有デーモンを介して 1 回(1 回のウォームアップリクエスト後)スキャンしました。デーモン時間はクライアントリクエストであり、デーモン RSS は常駐サーバーに属します。
| 明示ルート | プロセス内 | ウォームデーモン | ウォーム/ワンショット | プロセス内 RSS | デーモン RSS |
|---|---|---|---|---|---|
| Hyperscan/SIMD | 323 ms | 106 ms | 0.33× | 63 MiB | 74 MiB |
| Pure-Rust CPU | 278 ms | 109 ms | 0.39× | 62 MiB | 66 MiB |
| CUDA | 1.65 s | 232 ms | 0.14× | 674 MiB | 666 MiB |
| WGPU | 1.33 s | 237 ms | 0.18× | 596 MiB | 600 MiB |
これらの行は、ウォームな単一ファイルルートを対象としています。mass ルートは、境界付きディレクトリおよびリモートソースのバッチも受け入れます。そのインクリメンタルファイルシステムパスは別途測定されます。
CPU、リーダー、ストレージ、サイズ、パーティションのスケーリング
benchmarks/reports/readme-scaling.json から make -C benchmarks readme-scaling によって生成されます。ハーネスは、明示的な simd とデーモンルーティングをオフにして、1 回のウォームアップ後に 3 回の測定トライアルを実行しました。ワーカースケーリングは、CPU 作業を分離するためにウォームなクライアントページキャッシュを使用します。リーダー、コーパスサイズ、ストレージ、パーティションの行は、プラットフォームがサポートする場合に posix_fadvise によるクリーンページのエビクションを要求します。スナップショットはすべての行にポリシーを記録します。すべてのワークロードはバイト単位で決定的であり、ファインディングなしです。
ホスト: AMD Ryzen 9 9950X 16-Core Processor、32 有効論理コア、94,140 MiB RAM、Linux 6.17.0-19-generic。エビデンス: clean、バイナリー 274b045489c4。
スキャンワーカースケーリング
| ワーカー数 | リーダースレッド | 中央値実時間 | p95実時間 | スループット | 高速化 | 効率 | 中央値ピーク RSS |
|---|---|---|---|---|---|---|---|
| 1 | auto | 8,134.4 ms | 8,135.4 ms | 7.9 MiB/s | 1.00x | 100.0% | 47.0 MiB |
| 2 | auto | 4,398.2 ms | 6,906.7 ms | 14.6 MiB/s | 1.85x | 92.5% | 50.3 MiB |
| 4 | auto | 2,392.6 ms | 6,245.2 ms | 26.7 MiB/s | 3.40x | 85.0% | 57.2 MiB |
| 8 | auto | 1,816.3 ms | 6,117.6 ms | 35.2 MiB/s | 4.48x | 56.0% | 63.4 MiB |
| 16 | auto | 1,428.5 ms | 6,867.7 ms | 44.8 MiB/s | 5.69x | 35.6% | 78.4 MiB |
| 32 | auto | 1,862.8 ms | 5,939.1 ms | 34.4 MiB/s | 4.37x | 13.6% | 126.7 MiB |
ファイルシステムリーダースケーリング
| スキャンワーカー | リーダースレッド | 中央値実時間 | p95実時間 | スループット | リーダー1基比 | 中央値ピーク RSS |
|---|---|---|---|---|---|---|
| 32 | 1 | 1,898.7 ms | 1,922.1 ms | 33.7 MiB/s | 1.00x | 121.3 MiB |
| 32 | 2 | 1,881.7 ms | 1,887.5 ms | 34.0 MiB/s | 1.01x | 122.8 MiB |
| 32 | 4 | 1,874.2 ms | 1,891.2 ms | 34.1 MiB/s | 1.01x | 126.6 MiB |
| 32 | 8 | 1,873.2 ms | 1,885.7 ms | 34.2 MiB/s | 1.01x | 133.4 MiB |
| 32 | 16 | 1,856.8 ms | 1,868.5 ms | 34.5 MiB/s | 1.02x | 153.9 MiB |
| 32 | 32 | 1,877.3 ms | 1,880.4 ms | 34.1 MiB/s | 1.01x | 179.5 MiB |
コーパスサイズスケーリング
| コーパス | ファイル数 | 正確なバイト数 | 中央値実時間 | p95実時間 | スループット | 中央値ピーク RSS |
|---|---|---|---|---|---|---|
| small | 256 | 8 MiB | 869.9 ms | 886.1 ms | 9.2 MiB/s | 111.1 MiB |
| medium | 1,024 | 64 MiB | 1,859.9 ms | 1,874.8 ms | 34.4 MiB/s | 126.3 MiB |
| large | 2,048 | 256 MiB | 5,214.9 ms | 5,321.7 ms | 49.1 MiB/s | 137.1 MiB |
ストレージスケーリング
| ストレージクラス | ファイルシステム | デバイス ID | 中央値実時間 | p95実時間 | スループット | 最初のストレージ比 | 中央値ピーク RSS |
|---|---|---|---|---|---|---|---|
| workspace | ext4 | 66305 | 1,847.4 ms | 1,863.4 ms | 34.6 MiB/s | 1.00x | 127.0 MiB |
| local-temp | tmpfs | 116 | 1,870.8 ms | 1,887.3 ms | 34.2 MiB/s | 0.99x | 124.9 MiB |
並行パーティションスケーリング
| プロセス数 | プロセスあたりのワーカー数 | 合計ワーカー数 | 総ファイル数 | 総バイト数 | 中央値実時間 | 合計スループット | 高速化 | 中央値合計ピーク RSS |
|---|---|---|---|---|---|---|---|---|
| 1 | 32 | 32 | 256 | 8 MiB | 871.9 ms | 9.2 MiB/s | 1.00x | 111.5 MiB |
| 2 | 16 | 32 | 512 | 16 MiB | 404.6 ms | 39.5 MiB/s | 4.31x | 134.0 MiB |
| 4 | 8 | 32 | 1,024 | 32 MiB | 571.1 ms | 56.0 MiB/s | 6.11x | 227.2 MiB |
これらの行は測定値であり、普遍的なチューニング定数ではありません。ターゲットホストとストレージ上でジェネレーターを実行してください。スループットが改善しなくなる膝(knee)のポイントを使用し、その後、CI ランナーまたはオーケストレーションレイヤー用に CPU とメモリーを確保してください。
4 つのベンチマークグループすべてを make -C benchmarks readme-matrix で再現します。このコマンドは必要なマトリクスを測定し、要求された CPU、Hyperscan、CUDA、Metal、WGPU、プリセット、キャッシュ、デーモン、スレッド、リーダー、ストレージ、コーパスサイズ、パーティションのいずれかの行が利用できない場合は失敗します。make -C benchmarks readme-matrix-check を使用して、両方のスナップショット、レポート、README が一致することを確認してください。
スキャン構成の選択
デフォルトのポリシーとキャリブレーション済みの自動ルーティングから始めます。ワークフローが必要とする場合にのみ、1 つの軸を変更してください:
| ワークフロー | 検出ポリシー | 実行と再利用 | 追加の制御 |
|---|---|---|---|
| 最初のリポジトリスキャン | Default | キャリブレーション済み auto; --daemon=auto | 抑制を追加する前にすべてのファインディングを確認します。 |
| 繰り返しのローカルツリーまたは CI スキャン | Default | キャリブレーション済み auto; --incremental | インクリメンタルキャッシュは、同じ信頼できるツリーのスキャン間でのみ保持します。 |
| 短いフィードバックループ | --fast | キャリブレーション済み auto; 任意の --incremental | デコード、エントロピー、ML カバレッジの低下を受け入れます。マージ前にデフォルトポリシーを実行してください。 |
| 最高再現率のリカバリ | --deep | プロセス内 | Deep は fast および precision と相互排他的であり、デーモン対象ではありません。 |
| 低ノイズの大規模インベントリ | --precision | リポジトリーコレクション、履歴、クラウドソースではプロセス内 | このプリセットは信頼度の下限を引き上げ、エントロピー探索を無効にします。低信頼度の認証情報を見逃す可能性があります。 |
| Unix での TB 規模のディレクトリ、履歴、アーカイブ、リモート、クラウドインベントリ | Default | keyhog daemon start --mass、その後 --daemon=mass | バッチは 8 MiB と 1,024 チャンクに制限されたままです。端末のカバレッジレポートと GPU 実行レシートを保存してください。 |
| ライブ認証情報の検証 | Default | プロセス内 | --verify を明示的に追加します。検証は認証情報から派生したリクエストをプロバイダーに送信します。 |
| Linux スワップなしスキャン | Default に加えて --lockdown | プロセス内; インクリメンタルキャッシュ無効 | Lockdown は、検証、平文シークレット、fast モード、完全性を低下させるスイッチを拒否します。 |
--fast、--deep、--precision は相互排他的な検出プリセットです。--lockdown はフェイルクローズの実行モードであり、4 番目のプリセットではありません。明示的な --backend 値は診断およびベンチマークのオーバーライドです。これらは自動ルーティングで使用される、永続化された最速正解エビデンスを置き換えるものではありません。完全な契約については、設定、オートルートのキャリブレーション、デーモンとウォームスキャン、堅牢化 を参照してください。
KeyHog の仕組み
KeyHog は 926 個の検出器を共有のトリガーおよび抽出プランにコンパイルし、マッチング前にネストされたエンコーディングをデコードし、検出器ごとの信頼度と抑制を適用します。Pure-Rust CPU(cpu-fallback)は常に利用可能です。Hyperscan ルート(simd-regex)は、その機能が存在する場合に Hyperscan を使用します。ポータブルビルドは CPU ルートを使用します。CUDA(gpu-cuda-region-presence)、Metal(gpu-metal-region-presence)、WGPU(gpu-wgpu-region-presence)は、フォールバックチェーンではなく、証明に基づくオートルートセレクター内のピアです。キャリブレーションは、対象となるすべてのピアを測定し、完全なファインディングが参照ルートと一致する最速ルートを、正確なバイナリー、検出器および構成状態、ホスト、アクセラレーター、ワークロードクラスについて永続化します。欠落、古い、無効、または不完全な決定は、実行前に自動スキャンを停止し、再キャリブレーション方法を報告します。別のバックエンドを黙って代用することはありません。
リポジトリーマップ、依存関係の方向、バイトからファインディングへのパイプライン、プロファイリングエントリポイントについては、アーキテクチャ を参照してください。実行契約については バックエンドとルーティング を、パリティ、ワークロード ID、キャッシュライフサイクル、修復手順については オートルートのキャリブレーション を参照してください。
完全なドキュメント: santhreal.github.io/keyhog - インストール、最初のスキャン、出力形式、検出の内部構造、抑制、検証、pre-commit + CI 統合、CLI リファレンス、オートルート、終了コード、環境変数、コントリビューション。ソースは docs/ の下にあります。
KeyHog のインストール
現在の crates.io リリースをインストール:```sh cargo install keyhog --locked
未リリースの変更が必要な場合は、リポジトリのチェックアウトをビルドしてください:```sh
cargo install --path crates/cli --locked
インストールされたビルドを確認:```sh keyhog --version --full keyhog doctor
Rustツールチェーンの要件、フィーチャープロファイル、プラットフォーム固有のランタイム依存関係については、[インストールガイド](https://santhreal.github.io/keyhog/install.html) を参照してください。
## 検出対象
926 個の組み込み検出器。各検出器は独自のオフライン検証とコンパニオンを備えています:
- **クラウドプロバイダー:** AWS (アクセスキー + シークレット + STS検証)、Azure (サブスクリプションキー、ストレージアカウントキー、SAS)、GCP (サービスアカウント、APIキー)、Cloudflare、Heroku、Vercel、Supabase。
- **決済プロセッサー:** Stripe、Braintree、Razorpay、Paddle、Plaid、Square、PayPal。検出器独自のチェックと、オプションまたは必須のコンパニオンを備えています。Razorpayのキーシークレットには、その近くにあるキーIDが必要です。
- **ソースフォージ:** GitHub PAT(CRC32チェックサム付き)、GitLabトークン、Bitbucketアプリパスワード、npmトークン(チェックサム付き)、Gitea / Forgejo / Codeberg。
- **認証 / SSO:** Okta、Auth0、Clerk、JumpCloud、Kinde。
- **コミュニケーション:** Slack、Discord、Twilio、SendGrid、Postmark、Mailgun、Resend、Loops。
- **AI / ML:** OpenAI (sk-/sk-proj-)、Anthropic、Google AI Studio、Cohere、Mistral、HuggingFace、Replicate。HuggingFace組織の資格情報には、現在の `hf_` 形式と従来の `api_org_` トークンの両方が含まれます。
- **パスワードマネージャー:** 1Passwordアカウントのシークレットキー(`A3-` の後に5〜6個のセグメント化された大文字英数字コンポーネントが続くもの)。
- **データベース:** Postgres接続文字列、MongoDB Atlas、Supabaseサービスロール、PlanetScale、Neon、Turso、MySQL、Redis URL。
- **汎用 + エントロピー検出:** `API_KEY=<high-entropy-blob>` は、名前付き検出器のない資格情報を捕捉します。コンテキストごとのエントロピーしきい値 + MLスコアリングでゲートされます。
- **暗号素材:** RSA / EC / SSH秘密鍵、PGP秘密ブロック、JWT署名シークレット。
各検出器は [TOMLファイル](https://github.com/santhreal/keyhog/blob/HEAD/detectors/)(データでありコードではありません)として提供されます。サービスメタデータ、正規表現パターン、キーワード、オフライン検証、エントロピーとMLポリシー、コンパニオンフィールド、検証ハンドラーが含まれます。新しい検出器の追加は、レビュー可能な単一のTOML変更です。[コントリビューターガイド](https://github.com/santhreal/keyhog/blob/HEAD/CONTRIBUTING.md) にその手順が記載されています。
`keyhog explain <id>` は任意の検出器の完全な仕様(パターン、キーワード、検証エンドポイント、さらにサービスに紐づくローテーションとステップバイステップの修復ガイド)を出力します。これにより、検出結果がブラックボックスになることはありません。
<p align="center">
<img src="https://assets.kitploit.com/production/public/readmes/7654/0fc64959950abfa39c0ba81a1f5fbde3fe17a57169d2edca38cb0f248c834470.gif" alt="keyhog explain github-classic-pat: 検出器仕様のダンプ(パターン ghp_[A-Za-z0-9]{36}、キーワード、検証URL)、その後にGitHubのローテーションガイドとステップバイステップの修復手順" width="860" />
</p>
検出器の作成と検査については [検出器リファレンス](https://github.com/santhreal/keyhog/blob/HEAD/docs/src/detectors.md) を参照するか、インストール済みのコーパスを `keyhog detectors --search <term> --verbose` で検索してください。
## なぜ再現率が高く、誤検知が少ないのか
- **デコードスルースキャン:** Kubernetes `Secret` マニフェスト、Jupyterノートブック、JWTペイロード、base64でラップされた環境変数、Helmのvalues、docker-config の `auth:` ブロブを対象とします。構造化プリプロセッサは、均衡の取れたHelmアクションをレンダリング時の不活性な値として扱い、ファイル末尾の不足しているJupyterデリミタを閉じるため、リテラルバイトと完全なコードセルがカバーされ続けます。構造化された値をその場でデコードし、後続のすべての検出器に平文を渡します。検出器がそれぞれデコードを再実装する必要はありません。デコード有効スキャンは、回復に必要な素材がすべて埋め込まれている場合(厳密なCryptoJS/OpenSSLのソルト付きパスフレーズラッパーを含む)、副作用のないJavaScriptバイト配列XOR式やAES-256-CBC式も回復します。KeyHogがソースを実行することはありません。
- **複数行の再組み立て:** JavaScript での `"sk-proj-" + \` 継続、YAMLの複数行文字列、Makefileのバックスラッシュ継続、Helm / Jinjaテンプレート出力などを、正規表現マッチングの前にすべて再組み立てします。
- **コンパニオン検証:** 必須コンパニオンが高ノイズ検出器をゲートします。Twilio APIキーだけがありAPIシークレットがない場合はスキップされます。オプションのコンパニオンは信頼度または検証を強化します。AWSアクセスキー検出はシークレットを必須としませんが、ライブ検証にはシークレットが必要です。
- **検出器間の解決:** 検出器TOMLは、別の検出器からの境界付き検出結果を要求、拒否、または包含できます。解決は入力順に関係なく決定的であり、無効なターゲット、矛盾、依存関係の循環はコーパスコンパイルを失敗させます。
- **信頼度スコアリング:** すべての検出結果は、シャノンエントロピー、周囲のコンテキスト、コンパニオンマッチ、検出器が所有するオフライン証明(GitHub/npm CRC32とPyPIペイロードデコード)、構造的証拠、小さなML分類器(約30kパラメータ)から導出される `[0.0, 1.0]` のスコアを持ちます。デフォルトのしきい値 `0.40`(標準の `ScanConfig::default()` フロア。後述の `--min-confidence` デフォルトおよび `[scan].min_confidence` の例と同じ)は、実際のシークレットを隠すことなく低品質のマッチをフィルタリングします。
- **ベイズ型の検出器ごとのキャリブレーション:** `keyhog calibrate --fp generic-api-key` は Beta(α,β) の事後分布を書き出します。スキャンは `--calibration-cache` または `[system].calibration_cache` がそのファイルを指している場合にのみそれを使用します。これにより、信頼度チューニングはホストのキャッシュ状態に依存せず、明示的で再現可能になります。
## パフォーマンス
[`benchmarks/`](https://github.com/santhreal/keyhog/blob/HEAD/benchmarks/) にある再現可能なハーネスを使用して、KeyHog、Betterleaks、Kingfisher、Nosey Parker、TruffleHog、Titus を単一のスコアリング契約の下で比較します。ハーネスは、すべてのスキャンツリーから正解マニフェストを除外します。生成されたテーブルは、現在のスキーマの実行が存在するまで空のままです。測定後に `make -C benchmarks report` を実行してください。生成されたテーブルを手動で編集しないでください。
### 検出リーダーボード
<!-- BENCH:leaderboard:start -->
コーパス: **mirror** - 15000 フィクスチャ、3000 個のラベル付きポジティブ。すべてのスキャナは同一のスコアリング(SecretBenchオーバーラップルール)を受けました。回答キーのマニフェストはスキャンツリーから除外されています。
| 順位 | スキャナ | F1 | 適合率 | 再現率 | 検出件数 | ウォールタイム | ピークRSS |
|---|---|---|---|---|---|---|---|
| 1 | **KeyHog** | **0.9328** | 0.9651 | 0.9027 | 2816 | 1.05s | 416 MB |
| 2 | TruffleHog | 0.5294 | 1.0000 | 0.3600 | 1080 | 1.59s | 300 MB |
| 3 | Kingfisher | 0.4683 | 0.3877 | 0.5913 | 5255 | 4.81s | 402 MB |
| 4 | Titus | 0.4207 | 0.3381 | 0.5567 | 5151 | 2.86s | 115 MB |
| 5 | Nosey Parker | 0.4186 | 0.3511 | 0.5183 | 4529 | 0.82s | 285 MB |
| 6 | Betterleaks | 0.3498 | 0.2241 | 0.7970 | 11113 | 0.74s | 198 MB |
<!-- BENCH:leaderboard:end -->
### 結果の来歴
| スキャナ | スキャナバージョン / 実行ファイルダイジェスト | コーパスID | ホストID | 実行日 |
|---|---|---|---|---|
| KeyHog | version: KeyHog v0.5.70<br>Commit: d1eb2e09eb2c289181d93d719ce3f62411aeaf2c<br>Detector Set: 926 (926-4168e2c6c93a16ca)<br>Build Target: x86_64-linux<br>ML Model Version: moe-v1-246a05b92bec9aa3<br>ML Model Card: recorded 2026-07-15; features 55; synthetic F1 0.971 / P 0.945 / R 0.999; real F1 0.832 / P 0.753 / R 0.931 / [email protected] 0.938; zero-recall detectors 2/32; six-scanner differential unavailable<br>executable SHA-256: `2899ee53789bff9c531f72645f6c8380a7c873230dfb2b6857079467bc8d2dcd` | mirror; 15,000 fixtures; 3,000 labeled positives; 2,431,242 bytes | hostname SHA-256/12: `82fcd9288623`<br>Linux 6.17.0-19-generic<br>AMD Ryzen 9 9950X 16-Core Processor | 2026-08-11T01:29:39Z |
| TruffleHog | version: trufflehog 3.96.0<br>executable SHA-256: `6eb1f98fb890bf9361d8833c061e122dcb4f14fb7b71c65e603b7c096153c724` | mirror; 15,000 fixtures; 3,000 labeled positives; 2,431,242 bytes | hostname SHA-256/12: `82fcd9288623`<br>Linux 6.17.0-19-generic<br>AMD Ryzen 9 9950X 16-Core Processor | 2026-08-11T01:29:58Z |
| Kingfisher | version: kingfisher 1.94.0<br>executable SHA-256: `a49f8e9838d7f1da1e9f328a4dbc45a16996bce5078cde3ff1b8ad422d8ab07a` | mirror; 15,000 fixtures; 3,000 labeled positives; 2,431,242 bytes | hostname SHA-256/12: `82fcd9288623`<br>Linux 6.17.0-19-generic<br>AMD Ryzen 9 9950X 16-Core Processor | 2026-08-11T01:29:50Z |
| Titus | version: Titus v1.1.20 (Go port of NoseyParker)<br>executable SHA-256: `0b9c126a6c280ba28c6ed8795f88bf9bd793164c15959a34921f47a7ed276bcf` | mirror; 15,000 fixtures; 3,000 labeled positives; 2,431,242 bytes | hostname SHA-256/12: `82fcd9288623`<br>Linux 6.17.0-19-generic<br>AMD Ryzen 9 9950X 16-Core Processor | 2026-08-11T01:30:03Z |
| Nosey Parker | version: noseyparker 0.24.0 Build Configuration: Build Timestamp: 2025-05-08T21:11:15.600909923Z Commit Timestamp: 2025-05-08T17:04:47.000000000-04:00 Commit Branch: HEAD Commit SHA: 61fa4ca67e4ded1b47b3b9ecce618ae91f1ff2fe Cargo Features: color_backtrace,default,disable_trace,github,log,mimalloc,parquet,release Debug: true Optimization: 3 Target Triple: x86_64-unknown-linux-gnu Build System: OS: Ubuntu OS Version: Linux (Ubuntu 22.04) CPU Vendor: AuthenticAMD CPU Brand: AMD EPYC 7763 64-Core Processor CPU Cores: 2 rustc Version: 1.86.0 rustc Channel: stable rustc Host Triple: x86_64-unknown-linux-gnu rustc Commit Date: 2025-03-31 rustc Commit SHA: 05f9846f893b09a1be1fc8560e33fc3c815cfecb rustc LLVM Version: 19.1<br>executable SHA-256: `42d6e88bf77904866a9dda49d7cf333501e76b62e9054b112e67f81dc88e2b71` | mirror; 15,000 fixtures; 3,000 labeled positives; 2,431,242 bytes | hostname SHA-256/12: `82fcd9288623`<br>Linux 6.17.0-19-generic<br>AMD Ryzen 9 9950X 16-Core Processor | 2026-08-11T01:29:53Z |
| Betterleaks | version: betterleaks version dev<br>executable SHA-256: `466f7d34e1ebcf12ecd5939494f509c17125e54416226976fced2f046da56ba4` | mirror; 15,000 fixtures; 3,000 labeled positives; 2,431,242 bytes | hostname SHA-256/12: `82fcd9288623`<br>Linux 6.17.0-19-generic<br>AMD Ryzen 9 9950X 16-Core Processor | 2026-08-11T01:29:43Z |
<!-- BENCH:leaderboard:end -->
### 速度とメモリ
<!-- BENCH:perf:start -->
| スキャナ | 設定 | コーパス | ウォールタイム | スループット | ピークRSS |
|---|---|---|---|---|---|
| Betterleaks | `default-nocache-nodaemon-no-validate` | mirror | 0.74s | 3.1 MB/s | 198 MB |
| Nosey Parker | `default-nocache-nodaemon-no-git-history` | mirror | 0.82s | 2.8 MB/s | 285 MB |
| KeyHog | `simd-nocache-nodaemon-full` | mirror | 1.05s | 2.2 MB/s | 416 MB |
| TruffleHog | `default-nocache-nodaemon-no-verify` | mirror | 1.59s | 1.5 MB/s | 300 MB |
| Titus | `default-nocache-nodaemon-no-validate` | mirror | 2.86s | 0.8 MB/s | 115 MB |
| Kingfisher | `default-nocache-nodaemon-low-no-validate` | mirror | 4.81s | 0.5 MB/s | 402 MB |
<!-- BENCH:perf:end -->
### カテゴリ別の再現率比較
<!-- BENCH:gaps:start -->
_診断用の再現率スライスのみ。全体的な適合率とF1が比較の契約であり、誤検知はスコアリングされたカテゴリでカウントされます。_
| カテゴリ | KeyHog P/R/F1 | KeyHog TP/FN | 最良の競合 P/R/F1 | 再現率ギャップ |
|---|---|---|---|---|
| `generic-high-entropy-string` | 1.000 / 0.434 / 0.606 | 73/95 | Betterleaks 1.000 / 0.798 / 0.887 | +0.363 |
<!-- BENCH:gaps:end -->
### 境界付き静的リカバリのテレメトリ
<!-- BENCH:recovery:start -->
選択された実行: スキャナ **KeyHog** `KeyHog v0.5.70<br>Commit: d1eb2e09eb2c289181d93d719ce3f62411aeaf2c<br>Detector Set: 926 (926-4168e2c6c93a16ca)<br>Build Target: x86_64-linux<br>ML Model Version: moe-v1-246a05b92bec9aa3<br>ML Model Card: recorded 2026-07-15; features 55; synthetic F1 0.971 / P 0.945 / R 0.999; real F1 0.832 / P 0.753 / R 0.931 / [email protected] 0.938; zero-recall detectors 2/32; six-scanner differential unavailable`; コーパス **mirror** (15,000 フィクスチャ、2,431,242 バイト); 生成日時 `2026-08-11T01:29:39Z`; 成果物 `mirror-keyhog-simd-nocache-nodaemon-full.json`。
テレメトリ スキーマ: `static-recovery-v1`。
| 処遇 | 正確な数 |
|---:|
| 対応 | 0 |
| 非対応 | 0 |
| エラー | 0 |
| 拒否理由 | 正確な数 |
|---:|
| _なし_ | 0 |
<!-- BENCH:recovery:end -->
### バイグラムBloomエビデンス
<!-- BENCH:bloom:start -->
エビデンススキーマ: `bloom-evidence-v1`。
| フィールド | 正確な結果 |
|---|---|
| コーパス | `samsung-creddata-fx-record-spans-v1` |
| コーパスリビジョン | `f1de3f85dbdf42bf7b3467c0d273a4dfe44d56ee` |
| コーパスSHA-256 | `4f2de506f334521121bb5b4aef8a37bf0b8153a4f9115e7ba9392d0eed1757b9` |
| フィクスチャSHA-256 | `a0ff018dc0a64b2cc78b25999043d1a441afa0087070f4cd8d73ae82408a59b4` |
| 実行ファイルSHA-256 | `2899ee53789bff9c531f72645f6c8380a7c873230dfb2b6857079467bc8d2dcd` |
| ワークスペース検出器コーパスSHA-256 | `d87e8b3d086e9ffa4c8a94f35a717ec710d5224e52e5b4fc7e71db30677609c9` |
| スキャナ検出器ダイジェスト | `8d789251e092959f` |
| 検出器コーパスSHA-256 | `3729bd72df768187420f37e08ab64cd2b5a8bac558002d8b0844f465e9a75711` |
| Bloom拒否 | **110/51794 (0.21%)**; 51684 受理 |
| 外部可用性 | 51794 測定; 51794 宣言中 0 が明示的に利用不可; 理由: |
| 有効化 vs バイパスされた検出結果 | **同一**; 977/977 件 |
| 検出結果ID SHA-256 | `1517bad01ab5228e85b7f4fd44e72226aa3f195bc18a67d58b7a6364b6bf6e0e` / `1517bad01ab5228e85b7f4fd44e72226aa3f195bc18a67d58b7a6364b6bf6e0e` |
| Bloom密度/状態 | 1793/65536 スロット; `healthy`; 飽和点 39322 |
<!-- BENCH:bloom:end -->
検出結果IDは、検出器、ファイル、行、バイトスパン、資格情報のSHA-256を結び付けます。平文の資格情報が記録されることはありません。
再現手順: `make -C benchmarks canonical KEYHOG_BIN=/absolute/path/to/keyhog` を実行すると、実行ファイルに紐づくCredData Bloom差分を含む、KeyHog、Betterleaks、Kingfisher、Nosey Parker、TruffleHog、Titus の正確なmirror実行セットが再実行されます。`make -C benchmarks report` は上記のテーブルと `benchmarks/reports/` を再生成します。コーパス(mirror、競合のホームグラウンド、Samsung/CredData)とバックエンド/キャッシュ/デーモン/OS/GPUマトリクスについては [`benchmarks/README.md`](https://github.com/santhreal/keyhog/blob/HEAD/benchmarks/README.md) を参照してください。
## GPU対応の大規模デーモンワーカー
オプションのUnixマスデーモンは、コンパイル済みのスキャナ1つとそのキャリブレーション済みバックエンド状態をウォーム状態に保ちます。ローカルファイルシステムのスキャンは、正規のルートとソースポリシーのメタデータのみを送信します。デーモンは自身のプロセスでファイルを読み取り、バッチ処理します。クライアント側の資格情報を必要とするGit、バイナリ、リモート、クラウドソースは、保護された境界付きチャンクフレームを使用します。```sh
# Terminal 1
keyhog calibrate-autoroute --policy default
keyhog daemon start --mass
# Terminal 2, after the daemon prints its ready line
keyhog scan --daemon=mass /srv/inventory/team-a \
--format json-envelope --output team-a.json
keyhog daemon stop
--daemon=mass は必須のルートです。プロセス内で再試行することはありません。各バッチは、総入力サイズに関係なく、8 MiB と 1,024 チャンクに制限されます。すべてのインベントリパーティションについて、カバレッジエンベロープ、終了ステータス、ターミナル実行レシートを保持してください。
デーモンのライフサイクル、ルーティング、およびレシート および インベントリのパーティショニング を参照してください。
システム全体の認証情報トリアージ```sh
sudo keyhog scan-system --space 50G sudo keyhog scan-system --include-network --output system-findings.json
`scan-system` は制限付きローカルホスト監査であり、リポジトリまたは
クラウドのインベントリ分割の代替ではありません。パスではなく、スキャンする総バイト数によって
範囲を制限します。`--space` が上限であり、ネットワークマウントされたファイルシステムは
`--include-network` を渡さない限りスキップされます。実行前にマウント、ネットワークファイルシステム、
スペース上限、特権の動作を確認してください。
[システム全体のトリアージ](https://santhreal.github.io/keyhog/guides/system-wide-triage.html) を参照してください。
## 機密性の高いローカルスキャンのロックダウン
Linux `--lockdown` はフェイルクローズのプロセス保護モードです:```sh
keyhog scan . --daemon=off --lockdown
現在および将来のメモリをロックし、コアダンプとインクリメンタルキャッシュを無効にし、プロセス内に留まり、検証、平文出力、高速モード、および完全性を低下させるスイッチを拒否します。サポートされていないプラットフォームまたはロックされたメモリ容量が不十分な場合には失敗します。ハードニングとデータの取り扱い を参照してください。
KeyHogをRustライブラリとして使用する```rust
use keyhog_core::{Chunk, ChunkMetadata, RawMatch}; use keyhog_scanner::CompiledScanner;
let detectors = keyhog_core::load_embedded_detectors_or_fail()?; let scanner = CompiledScanner::compile(detectors)?; let findings = scanner.scan(&Chunk { data: "TOKEN=sk_live_EXAMPLE…".into(), metadata: ChunkMetadata::default(), })?; let report_safe: Vec<_> = findings.iter().map(RawMatch::to_redacted).collect();
デフォルトのライブラリメソッドは、決定的でポータブルなCPU参照実装です。明示的なバックエンドメソッドは、プロセスを終了させたり、別のエンジンを静かに代替したりする代わりに、型付きエラーを返します。生のチャンクとマッチには平文が含まれる可能性があります。JSON、ログ、ディスク、ネットワーク境界を越える前に、`RawMatch::to_redacted` で変換するか、最終的な `VerifiedFinding` 値を使用してください。
[アーキテクチャガイド](https://github.com/santhreal/keyhog/blob/HEAD/docs/src/architecture.md) は、クレートの所有権、バックエンド契約、リカバリレシート、ソースヘルパー、および安全なレポート境界を定義します。クレートレベルのRustドキュメントが完全なAPIを所有します。
## 明示的な優先順位でポリシーを設定する
リポジトリポリシーは `.keyhog.toml` にあります:```toml
verify = false
[scan]
severity = "high"
incremental = true
[system]
gpu = "auto"
解決順序は、組み込みのデフォルト、ユーザー設定、リポジトリ
設定、文書化されている環境変数、そして明示的なCLI上書きの順です。
未知のキーや無効な組み合わせは、スキャン前に失敗します。
keyhog config --effective を実行すると、プロキシ認証情報を公開せずに
解決済みポリシーを確認できます。
expires を過ぎたエントリは、スキャン前に許可リストの読み込みに失敗します。
すべてのキーについては 設定と優先順位 を、 認証情報とランタイム入力については 環境変数 を 参照してください。
アーキテクチャ
KeyHogは、オーケストレーションをエッジに、ドメイン動作をライブラリに保持します:```text sources -> scanner -> suppression/confidence -> reporting -> optional verifier CLI and Action own process, transport, and exit semantics.
検出器定義は `detectors/` 配下のデータのままです。`keyhog-core` は
検出器とファインディングの型を担当し、`keyhog-scanner` はマッチングと実行
バックエンドを担当し、`keyhog-sources` は入力取得を担当し、`keyhog-verifier` はライブ
チェックを担当し、`keyhog-cli` はオペレーターワークフローを担当します。
まず [アーキテクチャガイド](https://github.com/santhreal/keyhog/blob/HEAD/docs/src/architecture.md) から始めてください。リポジトリの
マップ、依存関係の方向性、バイト列からファインディングへのパイプライン、ルーティングの所有権、および
プロファイリングのエントリーポイント。
## インストールの確認と拡張```sh
keyhog detectors --search aws --verbose
keyhog explain aws-access-key
keyhog backend --autoroute --json
keyhog completion zsh
CLIリファレンス
には、すべてのコマンド、フラグ、生成されるデフォルト値、終了ステータスが記載されています。
keyhog --help と keyhog <command> --help でインストールされている正確なバージョンのヘルプを確認してください。
コントリビューション
- 新しいディテクターを追加しますか?
detectors/にTOMLを置き、PRを 開いてください。コントリビューターガイド(CONTRIBUTING.md)には スキーマと実例が記載されています。 - バグ / 検出漏れ / 誤検知? マスク済みの認証情報の形式とディテクターIDを添えて
issueを登録してください。各報告は
crates/scanner/tests/contracts/配下の 恒久的なテストフィクスチャになります。 - リリースの挙動について?
mainブランチのCIが成功するたびにパッチバージョンが 上がり、チェンジログが生成され、6つのクレートすべてがcrates.ioに公開されます。changes/の下に任意のフラグメントを追加して、正確なメモを残せます。 リリースガイド には、 自動トランザクションとアップロード失敗時の復旧手順が記載されています。 - KeyHog自体のセキュリティ問題ですか? 公開issueを開かないでください。
GitHubの非公開の脆弱性報告 を利用してください。
そのフォームが利用できない場合は、
[email protected]宛にメールしてください。PGPは必要ありません。
クレジット
KeyHogは、これまでのシークレットスキャンの成果の上に成り立っています。以下のプロジェクトからアイデアを借用しました:
- TruffleHog: ディテクターの網羅性と検証のセマンティクス
- Betterleaks: トークン効率と誤検知の抑制
- Titus: スキャンの使いやすさと重大度のキャリブレーション
これらのプロジェクトとそのコントリビューターに感謝します。
ライセンス
ライセンス: MIT OR Apache-2.0。
条件: MIT および Apache-2.0。このデュアルライセンスは、コードと ディテクターのTOMLに適用されます。商用利用、組み込み、フォーク、ホステッドサービスは、 どちらのライセンスでも許可されています。
スター履歴
GitHubの公開スター数のUTC観測値 から生成されています。リポジトリは最初の観測点と、その後の各カウント遷移を保存します。同日の再実行はその日の観測点を置き換え、カウントに変化がなければコミットは作成されません。