Claude Codeで認証情報が漏洩:「Yes, and don’t ask again」が原因
Claude Codeの認証情報漏洩。「Yes, and don’t ask again」でGitHubの公開ファイル1,122件に秘密情報が残りました。該当するか確認を。
この記事の他の言語版:العربيةDeutschEnglishEspañolFrançaisItalianoPolski简体中文
11月5日、Apiiroの研究者Shmulik CohenとMatan Giladiが、Claude CodeからGitHubへの認証情報漏洩についてレポートを公開しました。.claude/settings.local.json ファイルの公開コピー 104,185件 を調べたところ、秘密情報を1つ以上含むファイルが1,122件 見つかり、異なるパスワード、APIキー、トークンは合計1,379個にのぼりました。
Claude Codeの認証情報漏洩はどんな仕組み?
Claude Codeがターミナルのコマンド実行の許可を求めてきたとき、「Yes, and don’t ask again」を選べます。Claude Codeのドキュメントによると、この許可はプロジェクト内の .claude/settings.local.json ファイルに allow ルールとして保存されます。
問題は、このルールが承認したコマンドを、中に書いた内容ごと丸ごと保存することです。たとえば PGPASSWORD=… psql … や、ヘッダーにAPIキーを入れた curl のように、コマンドにパスワードが含まれていれば、そのパスワードが平文のままファイルに残ります。
興味深いのは、これが新しい発見ではないことです。2025年8月には、まさにこの問題がissue #5544で報告されていました(APIキーやJiraトークンの例つき)。このissueは60日間動きがなかったため、2026年1月3日にbotによって「not planned」としてクローズされ、修正はされていません。
ローカルのファイルなのに、なぜGitHubに?
このファイルは本来プライベートなものです。Claude Codeは最初に書き込むとき、コミットに入らないように **/.claude/settings.local.json をgitのグローバル除外ファイルに追加します(ドキュメントにそう書かれています)。
ただし、この保護にはいくつか穴があります。
- グローバル除外はそのマシン1台でしか効かず、リポジトリと一緒には移りません。
- ファイルを手動で作った場合、Claude Codeは除外しないので、自分で
.gitignoreに追加する必要があります。 - 無視ルールはgitがすでに追跡しているファイルには効かないため、一度コミットされたファイルはその後のコミットにも入り続けます。
- リポジトリからファイルを削除しても、履歴やフォークからは消えません。
iTWireによると、追跡した1,105件のリポジトリのうち539件で、Claudeが共同作成者になっているコミットがこのファイルを変更していました。
規模はどのくらい?
レポートの数字(11月1〜3日に公開GitHubから収集したデータ)は次のとおりです。
settings.local.jsonの公開コピー 104,185件 のうち、1,122件(約1.1%)に秘密情報が1つ以上含まれていました。- これらのファイルには 1,379個 の異なる値がありました。
- gitの履歴、共有ファイル
.claude/settings.json、保存されたエージェントとの会話まで含めると、1,994件のリポジトリで2,539個の秘密情報になります。 - Apiiroは11月2日と3日に企業へ通知し、そのうち1社は流出したキーが有効だったと認めました。
ひとつ注意点があります。Apiiroは、見つかった認証情報が実際に使えるかどうかは確認していません。誤検知フィルターと言語モデルによる判定で候補を絞り込んだだけなので、一部はすでに無効だった可能性があります。
なぜ話題になっている?
レポートは土曜の夜にHacker Newsのトップページに載りました。「don’t ask again」は、エージェントが同じことを何度も聞いてこないようにするためのものなので、実際に何が保存されたのかを忘れがちです。
これは、今の秘密情報がアプリのコードからだけでなく、エージェントの設定ファイルからも漏れることを示す新たな例でもあります(OpenCodeの情報漏洩と同じように)。今のところ、報道の中にAnthropicからの回答は見当たりません。
今後、何に気をつけるべき?
- 公開リポジトリのこのファイルに一度でも入ったパスワードやキーは、まず無効化して新しいものに替えましょう。履歴の掃除はそのあとです。
- ファイルが追跡されているか確認しましょう:
git ls-files .claude。追跡されていたら追跡をやめ(git rm --cached .claude/settings.local.json)、グローバルだけでなくリポジトリ自体の.gitignoreにも追加しましょう。 - 履歴(
git log --all -- .claude/settings.local.json)、共有の.claude/settings.json、保存されたエージェントとの会話も確認しましょう。 - パスワードをコマンドに直接書かないこと。 環境変数やシークレットマネージャー経由で渡し、
allowルールにはドキュメントにあるBash(npm run test *)のようなパターンを使うほうが安全です。
APIキーをエージェントから遠ざける方法はAIエージェントのセキュリティのガイドで詳しく書いています。ツールの基本はClaude Codeチュートリアルをどうぞ。
FAQ
Claude Codeが勝手にパスワードをGitHubに送るのですか?
いいえ。settings.local.json ファイルは手元のディスクに残ります。漏洩が起きるのは、ファイルがコミットに入り、公開リポジトリに載ったときだけです。
自分のsettings.local.jsonがリポジトリに入っているか確認するには?
プロジェクトのディレクトリで git ls-files .claude を実行するだけです。一覧に settings.local.json があれば、gitが追跡しています。ファイル自体を開いて、allow ルールにパスワード、トークン、キーがないか探すのもおすすめです。
リポジトリからファイルを削除すれば十分ですか?
いいえ。ファイルはgitの履歴やフォークに残ります。だからこそ、流出した認証情報を無効化して替えることが最も重要です。