Claude Code の「今後は確認しない」はコマンド文字列ごと保存する:パスワード入りコマンドで使わない
許可ダイアログで「Yes, and don't ask again」を選ぶと、承認したコマンドがそのまま .claude/settings.local.json の許可ルールになる。コマンドにパスワードや API キーを直書きしていると、それが平文で残り、コミットされれば公開される。
何が起きたか(Apiiro の調査)
- 公開 GitHub 上の
settings.local.json104,185 件のうち 1,122 件(約 1.1%)に秘密情報 1,379 件。DB パスワードが 379 件、AWS キーが 23 件。削除済みでも過去の版に 734 件が残っていた。 - gitleaks と TruffleHog の両方が見逃したものが 215 件。コマンド中のパスワードは「キーの形」をしていないので、形式マッチ型スキャナーでは普通の単語に見える。
- Claude Code は初回作成時にこのパスをユーザーのグローバル git 除外設定へ足すが、リポジトリの
.gitignoreには入らない。別の端末で複製した場合や、手作業でコミットした場合は守られない。
対策
- 先に鍵を無効化・再発行する。 ファイルを消しても履歴とフォークに残るので、一度でも記録された認証情報はすべてローテーションする。
- 管理対象から外して除外する。
bash
git rm --cached .claude/settings.local.json echo ".claude/settings.local.json" >> .gitignore - 秘密はコマンドに書かず、環境変数(
$DB_PASSWORDなど)で参照する。 許可ルールに残るのは変数名だけになる。 - 許可は個別コマンドでなくパターンで与える(例:
Bash(npm run:*))。「今後は確認しない」で生のコマンドを固定しない。 - 既存リポジトリの
.claude/配下と AI の会話記録を、形式マッチ以外(エントロピー、接続文字列、-p/--password引数)でも検索する。
注意
- モデルではなく Claude Code 本体の動作(Opus 5.5 でも再現)。開発責任者は秘密情報スキャンなどの対策を試作中と説明している。対策が入るまでは運用で防ぐ。
- 関連: AI エージェントの API キーを 10 分で棚卸しする:権限・期限・共有の 3 点を見る と合わせて確認する。