何が起きたか
公式MCP TypeScript SDKでは、OAuthクライアントは、クライアントが接続したMCPサーバーが、クライアントのOAuth資格情報を受け取る認証サーバーを決定できるようにしていました。保存済み/事前プロビジョニング済みの資格情報は、それらが属する認証サーバーにバインドされていませんでした(CWE-345/CWE-522)。悪意のある、または侵害されたMCPサーバーは、保護リソースメタデータで独自の認証サーバーを指定でき、ユーザー操作なしで、被害者の保存された`refresh_token`と`client_secret`(1.x)、またはバンドルされた非対話型プロバイダーの設定済み`client_secret`/署名付きアサーション(1.xおよび2.x)を受け取ることができます。SDK 1.31.0および@modelcontextprotocol/client 2.2.0で修正されました。
なぜ重要か
これはModel Context ProtocolのリファレンスSDKです — エージェントAIの結合組織です。自動化可能(UIなし、ユーザー確認なし)であるため、正当なプロバイダーのOAuth資格情報を保持しながら信頼できない、または侵害されたMCPサーバーに接続するエージェントは、サイレントに長期有効なトークンを渡し、エージェントスタック全体でのアカウント/API乗っ取りを可能にします。信頼できる発行者のバインディングギャップは、エコシステムのコアクライアントライブラリにおける構造的なOAuth統合の欠陥です。
攻撃経路
エージェントが攻撃者が制御する/侵害されたMCPサーバーに接続します。サーバーはリソースメタデータで独自の認証サーバーをアドバタイズします。SDKは、次のトークン更新時に保存されたrefresh_token + client_secretをそのエンドポイントに送信します。
影響を受けるシステム
@modelcontextprotocol/sdk >= 1.12.0、< 1.31.0(1.x); @modelcontextprotocol/client >= 2.0.0、< 2.2.0(2.x)
緩和策
@modelcontextprotocol/sdk 1.31.0または@modelcontextprotocol/client 2.2.0にアップグレードします。1.xでは、OAuth対応クライアントを信頼できるMCPサーバーにのみ接続します(回避策)。