powered by TechFeed
表示モード
Anthropic

Claude Codeの「次回から確認しない」ボタンが1,122件のGitHubリポジトリに本番パスワードを漏洩 — 削除しても履歴に残り、既存スキャナーでも検出不能なケースも

11月7日、madrobot.blogが「Claude Code's "Don't ask again" button left passwords and API keys in 1,122 public GitHub files, researchers say」と題した記事を公開した。この記事では、AnthropicのAIコーディングエージェント「Claude Code」の「再確認不要」ボタンが、パスワードやAPIキーをGitHubに公開してしまう問題について詳しく報告されている。

11月7日、madrobot.blogが「Claude Code's "Don't ask again" button left passwords and API keys in 1,122 public GitHub files, researchers say」と題した記事を公開した。この記事では、AnthropicのAIコーディングエージェント「Claude Code」の「再確認不要」ボタンが、パスワードやAPIキーをGitHubに公開してしまう問題について詳しく報告されている。


ボタン1クリックで本番パスワードがGitHubに

セキュリティ企業Apiiroが11月5日に公開した調査レポートによると、Claude CodeのUIにある「Yes, and don't ask again(はい、次回から確認しない)」ボタンを押すと、シェルコマンド文字列がそのまま .claude/settings.local.json というファイルに書き込まれる。問題は、コマンド中にデータベースのパスワードやAPIトークンが含まれていた場合、それが平文でファイルに残る点だ。

なお、Apiiroはセキュリティ製品を販売する企業であり、利益相反の可能性がある点は念頭に置いておきたい。また、後述するが、調査で「実際のシークレット」と判定されたものは既知のキー形式への合致や公開ホストへの参照を根拠としており、使用可能であることが個別に確認されたものではない(1社のみが有効性を確認済み)。

Apiiroがこのファイルの公開コピー104,185件をGitHub上で調べたところ、1,122件に実際のシークレットが含まれていた。さらにgitの履歴やチームで共有する設定ファイル、エージェントのチャットログも含めると、1,994リポジトリに2,539件のシークレットが存在するという。

露出した認証情報の中には以下が含まれる:

  • あるデータベースベンダー自身の管理者レベルのクラウドキー
  • 本番環境のAzure PostgreSQLパスワード
  • Squareの本番トークン
  • 医療記録アプリのデータベースオーナーパスワード

影響を受けた組織は63社(大半がソフトウェア企業)で、うち1社は漏洩したキーが実際に有効だったことをApiiroに確認している。


なぜファイルが外部に出てしまうのか

Claude Codeはシェルコマンドを実行する前にユーザーへ確認を求める。「Don't ask again」を選ぶと、そのコマンドが「allowルール」として .claude/settings.local.json に保存される仕組みだ(公式パーミッションドキュメントに記載がある)。

このファイルは本来、ローカルに留まることが想定されている。設定ドキュメントによれば、gitリポジトリ内で初めてファイルを書き込む際に、開発者のグローバルgit excludes(~/.config/git/ignore 等)に追記することでコミットを防ぐ設計だ。

しかしApiiroはこの保護に抜け穴があると指摘する:

  • フォルダを後からgitリポジトリにした場合
  • 別のマシンでクローンした場合
  • ファイルがすでにコミット済みだった場合
  • プロジェクト自身の .gitignore にはルールが追加されない

漏洩した1,105リポジトリのうち539件では、Claude共同編集のコミットによってこのファイルが変更されていた。

さらに別のバグレポート(GitHub issue #77530)では、承認ルールがチームで共有する .claude/settings.json に書き込まれるケースも報告されている。Apiiroはこのファイルの公開コピー76,011件のうち298件にシークレットを発見した。


「ファイルを消しても解決しない」

漏洩リポジトリの中央値では、問題のファイルが最初にコミットされてからApiiroの調査時点(11月2日)まで217日が経過していた。誰かがファイルを削除しても、gitの履歴には残り続ける。古いバージョンには509リポジトリで734件のシークレットが残存しており、211のフォークも同じ内容を引き継いでいる。

標準的なシークレットスキャナーでも検出漏れが多い。1,122ファイルのうち、gitleaksが検出したのは564件、TruffleHogは643件、215件はどちらでも検出されなかった。理由は、PGPASSWORD=xxx や sshpass -p xxx、mysql -p xxx のように、コマンド引数としてパスワードが埋め込まれている形式が既知のパターンに合致しないためだ。

また、このファイルは「Don't ask again」を押したすべてのマシン上にも平文で存在する。先月発覚したLiteLLMパッケージの侵害やCursorのClaude Code拡張へのバックドアが示したように、マルウェアはすでに開発者マシン上の認証情報を標的にしている。

Apiiroによれば、この問題はClaude Code自体の実装によるもので、AIモデルの挙動ではない。元記事によれば複数バージョンで再現を確認しており、ドキュメントを比較した16種類のコーディングエージェントの中で、承認済みコマンドをデフォルトでプロジェクトファイルに完全な形で書き込むのはClaude Codeのみだったという。

ユーザーからの問題報告は2025年8月からClaude CodeのGitHub上に存在していたが、Apiiroが引用した4件の報告にはAnthropicからの返答がなく、3件は非アクティブまたは重複として自動クローズされていた。Anthropicはこの調査に対してコメントを出していない。


今すぐやるべき対処

Apiiroは以下の対処を推奨している。

  • 検索する: GitHub組織内で .claude/settings.local.json と .claude/settings.json を検索し、ファイルが削除済みでもgit履歴を確認する。
  • まずローテーション: ファイルに含まれていたすべてのパスワード・トークン・キーを変更する。削除しても履歴・フォーク・他人のクローンには残り続けるためだ。
  • 追跡を外す: git rm --cached .claude/settings.local.json を実行し、プロジェクトの .gitignore に追加する。
  • ローカルも確認: 自分のマシン上のファイルを開き、シークレットを含むallowルールを削除する(コミットされていなくても平文で残っている)。
  • コマンドに直接シークレットを書かない: $DB_URL のような変数で参照し、Bash(npm run:*) のようなパターンで承認する運用に切り替える。

今週はClaude Codeを巡るセキュリティ問題が相次いでおり、ユーザーのメールアドレスをウェブサイトに渡していた別の問題も同時期に発覚している。開発者の手間を省くために作られたボタンが、本番環境の認証情報を静かに外部へ送り出していた。対処の基本は「削除」ではなく「ローテーション」だ。

詳細はClaude Code's "Don't ask again" button left passwords and API keys in 1,122 public GitHub files, researchers sayを参照していただきたい。