Claude Codeのシークレット漏洩:.claude/settings.local.jsonの流出を分析する
漏洩のメカニズム
Claude Codeの「今後確認しない(Don't Ask Again)」機能は、シェルコマンドの許可ルールをキャッシュすることで開発者のワークフローを効率化するように設計されています。ユーザーがデータベースのパスワード、APIトークン、クラウドキーなどの機密情報を含むコマンドを承認すると、エージェントはそのコマンド文字列全体をプロジェクトディレクトリ内の .claude/settings.local.json ファイルに保存します。このファイルはプロジェクトフォルダ内に配置されるため、誤ってバージョン管理にコミットされてしまうことが多く、リポジトリが公開GitHubホストにプッシュされると、これらのシークレットが誰でもアクセス可能な状態になってしまいます。
Claude Codeはこのファイルをグローバルな gitignore リストに追加しようと試みますが、ファイル作成後にフォルダがリポジトリ化された場合や、新しいマシンにファイルをクローンした場合、あるいは開発者が手動でファイルをリポジトリに追加した場合など、この保護機能が機能しないシナリオが存在します。Apiiroの調査によると、実際のシークレットが含まれる1,105個のリポジトリのうち539個において、エージェント自身が共同作成者となったコミットに当該ファイルが含まれており、漏洩が自動化されていることが判明しました。
範囲と影響
Apiiroは、1,994個の公開GitHubリポジトリ全体で2,539個の実際のシークレットを特定しました。これには、本番環境のデータベースパスワード、クラウドAPIキー、SSHルートログインなどの価値の高い認証情報が含まれています。影響はスタートアップ、ソフトウェアエージェンシー、ITサービス企業を含む63の組織に及んでいます。ある事例では、データベースベンダー自身の管理者レベルのクラウドキーが露出していました。
GitHub以外にも、リスクは開発者のワークステーションにまで及びます。.claude/settings.local.json ファイルはプレーンテキストで保存されるため、マルウェアの格好の標的となります。セキュリティ研究者は、Shai-Hulud npmワームのような既存の認証情報収集ワームが、すでにこのような設定ファイルを求めてローカル環境のスキャンを開始していると指摘しています。
現在のシークレットスキャナーの限界
GitleaksやTruffleHogのような標準的なシークレットスキャンツールは、主に特定のキー形式(プロバイダーのプレフィックスが付いた文字列など)を識別するように調整されているため、これらの漏洩を検出できないことがよくあります。Claude Codeによってキャプチャされたシークレットの多くは、コマンドライン引数に直接埋め込まれたパスワード(例:PGPASSWORD=... や sshpass -p ...)です。これらは従来のスキャナーには通常のテキストとして認識されるため、検出に大きなギャップが生じます。Apiiroは、侵害されたファイルの5件に1件が、GitleaksやTruffleHogのどちらによってもフラグが立てられていなかったことを発見しました。
緩和策とベストプラクティス
これらの漏洩から環境を保護するために、開発者やセキュリティチームは以下のプラクティスを採用すべきです。
- 追跡の解除と除外:
git rm --cached .claude/settings.local.jsonを使用して、直ちに.claude/settings.local.jsonをgitの追跡から削除し、プロジェクトの.gitignoreファイルに追加されていることを確認してください。 - 認証情報のローテーション: シークレットを含むファイルがコミットされた場合は、その認証情報が侵害されたと見なしてください。ファイル履歴に見つかったすべてのキー、トークン、パスワードをローテーションしてください。
- 環境変数の使用: シークレットをコマンドに直接入力しないでください。環境変数(例:
$DB_URL)を介して参照することで、キャッシュされるコマンド文字列には生のシークレットではなく変数名のみが含まれるようにします。 - スキャンの強化: CI/CDパイプラインやプリコミットフックを設定し、標準的なキー形式を超えたパターン、特にコマンド内のパスワードパターンをスキャンするようにしてください。
- エージェントのサンドボックス化: エージェントを隔離された環境で実行するか、エージェントによる不正な書き込み操作や機密サービスへのアクセスを制限するAPIプロキシの使用を検討してください。
コミュニティの洞察
開発者間の議論では、ツールの動作が要因の一つである一方で、根本的な原因は厳格なセキュリティ衛生の欠如にあることが多いと指摘されています。コメントでは以下のように述べられています。
「根本的な問題はボタンではなく、許可リストがコマンド文字列全体を保存してしまうことにある...シークレットは環境変数を介してのみコマンドに入れるべきであり、.claude/ はリポジトリ内ではなく、マシン全体のグローバルな gitignore に配置されるべきだ。」 — @handle
また、何をコミットしているかを手動で確認せずに自動化ツールに頼ることは危険な慣行であると強調する声もありました。あるユーザーは、「ボットの自動化に頼らず、自分自身で責任を持つ必要がある...誰でも永遠に見られる場所に置く前に、内容を確認することだ」と述べています。
Sources
関連
- Dispatch
- プロジェクト
- Dispatch
- プロジェクト
- プロジェクト