MCP Python SDK、OAuthの欠陥で悪意あるサーバーに認証情報を窃取されアカウント乗っ取りの恐れ

Anthropicの公式Model Context Protocol(MCP)Python SDKに、深刻度の高いOAuthの脆弱性が新たに見つかりました。悪意あるMCPサーバーが認証情報を盗み出し、ユーザーのアカウントを乗っ取る恐れがあります。

この欠陥は、脆弱なSDKのリリースとOAuthプロバイダーを使用するHTTPベースのMCPクライアントに影響します。攻撃者はクライアントシークレット、認可コード、PKCEの証明鍵を入手できます。

原因は、SDKのOAuthディスカバリーのロジックにある弱点です。MCPクライアントは認証が必要なサーバーに接続する際、正規の認可サーバーを探し出し、その身元を検証してから機密性の高いOAuthデータを送信する必要があります。

脆弱なバージョンでは、攻撃者が管理するMCPサーバーが、最新方式の認可サーバーディスカバリー中にわざと404レスポンスを返すことで、SDKを安全でないフォールバック経路へ誘導できます。

この経路でSDKは、MCPサーバーが直接提示したOAuth設定を、認可サーバーの発行者(issuer)を検証しないまま受け入れてしまいます。

攻撃者は、OktaやGoogle、Microsoft Entra IDといった正規のIDプロバイダーに属するかのように装ったメタデータを提供できます。その一方で、トークンエンドポイントには攻撃者が管理するものを指定します。

この攻撃が特に巧妙なのは、被害者に正規のIDプロバイダーがホストする本物のログインページが表示され得る点です。ユーザーが認証を終えると、SDKは有効な認可コードを受け取ります。

ところが、脆弱なクライアントはこのコードを正規プロバイダーのトークンエンドポイントへ送らず、認可コード、OAuthクライアントシークレット、PKCEのcode_verifierを、攻撃者が管理するインフラに送信してしまいます。

PKCE(Proof Key for Code Exchange)は、OAuthの認可コードを傍受から守るための仕組みです。しかし今回は、攻撃者が認可コードと対応するPKCEの証明の両方を入手するため、正規のIDプロバイダーでコードを問題なく引き換えられます。

その結果、攻撃者は被害者のMCPクライアントに付与されたものと同じ権限を持つ有効なアクセストークンを取得できます。Cycodeによると、この問題はMCP Python SDKのバージョン1.9.1から2.1.1までに影響します。

影響を受けるプロバイダーは、OAuthClientProvider、ClientCredentialsOAuthProvider、PrivateKeyJWTOAuthProviderです。報告では、非推奨の1.x系RFC7523OAuthClientProviderも、影響を受ける環境に関係していると指摘しています。

バージョン1.9.1から1.29.1までは、ディスカバリーの各経路で発行者の検証と認証情報のバインディングが欠けていました。バージョン2.0.0から2.1.1までは、フォールバックと403ステップアップ認証のフローに不備が残っていました。

影響は1回のユーザーセッションにとどまりません。盗まれたOAuthクライアントシークレットは、ローテーションするまで再利用される可能性があります。リフレッシュトークンや広範なOAuthスコープがあれば、攻撃者は侵害されたクライアントから到達できるクラウドサービス、社内API、データベース、デプロイパイプラインなどに、継続的にアクセスできる恐れがあります。

このSDKで作成したMCPサーバー、ローカルのstdioクライアント、独自のトークンやヘッダーを付与するクライアントは影響を受けません。リスクがあるのは、正規の認可プロバイダー向けの認証情報を保持したまま、組織が完全には管理していないサーバーに接続し得るHTTP MCPクライアントです。

この問題は、1.x系ではMCP Python SDKのバージョン1.30.0、2.x系ではバージョン2.2.0で修正されました。組織は直ちにアップグレードし、旧リリースで作成されて保存されたOAuthクライアント登録を消去してください。影響を受けるクライアントが信頼できないMCPサーバーに接続した可能性がある場合は、クライアントシークレットをローテーションし、トークンを失効させる必要があります。

ClientCredentialsOAuthProviderやPrivateKeyJWTOAuthProviderを使う環境では、想定されるissuer=の値を明示的に設定する必要もあります。アップグレードだけでは、これらのフローを完全には保護できません。

16,000以上のSOCチームが、脅威調査の効率化と手作業の削減にANY.RUNを活用しています。チームでの導入を検討する

翻訳元: https://cyberpress.org/mcp-python-sdk-oauth-flaw/

本記事は cyberpress.org の記事を翻訳・要約したものです。