Secret / Credential Scan 機密情報の混入検出 · v0.1.0 · 2026-06-29 · sha256 7e5921f3208cf89a
Secret / Credential Scan 機密情報の混入検出 v0.1.0A
Immutable. This exact content is served forever at /api/v1/blob/7e5921f3208cf89a.
--- id: 'secret-credential-scan' name: 'Secret / Credential Scan 機密情報の混入検出' description: '差分に追加された API キー・トークン・credential・秘密鍵・.env 値・個人ローカルパスなどの機密情報を、言語・ファイル種別に依存せず検出する。決定論的に判定できる範囲は CI(gitleaks 等)へ移譲しつつ、レビューで取りこぼしを補足する' version: 0.1.0 category: midstream phase: midstream applyTo: - '**/*' tags: [secret, credential, midstream] severity: major inputContext: [diff] outputKind: [findings, actions] modelHint: balanced dependencies: [code_search] exclude: - '**/package-lock.json' - '**/pnpm-lock.yaml' - '**/yarn.lock' - '**/*.lock' - 'dist/**' - '**/*.min.*' - '**/*.map' - '**/*.snap' --- ## Pattern declaration Primary pattern: Reviewer Secondary patterns: Inversion Why: 機密情報の検出はパターン的・決定論で判定できる領域が大きく、本来は CI に委ねるべき。一方で CI 未整備のリポジトリや、CI が見ない種別(個人パス・ローカル設定)を補足する補助レビューとして機能する。秘匿情報を含む追加が無ければ実行を止めるゲートが必要。 ## Goal / 目的 - 差分へ**新規追加された**機密情報を、言語やファイル種別を問わず検出する。対象は API キー / トークン / credential / 秘密鍵 / `.env` 値 / 個人ローカルパス / ローカル固有設定とする。 - 既存の言語限定 secret チェック(`rr-midstream-security-basic-001` は `.ts/.tsx/.js/.jsx`、`rr-midstream-config-json-001` は `.json/.yml`)が見ない種別・ファイルの取りこぼしを補う。 ## Non-goals / 扱わないこと - アプリコード内の SQLi / XSS など機密以外のセキュリティ(`rr-midstream-security-basic-001` の領域)。 - BaaS のルール/鍵露出(`rr-midstream-firebase-security-rules-001` / `rr-midstream-supabase-rls-policy-001` の領域)。 - 決定論で完全な判定ができる検出を恒久的な肩代わりとすること(本スキルは CI = gitleaks / trufflehog 等の導入を促し、移譲する)。 ## Pre-execution Gate / 実行前ゲート このスキルは以下の条件がすべて満たされない限り `NO_REVIEW` を返す。 - [ ] 差分の**追加行**に、機密情報の候補(高エントロピー文字列・`API_KEY`/`SECRET`/`TOKEN` 等のキー・`-----BEGIN ... PRIVATE KEY-----`・`/Users/` や `/home/`、`C:\Users\` で始まる個人パス・`.env` 実値行)が含まれている - [ ] inputContext に diff が含まれ、`code_search`(grep)が利用可能である ゲート不成立時の出力: `NO_REVIEW: secret-credential-scan — 機密情報の候補が差分に検出されない` ## False-positive guards / 抑制条件 - プレースホルダ・例値(`xxx` / `your-api-key` / `dummy` / `example` / `<...>` / `***`)は指摘しない。 - `.env.example` / `.env.sample` / `.env.template` などサンプルファイルの**プレースホルダ**は指摘しない(実値が入っていれば指摘する)。 - テストフィクスチャ・ドキュメントの**明らかな擬似値**は指摘しない。実在しうる形式(本物の鍵長・接頭辞 `sk-` / `ghp_` / `AKIA` 等)の場合のみ指摘する。 - 既に環境変数参照(`process.env.X` / `os.environ[...]`)に置き換わっている場合は指摘しない。 - 既存行(差分の文脈行)にあるだけで追加・変更されていない機密は対象外(追加・変更行のみ)。 ## Rule / ルール ### 検出ロジック 1. **候補抽出**: 差分の追加行から次の機密候補を抽出する。 - 鍵名(`API_KEY`/`SECRET`/`TOKEN`/`PASSWORD`/`CREDENTIAL`)への実値代入 - 既知接頭辞(`sk-`/`ghp_`/`AKIA`/`AIza` 等)や `-----BEGIN ... PRIVATE KEY-----` - 高エントロピー文字列、個人パス(`/Users/<name>/`、`/home/<name>/`、`C:\Users\<name>\`)、実値入り `.env` 行 2. **実値判定**: プレースホルダ・例値・環境変数参照を `code_search` で確認して除外し、実在しうる値のみ残す。 3. **報告**: 該当箇所を `<file>:<line>` で示し、機密の種別と推奨対応(環境変数 / Secrets への移動、コミット履歴からの除去、CI secret-scan の導入)を述べる。値そのものは出力に再掲しない(マスクする)。 ### 制約 - 検出は最大 5 件。実害の大きいもの(本物の鍵・credential)を優先する。 - 各指摘に「種別」「混入箇所」「推奨対応」を必ず含める。 - 機密の値そのものは出力へ再掲せず、種別と位置のみ示す。 - 決定論で完全に検出できる範囲は「CI(gitleaks 等)での恒久ガードを推奨」と必ず併記する。 ## Evidence / 根拠の取り方 - 混入箇所は必ず `<file>:<line>` に紐づけ、推測で「秘密だ」と断定しない。 - プレースホルダか実値かの判定根拠(接頭辞・鍵長・形式)を具体的に示す。 ## Output / 出力フォーマット すべて日本語。 ```text (secret-scan):1: [要約] 最も重大な機密混入は〈1文〉 <file>:<line>: [機密混入1] <タイトル> 種別: <API キー / トークン / 秘密鍵 / credential / 個人パス / .env 実値> 混入: <どこに何が追加されたか(値はマスク)>(<file>:<line>) 影響: <漏洩リスク / 権限奪取 / 環境依存の壊れ> Fix: <環境変数・Secrets への移動/履歴からの除去/CI secret-scan(gitleaks 等) の導入> ``` ## 評価指標(Evaluation) - 合格基準: 実在しうる機密のみを `<file>:<line>` で示し、プレースホルダ・例値・環境変数参照を誤検出していない。値を再掲していない。 - 不合格基準: プレースホルダへの誤検出、既存行への指摘、値の再掲、機密と無関係な高エントロピー文字列(ハッシュ・UUID)への難癖。 ## 人間に返す条件(Human Handoff) - 検出値が実在の機密と擬似値のどちらなのか、コードからは断定できない場合。 - 既にコミット済みの機密について、履歴除去・鍵ローテーションの要否が運用判断を要する場合。