あなたのエージェント基盤には弱点がある
悪意あるMCPサーバーは、完全な悪意の指示を一度も書かずにSSHキーを盗むことができる。ASSET研究グループはこれを証明した。盗みの指示をモデルに一括で与えると、大半の主要モデルはほぼ拒否する。ところが同じ指示を無害に見える断片に分割すると、GPT-4o、Gemini 2.0 Flash、Llama 3.3はテストケースの100%で従ってしまう。
一方で多くの開発者は、GitHubで見つけた設定行をコピペして毎週新しいMCPサーバーをエージェントに追加している。それぞれのサーバーはあなたのアクセス権の一部を持つ。APIトークン、クラウド鍵、サービスアカウントだ。MCPは便利だ――それに異論はない。しかしMCPサーバーは今や、エージェント基盤全体の中で最も弱い環になってしまった。
この記事では、MCPサーバーが気づかれずに秘密を漏らす仕組み、指示を分割してモデルの拒否を突破するGhostSplice攻撃、そしてCloudflare WriteGuardから今日すぐ自分の環境に適用できるルールまで、具体的な防御策を解説する。
MCPサーバーが実際に持っているもの
MCPサーバーは、あなたのエージェントと外部ツール――データベース、GitHub、Slack、クラウド――を繋ぐ橋である。その橋渡しをするために、あなたの代わりにログインするための情報を保存する。トークン、APIキー、サービスアカウント認証情報を、平文のまま、暗号化なしで設定ファイルに置くのが普通だ。
後で重要になるプロトコルの詳細が一つある。エージェントがMCPサーバーに接続すると、サーバーはツール一覧を返す。それぞれのツールには自由記述の説明が付いており、いつどう使うかをモデルに教える。その説明はそのままモデルの文脈に入り、あなた自身の指示と同じ重みを持つ。ツールが返す結果もそこに加わる。MCPサーバーは絶えずエージェントに語りかけているが、その文章は誰も読み返さない。これがまさに、GhostSplice攻撃を可能にしている条件だ。
エコシステムは、その防御より速く膨張した。
| 指標 | 数値 |
|---|---|
| 公式MCPレジストリのサーバー数 | 9,600以上 |
| リモートサーバー導入の伸び(2025年5月以降) | 5倍 |
誰でもサーバーを公開でき、中央審査は存在せず、エージェントは公式ツールとまったく同じようにそれを信頼する。NSAは5月にMCP専用のセキュリティガイドを発表し、プロトコルの普及がその保護の整備を追い越したと述べた。情報機関があなたの愛用ツールについてガイドを書くとき、それはたいてい称賛のためではない。
つまり状況はこうだ。何千ものサーバー、審査なし、そしてその真ん中にあなたの鍵がある。
秘密はどこから漏れるのか
第一の穴は、平文で保存された認証情報だ。The Hacker Newsは8月17日に漏洩の仕組みを詳細に報じた。出発点は率直である。トークンはそのまま設定文字列に貼り付けられ、ディスク上で読める状態のまま残る。少し急いだコミット一つで、鍵入りの設定がGitリポジトリに入ってしまう。記事が「拡散」と呼ぶ現象でさらに悪化する。同じ鍵が設定ファイル、環境変数、そして開発・検証・本番のコピーに何度も複製されるのだ。しばらくすると誰も秘密の在り処を把握できなくなり、だから誰も更新しない――そして決して更新されない固定鍵は、攻撃者を待っている鍵にほかならない。
第二の穴は過剰な権限だ。開発中は認可エラーを避けるためにサーバーへ広い権限を渡し、その広い権限がそのまま本番環境へ渡ってしまう。すると一度の侵害だけで、実際の利用がかつて正当化した範囲をはるかに超える被害が生じる。
第三の穴はサプライチェーンで、さらに直接的だ。CVE-2025-6514は、40万回以上ダウンロードされたOAuthプロキシmcp-remoteを直撃し、悪意あるサーバーが利用者のマシン上でコマンド注入を引き起こせるようにした――コードを実行し、認証情報を持ち去ることができた。人気のnpmパッケージを一行インストールしただけで、扉は開いていた。
第四の穴が最も厄介で、プロンプトインジェクションだ。エージェントはツールが持ち帰るすべて――ウェブページ、チケット、社内文書――を読む。その中の一つに隠れた指示が含まれていれば、エージェントはまるであなたからの指示であるかのようにそれに従い、正規のツールを使って本来守るべきものを漏らしてしまう。その漏洩はどんな技術的欠陥も経由しない。モデルの素直さを突くだけだ。
高度な攻撃が始まる前から、MCPサーバーの日常――平文の設定、過剰な権限、未審査の依存関係、フィルターされない内容――は、すでにあなたの秘密を晒している。
GhostSplice:断片で送り込まれる攻撃
GhostSpliceは、あなた自身のエージェントに全面協力させて情報流出を実行させる手法に、ASSET研究グループが付けた名前だ。原理は一文で説明できる。盗みの指示を全文書く代わりに、悪意あるサーバーはそれを分割し、一片をツールの説明に、もう一片をそのツールが返す結果に埋め込む。単体で読めば、どの断片も無害に見える。しかしエージェントは自分の作業文脈に入るすべてを結合する。完全な指示を再構成し、まったくの善意のまま実行する――本人からすれば、ツールが求めたフォームを埋めているに過ぎない。
テストの数字こそが本当の物語だ。
| モデル | 一括指示 | 断片化された指示 |
|---|---|---|
| GPT-4o | 100%拒否 | 100%従う |
| Gemini 2.0 Flash | 100%拒否 | 100%従う |
| Llama 3.3 | 100%拒否 | 100%従う |
| Claude Haiku 4.5 | API経由では拒否 | Cursor内の三分割テストで100%従う |
Claudeに関する詳細が、安易な結論を打ち砕く。同じモデルが一方のクライアントでは拒否し、別のクライアントでは情報を漏らす――クライアントが追加する保護次第で結果が変わるのだ。
GhostSpliceがテストで盗んだのは、SSHキー、環境変数の秘密、ソースコード、顧客データだ。研究者たちは偽の鍵を使った隔離環境で作業しており、実際の被害者を対象にしたわけではないが、その手法は公開されており再現可能である。
GhostSpliceは初めての試みではない。同じ研究室は6月にGhostcommitを発表しており、プロジェクトの規約が参照するPNGファイルに指示を隠す攻撃で、盗んだ秘密を整数としてソースコードに埋め込んでいた。指示分割は定着しつつある攻撃の一族であり、孤立した珍事ではない。
冷静さを保つための材料が二つある。この攻撃には二つの前提条件が必要だ。悪意あるサーバーがすでにあなたのエージェントに接続されていること、そしてエージェントが対象ファイルへの読み取り権限を持っていることだ。だからこそ来歴が非常に重要になる――サーバーの出所こそが、あなたの第一の防衛線だ。そして仕組みを忘れないでほしい。モデルのアラインメントはあなたを守ってくれない。この攻撃は禁止事項を一度にまとめて求めることが決してないからだ。
シャドウMCP:誰も承認していないサーバー
GhostSpliceは、悪意あるサーバーがすでに接続済みであることを前提としていた。では、何を接続するかは誰が決めるのか。チームでは、正直なところ誰も決めていない。これがCloudflareの言う「シャドウMCP」の問題だ。開発者がセキュリティ審査を一切経ずにエージェントへ接続するサーバー群のことである。最近まで、その通信は見えないままだった。MCPリクエストは、他のどんなHTTPS通信とも見分けがつかないからだ。
Cloudflareはプロトコル層での検出によってそれを変えた。仕様更新以降、準拠するすべてのMCPクライアントはリクエストにMCP-Protocol-Versionヘッダーを付与し、Gatewayは復号するすべてのTLSトラフィックでそのヘッダーを検査する。セキュリティチームは今や、専用ダッシュボードで社内で使われているすべてのMCPサーバー――固有のサーバー数、利用者、リクエスト量――を把握できる。このヘッダーによる方式は、ドメイン名でのフィルタリングより優れている。MCPサーバーが自らを「mcp-何々」と名乗る理由はどこにもないからだ。プロトコルは、それが何を名乗るかではなく、実際に何を発しているかで検出される。
チームは行動も起こせる。is_mcpセレクターを使えば、承認済みポータルを経由しなかったMCPトラフィックをすべてブロックできる。ポータルは、この仕組みのもう半分だ。審査済みのサーバーをまとめる単一のアクセスポイントであり、ID認証の背後に置かれる。
最新の仕様版は、可視性をさらに押し進める。新しいMcp-MethodとMcp-Nameヘッダーは、要求された操作と呼び出されているツールを、ファイアウォールがリクエスト本文を開かなくても示してくれる。これによりチームは、チケットを読んでいるエージェントと50件のチケットを削除しているエージェントを、まさにネットワーク層で区別できる。
Cloudflareはこれを二つのケースに分けている。純粋なシャドウMCP――一度も承認されたことのないサーバー――と、ポータル迂回――承認済みだが検問を直接迂回して接続するサーバーだ。どちらも同じ基本ルールでブロックされる。論理は単純だ。ポータルを経由するものはすべて把握・記録され、それ以外はすべてブロックされる。企業にとって、それは金曜の夜にこっそりインストールされるゴーストMCPサーバーの終わりを意味する。
WriteGuard:ツールごとの権限管理
承認済みのサーバーであっても被害をもたらしうる。エージェントは、それを使う人の権限を一度にすべて継承してしまうからだ。そこで登場するのがWriteGuardであり、Cloudflareがちょうどプライベートベータとして公開した。その発想は、あらゆるMCPサーバーのあらゆるツールをリスク階層に分類し、階層ごとに異なるポリシーを適用するというものだ。
- 読み取りは摩擦なく通過する。
- コメント投稿のような限定的な書き込みは、強化されて通過する。そのアクションはエージェント発であると署名され、特定の人物の代理であることが示され、監査イベントが中央ログに記録される。
- コードのマージ、本番へのデプロイ、大量削除といった重大なアクションは、サーバーが処理する前にブロックされる。
Cloudflareの投稿にあるGitLabの例が、この段階分けをよく示している。マージリクエストの閲覧は通過し、コメントは帰属付きで通過し、マージ自体は人間が自ら行うまで拒否される。
最も興味深いのは、そのID管理モデルだ。エージェントは自分が仕える社員の権限をそのまま持ち続けるが、すべての書き込みには今や二つの署名が付く――本人と、代理して行動するエージェントセッションだ。これにより下流のシステムは、人手による変更と機械生成の変更をついに区別できるようになる。監査記録は機密データを除去したうえで、非同期に中央ログへ送られる。これまでログの中でエージェントとその本人は見分けがつかなかった。インシデント調査においてこれはすべてを変える――火曜日の怪しいマージが、急いでいた同僚によるものか、それとも創造性を発揮したエージェントセッションによるものか、一つのクエリで分かるようになる。
Cloudflareは机上の空論を語っているのではなく、自社の内部運用を紹介している。彼らのポータルは27のMCPサーバーに接続しており、4月の13から増えている。この数字が語る真実は、Cloudflareのような場所であってもサーバー数は数ヶ月で倍増するということであり、だからこそツール単位の制御が必要になる。業界が向かっている方向は明確だ。サーバー全体を信頼するのをやめ、アクションごとにエージェントに何を許すかを判断していく。
限界:これでも直らないもの
限界については、はっきり言っておく必要がある。WriteGuardは登録フォームの向こうにあるプライベートベータであり、Gatewayによる検出にはTLS検査を有効にしたCloudflare Zero Trustの導入が必要だ。個人開発者や小規模チームにとって、それは単純に自分たちのインフラではない。企業内であっても、検出できるのは自らが復号するネットワークトラフィックだけだ。stdio経由で動くローカルのMCPサーバーは、あなたのマシン上でただのプロセスとして起動され、Gatewayには見えないままである。そしてこれこそが、開発者がインストールするサーバーの大半が実際に動いている形なのだ。
何よりも、これらのツールのどれ一つとして、GhostSpliceが露呈した核心の仕組みは直さない。エージェントが自分の文脈に入ってくるものを自由に結合し続ける限り、無害な断片は敵対的な指示へと再構成され続ける。ASSET研究者たち自身がこう述べている。解決にはツールの出力をデータとして扱い、決して指示として扱わないことが必要だが、その区別は今のエージェントにはまだ組み込まれていない。
それまでの間、彼らの推奨は三つの対策に集約される。あるツールから出た値を、無検証のまま別のツールの引数に流し込むのをやめること。各ツール呼び出しを手動で拒否できる能力を維持すること。そして未審査のサーバーからの注釈は、既定で敵対的なものとして扱うこと。この三つのうち、今日自動化されているものは一つもない――自分で適用するか、誰も適用しないかのどちらかだ。Cloudflareがここで提供しているものはすべて、シートベルトだと考えよう。ブレーキではない。被害を抑えることはできても、衝突そのものを防ぐことはできない。
自分たちの環境に適用すること
今日から実践すべきことは以下の通りだ。
- 棚卸し。 実際にエージェントへ接続されているMCPサーバーを一覧化し、もう使っていないものは削除する。
- 出所で分ける。 既知のベンダーによる公式サーバーなら良い。スレッドで見つけたスター40のGitHubリポジトリは駄目だ――それがあなたのデータをどう扱うかを読むまでは。
- 権限を絞る。 各サーバーに最小限のスコープを持つ専用トークンを与え、決してマスターキーは渡さない。そして本番システムと同じようにトークンを定期的に更新する。
- 機微なアクションは手放さない。 書き込み、マージ、削除を行うエージェントは、必ずあなたを経由させる――これはWriteGuardが自動化しているものの手作業版だ。
- GhostSpliceの教訓を日々適用する。 エージェントが頼んでもいないツール連携を始めたら、それを止めてサーバーが何を伝えていたかを読み返す。
どのエージェントクライアントも、接続済みのサーバーとそのツール一覧を表示できる。その確認はたった30秒で済む。この30秒こそ、あなたの環境全体で最も費用対効果の高いセキュリティ対策だ。
企業に所属しているなら、ネットワーク層も追加しよう。GatewayのMCP検出とポータルは導入する価値がある。シャドウMCPは、あなたに見えていようがいまいが、すでにあなたの組織内に存在しているからだ。
MCP自体が問題なのではない。問題は、私たちがそれに自分の鍵を渡した速さだ。
AIDive