サイバーセキュリティ

Claude Codeがパスワードを平文保存、GitHubで1122ファイルが公開状態に

Susan Hill
Googleで追加する

AnthropicのClaude Codeは、ほとんどのシェルコマンドを実行する前に許可を求めます。選択肢のひとつが「Yes, and don’t ask again(はい、次回から確認しない)」です。データベースへのログイン情報など、パスワードを含むコマンドでこれを選ぶと、Claude Codeはパスワードごとコマンド全体を、プロジェクト内のプレーンテキスト形式の設定ファイルに書き込むことがあります。セキュリティ研究者たちは今回、そうしたパスワードやキーが何千件もGitHub上の公開コードリポジトリに置かれ、誰でも読める状態になっているのを発見しました。

Claude Codeを使っているなら、探すべきファイル名はsettings.local.jsonです。リポジトリのルートにある隠しフォルダー「.claude」内に置かれ、対策をしない限り、プロジェクトと一緒に移動します。この挙動は、ツールが利用できるすべての国で同じです。使い方を変えるのにかかるのは1分ほどですが、漏えいしたパスワードの後始末には、はるかに長い時間がかかります。ファイルを削除しても、gitの履歴や他の人が作ったフォークからは消えないためです。

ソフトウェアセキュリティ企業Apiiroは、公開されているGitHubを調査し、103,617のリポジトリでファイルのコピーを104,185件発見したと、The Hacker Newsが報じた同社の調査結果で明らかにしました。そのうち約1.1%にあたる1,122件には、少なくとも1つのシークレットが含まれ、認証情報は合計1,379種類にのぼります。3分の1以上はデータベースに直接アクセスできるもので、データベースのパスワードは379件でした。さらに、公開サーバーに接続するSSHログイン情報43件、GitHub、GitLab、npmのトークン42件、Amazon Web Servicesのキー23件も見つかっています。

所有者は趣味で開発している人だけではありません。Apiiroがファイルの出所をたどったところ、主に規模を問わないソフトウェア企業からなる63の組織が確認されました。特に深刻な例には、データベースベンダー自身が使う管理者権限レベルのクラウドキーや、医療記録データベースのオーナーパスワードが含まれています。gitの履歴に残る古いバージョンには、509のリポジトリにまたがるシークレットがさらに734件あり、74のリポジトリの211件のフォークにも、元のリポジトリと同じシークレットが含まれていました。チームが意図的にコミットする共有設定ファイルや、保存されたエージェントとのチャットログも加えると、1,994のリポジトリで確認されたシークレットは2,539件に増えます。

Claude Codeは、このファイルがバージョン管理に含まれないよう対策を講じています。Anthropicの設定ドキュメントによると、ツールが初めてファイルを書き込む際、ユーザーのグローバルなgit excludesにルールを追加し、そのコンピューター上ではgitがファイルを無視するようにします。しかし、このルールはプロジェクトと一緒にチームメートのノートパソコンやビルドサーバー、新しいマシンに引き継がれることはなく、すでにコミットされたファイルにも効果はありません。研究者が追跡した1,105のリポジトリのうち539では、Claudeが共著者として記載されたコミットによってファイルが変更されていました。これは、エージェント自身がファイルをコミットすることも少なくないことを示唆しています。Apiiroがドキュメントを比較した16のコーディングエージェントのうち、承認済みコマンド全体をプロジェクト内のファイルにデフォルトで保存すると確認されたのはClaude Codeだけです。

一般的な安全対策では、多くのケースを見逃します。Apiiroは人気の高いオープンソースのシークレット検出ツール、gitleaksとTruffleHogを使い、すべてのファイルコピーを調査しました。gitleaksが検出したのは1,122件中564件、TruffleHogは643件で、215件は両方をすり抜けました。見逃しの大半は、PGPASSWORD=、sshpass -p、mysql -pの後に入力されたパスワードでした。既知のキー形式を探すツールには、一般的な単語のように見えるためです。

今回の調査結果には、留意すべき点もあります。ApiiroはAIを活用した開発向けのセキュリティツールを販売しており、今回の調査は営業活動の一環でもあります。同社は認証情報が現在も有効かどうかを検証していませんが、通知を受けた企業の1社は、自社のキーが実際に有効だったと確認しました。既知のキー形式に一致した場合、または公開サーバーのアドレスと並んでいて、AIレビュアーがシークレットだと判断した場合に、値はシークレットとして数えられています。そのため、誤検出の余地もあります。またApiiroは、共著者として記載された数値だけでは、露出した認証情報をすべてClaudeが持ち込んだとは証明できないとしています。そしてGitHubで見えるものがすべてではありません。このファイルはプロジェクトフォルダー内の通常のJSONファイルなので、npmパッケージやDockerイメージ、zipアーカイブ、同期フォルダーに含まれて流出する可能性もあります。

研究者がまず勧めるのは、認証情報のローテーションです。ファイルに一度でも保存されたパスワード、トークン、キーは、後始末を始める前にすべて変更してください。履歴を書き換えるかどうかにかかわらず、一度公開されたシークレットはすでに使えないものとして扱うべきだからです。次に、git rm –cachedでファイルを追跡対象から外し、リポジトリ独自の.gitignoreに追加します。そのうえでClaude Code内の/permissionsを開き、シークレットを含む保存済みルールを削除してください。認証情報を環境変数経由で参照すれば、保存されるルールにはパスワードそのものではなく「$DB_URL」のような名前が記録されます。また、単発のコマンドではなくパターンを承認することで、具体的な引数がファイルに残るのを防げます。

この問題は、以前からユーザーに指摘されていました。2025年8月11日に提出されたバグ報告では、APIキーやトークンを含む承認済みコマンドがsettings.local.jsonに一字一句そのまま保存されると訴えていましたが、60日間動きがなかったため、1月3日に自動ボットが「対応予定なし」としてクローズしました。調査結果を11月6日に公開したApiiroによると、同社が挙げた関連報告4件はすべて同じボットによってクローズされており、最新のものは11月6日付で、Anthropicからの返信はありませんでした。11月2日時点で、同社が発見した露出ファイルはすべて各リポジトリのメインブランチに残っており、その半数は少なくとも217日間にわたって公開状態でした。

The Hacker NewsもApiiroも、Anthropicからの回答があったとは報じていません。また、ドキュメントに記載された挙動にも変更はありません。パスワードを入力したコマンドで次に「次回から確認しない」を選べば、そのパスワードも保存されます。

タグ: , , , , ,

Googleで追加する

ディスカッション

0件のコメントがあります。