Claude Code:「Yes, and don't ask again」でパスワードが .claude/settings.local.json に残る。コマンドに秘密を直書きしない
許可の確認で「Yes, and don't ask again」を選ぶと、その時のコマンドが allow ルールとして .claude/settings.local.json に保存される。コマンドにパスワードやトークンを直接書いていると、それも平文で残る。秘密は環境変数で渡し、ファイルはリポジトリの .gitignore にも入れる。
何が起きているか
- Apiiro が公開 GitHub を調べたところ、
.claude/settings.local.json約10万4千件のうち 1,122 件に本物とみられる秘密が入っていた(The Hacker News が 2026-11-07 に報道)。DB のパスワードが最も多く、SSH ログイン、GitHub/npm のトークン、AWS キーなども見つかった - 保存されるのは、確認画面の選択肢に出ていた範囲。
npm test *のようなパターンのこともあれば、コマンドそのもののこともある。後者だとPGPASSWORD=...、mysql -p...、sshpass -p ...などがそのまま残る - 公式ドキュメントでは、Claude Code はこのファイルを初めて書くときに「グローバルの git excludes」(
core.excludesFile、未設定なら~/.config/git/ignore)へ**/.claude/settings.local.jsonを足す。守られるのはそのパソコンの git だけで、リポジトリの.gitignoreには入らない。手で作ったファイル、すでにコミット済みのファイル、別マシンや CI でのコミットは守られない - gitleaks や TruffleHog は、コマンド中に埋まったパスワードを見逃しやすい(Apiiro の検証では2割ほどがどちらにも検出されなかった)
やること
- まず自分のリポジトリの履歴を調べる(消したファイルも履歴とフォークに残る)
bash
git log --all --oneline -- .claude/settings.local.json .claude/settings.json
git grep -nE 'PGPASSWORD=|sshpass -p|mysql .*-p[^ ]|Bearer [A-Za-z0-9_-]{20,}' $(git rev-list --all) -- .claude/ 2>/dev/null | head- 一度でも入っていた秘密は、先に無効化・再発行する(掃除より先)
- 追跡をやめて、プロジェクトの
.gitignoreに入れる
bash
git rm --cached .claude/settings.local.json
echo '.claude/settings.local.json' >> .gitignore- コミットしていなくても、手元のファイルを開いて秘密入りのルールを消す(npm パッケージ、Docker イメージ、同期フォルダに紛れ込むことがある)
- これからは秘密を変数で渡す。保存されるのは変数名だけになる
bash
psql "$DATABASE_URL" -c 'select 1' # 良い: ルールに残るのは $DATABASE_URL
# 悪い: PGPASSWORD=hunter2 psql -h db.example.com ...- 承認はコマンド単位ではなくパターンで(例:
Bash(npm run *))。確認画面の選択肢に何が書かれているかを見てから選ぶ
注意点
- 共有用の
.claude/settings.jsonは最初からコミットされる。手で allow ルールを書くときも秘密を入れず、スキャン対象に含める .claude/.cursor/.gemini/などエージェントのフォルダは.envと同じ扱いで pre-commit/CI のシークレットスキャンに入れる- 似た「エージェントの設定ファイルが勝手に書き換わる」話は 他のアプリがエージェントの設定を書き換えていないか点検する(Postman Desktop が Claude Code/Codex にプラグインを自動導入した件) も参照
出典
- X: @Lattice_Node(未登録アカウント。点検用プロンプトは続きの投稿。下の一次情報で裏取り)
- The Hacker News(Apiiro の調査の報道, 2026-11-07): thehackernews.com
- Claude Code ドキュメント(Settings: settings.local.json の扱い): code.claude.com
- Claude Code ドキュメント(Permissions: 「don't ask again」の保存先): code.claude.com