Claude Code「もう聞かないで」が秘密鍵2,539件をGitHubに流出
Apiiroの調査で、Claude Codeの「はい、もう聞かないで」が承認済みコマンドを秘密情報ごとsettings.local.jsonに保存し、公開GitHubの1,994リポジトリに2,539件の認証情報が残っていたことが判明。原因と6ステップの対処を解説。
「はい、もう聞かないで」が秘密鍵をGitHubに置いていった
2026年11月5日、アプリケーションセキュリティ企業のApiiroが衝撃的な調査結果を公表しました。Claude Codeの権限ダイアログで「Yes, and don't ask again(はい、今後は聞かないで)」を選ぶと、その承認したシェルコマンドが文字通りそのままプロジェクト設定ファイルに保存されます。コマンドにデータベースのパスワードが含まれていれば、パスワードも平文で保存される、というものです。
Apiiroはこの.claude/settings.local.jsonを調査し、公開GitHub上に2,539件の実際の秘密情報が1,994リポジトリにまたがって存在していたと報告しました。63組織が影響を受け、そのうち1社は「漏れたキーは実際に有効だった」と確認しています。
これは特定のツールのバグというより、AIコーディングエージェントの設計思想と人間の癖が噛み合った結果です。そして修正はまだ入っていません。
何が起きているのか:仕組みを正確に
Claude Codeは既定ではシェルコマンドを実行する前に確認を求めます。ここで「もう聞かないで」を選ぶと、許可ルールがリポジトリ直下の.claude/settings.local.jsonに書き込まれ、以降のセッションでは同じコマンドが無確認で走ります。
問題は、保存される「ルール」がコマンド文字列そのものだという点です。npm test *のようなパターン提示ならパターンだけが保存されますが、psql postgres://admin:P@ssw0rd@prod-db:5432/appのような具体コマンドなら、パスワード込みの文字列がそのまま保存されます。
彼らはOpus 5.5とFable 5.1でもこの挙動を再現しました。つまりモデルを新しくしても直らない、ハーネス側の挙動です。
数字で見る被害規模
Apiiroが2026年11月1日〜3日に収集したデータは次の通りです。公開GitHub上の.claude/settings.local.jsonのコピー数は104,185件、そのうち実際の秘密情報を含むファイルが1,122件(約1.1%)、異なる秘密情報は1,379件。既知のプロバイダ形式に一致するキー636件、公開ホストと並んで書かれたパスワード・トークン743件。現在のファイルからは消えているが古いコミットに残る秘密情報が734件(509リポジトリ)、同じ秘密情報を引き継いだフォークが211フォーク(74リポジトリ)、共有設定.claude/settings.jsonに298件(76,011件中)。総計2,539件(1,994リポジトリ、63組織)です。
内訳も生々しいです。サービスAPIトークン398件、データベースのパスワード379件、AIモデルのAPIキー149件、Supabaseのサービスロールキー122件、Google APIキー110件、SSHサーバーログイン43件。最も深刻な例として、データベースベンダーの管理者権限クラウドキー、Squareの本番トークン、医療記録データベースのオーナーパスワードが挙がっています。影響を受けたリポジトリの半分は、このファイルをデフォルトブランチに217日以上置いたままでした。
なぜgitignoreで防げなかったのか
Claude Codeはこのファイルをグローバルgitignoreに追加しようとします。しかし、フォルダが後からgitリポジトリになった場合は効かず、別マシンにcloneした人にはその設定が存在しません。そして何より、ルールがプロジェクト自身の.gitignoreには入らない。
結果として、開発者もエージェント自身もこのファイルをコミットしてしまいます。追跡できた1,105リポジトリのうち539リポジトリで、Claudeがco-authorとして参加したコミットが秘密情報入りのファイルを変更していました。「AIが自分でやらかす」構造になっているわけです。
検出ツールも半分は見逃がした
Apiiroは既存の秘密情報スキャナとも比較しました。gitleaksは564件、TruffleHogは643件を検出しましたが、215件はいずれも検出できませんでした。スキャナ通過=安全ではない、というのが実測値です。なお16のコーディングエージェントのドキュメント比較では、「承認した完全なコマンドを既定でプロジェクトファイルに保存する」のがClaude Codeだけでした。
Anthropicの対応はまだ
ユーザーはこの挙動を2025年8月からGitHub issueで報告しています(#5544、#11982、#13106、#91270)。Apiiroによれば「いずれもAnthropicから返信はなく、3件は無応答・重複として自動クローズされた」。2026年11月7日時点で公式の修正は出ていません。Apiiroは11月2日〜3日に影響を受けた63組織すべてに通知済みです。
今日やるべきこと:6ステップ
順番が重要です。消すより先に、無効化(ローテーション)する。ファイルを削除しても、git履歴・フォーク・クローンには残るからです。自組織のリポジトリで.claude/settings.local.jsonと.claude/settings.jsonを検索し、消えているリポジトリもgit履歴を確認。次に過去に含まれていた全パスワード・トークン・キーをローテーション。その後で追跡を外します。
git rm --cached .claude/settings.local.json
そしてリポジトリ自身の.gitignoreに追記します。グローバル設定ではなくプロジェクトに持たせるのが要点です。コミットしていなくても手元のファイルを開き、秘密情報を含む許可ルールを全部削除してください。今後は$DB_URLのような環境変数・シークレットマネージャ経由の参照にし、Bash(npm run:*)のようなパターン承認を使います。プロンプトがパターンを提示しているなら必ずそちらを選ぶことが防御になります。
教訓:ハーネスの既定値が漏洩を決める
この事件は「Claude Codeが危険」という話ではありません。同じ週にはClaude CodeがユーザーのメールアドレスをWebサイトに送信していたという報告も出ています。どちらもモデルの賢さではなく、エージェントを取り巻く既定値が何を外に出すかを決めているという構図です。
- 「もう聞かないで」は、押す前に何を書き込むか理解する。便利さと引き換えに平文の秘密情報がリポジトリに定着します。
- ローテーションを先に。git履歴は消えないので、削除は後回しで構いません。
- 秘密情報スキャナは補助輪。215件の見逃しは、スキャナ通過=安全ではないことを示しています。
セキュリティレビューの対象は「AIが書いたコード」から「AIが何を設定ファイルに書き残すか」へ移っています。そこを見ない限り、同じ漏洩は別のツールで再発します。