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)

- 検出値が実在の機密と擬似値のどちらなのか、コードからは断定できない場合。
- 既にコミット済みの機密について、履歴除去・鍵ローテーションの要否が運用判断を要する場合。