JFrog(ジェイフロッグ)、Oat++フレームワークのMCP実装に重大なセキュリティー脆弱性を発見

JFrog Security Researchは、Oat++フレームワークのAnthropic Model Context Protocol(MCP)標準実装であるoatpp-mcpにおいて、複数のCVE(共通脆弱性識別子)を発見し、報告した。中でもCVE-2025-6515は、MCPセッションIDを乗っ取る可能性があり、「プロンプトハイジャック」と呼ばれる脅威であるため、特に注意が必要だ。

モデルコンテキストプロトコル(MCP)は、2024年11月にAnthropicによって開発されたオープンソースプロトコルだ。これにより、AIモデルは構造化されたリアルタイムのコンテキストを受け取ることができる。LLM(大規模言語モデル)は膨大なコンテンツデータセットで学習されるが、リアルタイムのコンテキスト認識が欠如しているため、これは非常に重要だ。MCPは、AIシステムとデータソースを接続するための普遍的なオープンスタンダードを提供することで、このギャップを埋める。

MCPアーキテクチャーは、MCPホスト、MCPクライアント、MCPサーバー、ローカルデータソース、リモートサービスなど、複数のコンポーネントで構成されている。MCPは、これらのコンポーネント間でコンテキストとツールリクエストをトランスポート方式によってどのように転送するかを定義する。これらの方式は、特定の接続の速度、セキュリティー、柔軟性を決定する。そのようなトランスポート方式の一つがSSE(Server-Sent Events)だ。oatpp-mcpは、最近スタンドアロントランスポートとしては非推奨となったが、SSEを引き続き使っている。

SSEトランスポート方式は、クライアントが定義済みの/sseエンドポイントにGETリクエストを送信することで機能する。サーバーは、セッション固有の一意のURIを含むエンドポイントイベントで応答する。このURIは、メッセージ送信用の一時的なアドレスとして機能する。セッションIDにより、サーバーは異なるMCPクライアントセッションを区別し、それに応じてレスポンスをルーティングできる。しかし、セッションIDが漏洩した場合、悪用される可能性がある。有効なセッションIDを入手した攻撃者は、MCPサーバーに悪意のあるリクエストを送信し、正当なクライアントから送信されたかのように処理できる。

この脆弱性はCVE-2025-6515で実証されている。Oat++ MCP実装はセッションIDとしてポインターを返すため、MCPプロトコルの要件であるセッションIDはグローバルに一意で暗号的に安全でなければならないという要件に違反する。これによりメモリーアドレスが公開され、潜在的に有害なデータ漏洩の懸念が生じる。攻撃者は、セッションを頻繁に作成・破棄し、セッションIDをログに記録した後、同じIDが正当なクライアントセッションに再割り当てされるのを待つことで、この脆弱性を悪用できる。セッションIDが再利用されると、攻撃者は乗っ取ったIDを使ってPOSTリクエストを送信でき、サーバーは関連するレスポンスを被害者のアクティブなGET接続に転送する。

「プロンプトハイジャック」と呼ばれるこの新たな攻撃ベクトルは、セッションレベルの攻撃がプロトコルの仕組みを悪用することで、モデル自体を改ざんすることなくAIの挙動を間接的に操作する方法を示している。MCPなどのプロトコルを介してAIモデルがワークフローに組み込まれるようになるにつれ、新たなリスクも生じている。効果的な防御には、サーバーが暗号的に安全な乱数生成器を使ってセッションIDを生成すること、クライアントが予測不可能で衝突耐性のある識別子を使うこと、そしてトランスポートチャネルが堅牢なセッション分離と有効期限メカニズムを確保することが必要だ。これらの防御を適用することで、開発者はAI駆動型ツールをプロトコルレベルのエクスプロイトから保護できる。

出典:JFrog