本文へ

利用状態: ログイン状態を復元中...

Deep DiveAbcas Security Research

MCP proxyのOAuth信頼境界: 動的clientごとの同意とredirect URI

複数の動的MCP clientを1つのupstream OAuth client IDへ集約すると、upstream側の同意だけではclientごとの許可を証明できません。per-client consentとredirect URI完全一致が必要な境界です。

Read in English

MCP proxyが多数の動的登録clientを受け入れながら、third-party APIのOAuthでは1つのstatic client IDを共用すると、2つのclient identityが1つに集約されます。upstream認可serverに残る同意cookieはstatic client IDへの同意であり、新しく登録されたMCP clientへの同意ではありません。proxyがclientごとの同意を確認せずupstreamへ転送すると、既存のupstream同意が別のMCP clientにも適用されたように働くconfused deputy境界になります。

identityが集約される場所

段階upstreamから見えるidentityproxyが保持すべき境界欠落時の含意
正規clientの初回認可proxyのstatic client IDuserとMCP client_idに結び付く同意upstream同意だけが残る
別MCP clientの動的登録同じstatic client ID登録済みredirect_uriとclient identity新clientと既存同意を区別不能
upstream認可への転送同じstatic client IDと既存cookie転送前のper-client consentupstreamが同意画面を省略する可能性
proxy callbackproxy共通のupstream callbackstateと元のMCP client・redirect URIの対応authorization codeの返送先を誤る危険

third-party認可serverは、proxyの内側に何個のMCP clientがいるかを知りません。したがって、providerの同意画面が一度表示されたことだけでは、新しいMCP clientへ同じ権限を渡す根拠になりません。proxyが認可の主体を取り違える点が、通常のOAuth forwardingとconfused deputyを分けます。

現行MCPが求める保護

2026-07-28のAuthorization Security Considerationsは、static client IDを使うMCP proxyに対し、動的登録されたclientごとにuser consentを得てからthird-party認可serverへ転送することを必須としています。公式Security Best Practicesでは、proxy側の同意画面にMCP client名、要求するthird-party scope、登録済みredirect_uriを表示し、userごとの承認済みclient_idを保持する要件が示されています。

認可要求のredirect_uriは、登録済み値との完全一致が必要です。wildcardや部分一致で代替せず、変更時は再登録します。stateは同意後に生成・保存し、callbackで完全一致と一回限りの使用を確認します。これらはupstream providerの同意cookieとは別に、proxyが守るMCP client境界です。

現行Authorization仕様では、未知のclientとの関係にClient ID Metadata Documents、既知の関係にpre-registrationを使い、Dynamic Client Registrationは対応serverでのfallbackとされています。DCRを使うこと自体が脆弱性という意味ではありません。static upstream IDとの組合せでper-client consentが欠けたときに、信頼境界が成立しません。

導入判断に必要な確認記録

採用側では、同意画面の存在だけでなく、どのidentityへ結び付くかを確認します。次はMCP Guardの実務推奨であり、公式仕様が定める保存書式ではありません。

  • user、MCP client_id、登録済みredirect URI、要求scopeを一組にした同意記録
  • 未承認client、変更されたredirect URI、再利用stateをupstream転送前に拒否するnegative test
  • upstream static client IDと、proxy内の各MCP client identityを対応付ける監査記録
  • callbackでauthorization request、state、同意済みclient、最終redirect先が同じ取引に属する確認

clientごとの同意がupstream転送前に実施され、redirect URIが完全一致し、callback stateが元のclientへ結び付く構成は採用候補です。upstream providerの過去の同意だけに依存する構成は、境界実装と再確認まで接続を見送ります。

確認範囲と出典

2026年9月22日に、stable releaseであるMCP 2026-07-28のAuthorization仕様、同版のSecurity Considerations、公式Security Best Practicesを確認した設計分析です。特定proxyでこの経路が成立したという観測やCVE報告ではありません。表と導入記録は公開仕様から導いたMCP Guardの実務推奨です。