~/ / AI記事 / 公開されたMCP設定ファイルにある有効なシークレット2,117件: GitGuardianの調査結果と自分のファイルの確認方法
公開されたMCP設定ファイルにある有効なシークレット2,117件: GitGuardianの調査結果と自分のファイルの確認方法
AIアプリケーションにどのMCPサーバーを動かすかを伝える設定ファイルには、キーが必要になることがよくあります。GitGuardianのState of Secrets Sprawl 2026レポートは、公開GitHub上のMCP関連の設定ファイルで、重複を除いて24,008件のシークレットを数え、そのうち2,117件が有効な認証情報でした。この記事はレポートを要約し、プロジェクトの設定ファイルについてClaude Codeのドキュメントが述べていることを説明し、自分のファイルを確認できるようにします。
公開: · 2026-10-24に公式の情報源と照らして確認しました。この記事はそれらの要約であり、代わりにはなりません。
レポートが見つけたこと
- GitGuardianは、State of Secrets Sprawl 2026レポートを2026年3月17日に公開しました。データは2025年のものです。
- 公開GitHub全体で、MCP関連の設定ファイルに露出していた重複のないシークレットは24,008件で、そのうち有効な認証情報は重複なしで2,117件でした。
- 2025年だけで、公開GitHubのコミットに2,865万件の新しいハードコードされたシークレットが加わり、レポートはこれを前年比34%の増加としています。
- AIサービスのシークレットは1,275,105件に達し、前年比81%の増加でした。
- レポートによると、この問題はドキュメント自体が安全でないやり方を勧めていることが原因になっている場合が多く、APIキーを設定ファイル、コマンドライン引数、組み込みの接続文字列に直接書くことが挙げられています。
プロジェクトのMCPファイルが漏れやすい理由
Claude Codeは、プロジェクトスコープのMCPサーバーを、プロジェクトのルートディレクトリにある.mcp.jsonに保存します。ドキュメントはこのファイルを、バージョン管理を通じて共有されるものと説明しています。そこに書いたキーは、リポジトリを読めるすべての人に見えます。
| スコープ | 保存場所 | 見える人 |
|---|---|---|
| ローカル | ~/.claude.json の中、プロジェクトのパスの下 | 現在のプロジェクト。あなただけの非公開 |
| プロジェクト | プロジェクトのルートにある.mcp.json | 現在のプロジェクト。バージョン管理を通じて共有 |
| ユーザー | ~/.claude.json | あなたのすべてのプロジェクト |
キーをファイルに書かない
- Claude Codeはcommand、args、env、url、headersの中の${VAR}と${VAR:-default}を展開するので、ファイルに値そのものを書かず、変数名を書くことができます。ドキュメントの例では、ヘッダーをAuthorization: Bearer ${API_KEY}と書いています。
- 変数が設定されておらず、デフォルト値もない場合でも、設定は読み込まれます。Claude Codeは警告を表示し、${VAR}という文字列をそのまま使います。
- リモートサーバーのurlとheadersでは、一部の認証情報の変数は、設定されていても空として読まれます。ドキュメントは例としてANTHROPIC_API_KEY、ANTHROPIC_AUTH_TOKEN、AWS_BEARER_TOKEN_BEDROCK、HTTPS_PROXY、NPM_TOKENを挙げ、API_KEYという名前の変数は書いたとおりに展開されると述べています。
- argsやurlに書いた値もファイルに保存されるので、コマンドライン引数や組み込みの接続文字列についてのレポートの警告は、そこにも当てはまります。
ファイルを確認する
下のチェッカーは、.mcp.jsonまたはclaude_desktop_config.jsonをブラウザー内で読み込みます。Prompt Redactorと同じ検出ルールで、args、env、headersに書かれたシークレットらしい値と、Claude Codeが空として読む変数の参照に印を付けます。検出はヒューリスティックなので、シークレットを見逃したり、問題のない値に印を付けたりすることがあります。
試してみる: MCP Config Checker
ルールは 2026-10-23 時点のドキュメントで確認しています。
ドキュメント: Claude Code / Model Context Protocol / VS Code
確認していないもの: コマンドが存在するか、パッケージをインストールできるか、リモートサーバーが応答するか、そして他のアプリケーションが異なる扱いをする設定。
すべてブラウザ内で実行されます。設定はアップロードされません。
設定をAIチャットに貼る前に
サーバーが起動しない理由を尋ねるために、設定ファイルをAIチャットに貼る人は少なくありません。Prompt Redactorは、テキスト内のAPIキー、トークン、パスワード、個人データを伏せ字にし、回答の中で元に戻すこともできます。すべてブラウザー内で処理されます。
試してみる: Prompt Redactor
マスク済みのテキスト
マスク済みのテキストがここに表示されます。
見つけられるのは、見分けられる形を持つテキストです。普通の文章で書かれた機密情報は見つけられないため、何も見つからなかったからといって安全とは限りません。
送信する前に、マスク済みのテキストを読んで確認してください。
キーの形式は、2026-10-23にベンダーのドキュメントとRFCで確認しました。
すべてブラウザの中で処理します。テキストも復元用の表もアップロードされません。
シークレットをすでにコミットしてしまったら
- GitHubのドキュメントによると、最初の手順は、そのシークレットを失効させるか更新(ローテーション)して、アクセスに使えないようにすることです。
- ローテーションしたあと、リポジトリの履歴の書き換えは必要ない場合があります。シークレットを失効させるだけで問題が解決することがあるためです。
- そのコミットがフォークに存在する場合、フォークでは引き続きアクセスできます。GitHubは、フォークの所有者の連絡先を教えることはできません。
- コミットは、GitHubのキャッシュされたビューで、SHA-1ハッシュによって到達できる状態のままになることがあります。認証情報のローテーションではリスクを下げられない機密データについては、GitHubサポートがキャッシュされたビューと参照を削除できます。