FlawOpen

flawopen.com/AI Security/mcp-python-sdk-oauth-issuer-confusion

● CWE-345 / CWE-522 · CVSS 7.5[1] · Tinggi
Riset Keamanan · FlawOpen

Cacat validasi issuer OAuth pada MCP Python SDK

GHSA-qx49-fqc8-xw99 memungkinkan server MCP HTTP memengaruhi tujuan yang dapat menerima kredensial dari klien OAuth Python SDK yang terdampak. Tingkatkan ke mcp 1.30.0 atau 2.2.0; provider antarmesin harus menetapkan issuer=. Tidak ada CVE yang ditetapkan.[1], [3], [8]

Vektor CVSSCVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:N/A:N[1]
💡 Penjelasan Sederhana (ELI5)

Sebuah perusahaan mengirim kunci tersegel ke bank yang alamatnya tercantum pada kartu direktori yang disetujui. Server MCP dapat memberikan kartu tersebut, sementara satu jalur cadangan tidak memeriksa apakah entri itu benar-benar milik bank yang diharapkan. Validasi issuer membandingkan identitas pada kartu dengan bank tepercaya yang dikonfigurasi sebelum kunci dikirim.[1], [2]

Konsep Kunci & Istilah

Klien MCP
Aplikasi yang menggunakan Model Context Protocol untuk terhubung ke alat atau data dari server MCP. Celah ini berdampak saat Python SDK digunakan sebagai klien HTTP dengan provider OAuth-nya.[1]
Issuer authorization server
Pengenal stabil untuk layanan OAuth yang menerbitkan token. Klien harus membandingkan metadata yang ditemukan dengan issuer yang diharapkan secara independen.[1], [2]
Protected Resource Metadata (PRM)
Metadata yang dapat menunjukkan authorization server untuk sumber daya terlindungi. SDK juga memiliki jalur penemuan lama ketika PRM tidak tersedia.[1], [2]
PKCE code verifier
Rahasia yang dibuat klien untuk mengikat pertukaran kode OAuth dengan klien yang memulai alur. Nilai ini tidak boleh diungkapkan ke endpoint yang tidak tepercaya.[1], [2]
CWE-345 / CWE-522
Verifikasi keaslian data yang tidak memadai: data diterima tanpa memastikan secara memadai bahwa asalnya adalah sumber yang diharapkan. CWE-522 menjelaskan perlindungan kredensial yang tidak memadai.[1], [4], [7]

Pemetaan kerangka kerja

  • Referensi CWE untuk kelemahan yang dijelaskan dalam panduan ini: CWE-345 CWE-522

Alur Serangan Langkah demi Langkah

Langkah 1

Klien HTTP MCP menyimpan kredensial OAuth

Aplikasi menggunakan versi mcp yang terdampak dan salah satu provider OAuth SDK. Aplikasi dapat terhubung ke server MCP yang tidak sepenuhnya tepercaya sambil menyimpan rahasia klien, kunci penandatanganan, atau registrasi klien.[1]

Langkah 2

Server memengaruhi penemuan otorisasi

mcp 1.9.1–1.29.1 tidak memvalidasi issuer dan tidak mengikat kredensial pada semua jalur discovery. mcp 2.0.0–2.1.1 terdampak saat PRM tidak tersedia dan fallback lama berjalan, atau saat discovery setelah 403 insufficient_scope. Pada kedua lini, provider antarmesin tidak memiliki issuer= untuk mengikat kredensial yang telah disediakan. Rentang versi paket dalam advisory adalah >=2.0.0a1, <2.2.0; prarilis 2.0.0 yang terdampak juga termasuk.[1], [3], [8]

Langkah 3

Endpoint token menerima kredensial

Klien dapat mengirim rahasia klien, kode otorisasi dan verifier PKCE, atau assertion bertanda tangan ke endpoint yang dipilih melalui metadata tersebut. Kredensial yang terlibat bergantung pada provider; tidak semua klien terdampak.[1], [2]

Langkah 4

Dampak bergantung pada provider dan izin

Penerima dapat menggunakan kredensial atau token yang terekspos sesuai cakupan izin. Advisory memberi nilai CVSS 7,5 untuk provider tanpa interaksi; provider interaktif bernilai 6,5 karena seseorang harus memulai login. Advisory menyatakan bahwa belum ada CVE yang ditetapkan.[1]

Langkah 5

Issuer yang ditetapkan menutup celah kepercayaan

Versi yang diperbaiki menentukan issuer yang diharapkan sebelum penemuan, menolak metadata yang tidak cocok, dan mengikat registrasi tersimpan ke issuer itu. Provider antarmesin juga memerlukan issuer= secara eksplisit.[1], [2], [3], [8]

Matriks versi dan tindakan OAuth MCP Python SDK

Konfigurasi klienKondisi terdampak yang didokumentasikanTindakan yang diperlukan
Klien HTTP OAuth dengan mcp 1.9.1–1.29.1Semua jalur discovery tidak memiliki validasi issuer dan pengikatan kredensial ke issuer secara konsisten.Tingkatkan ke mcp 1.30.0 atau lebih baru; verifikasi versi yang benar-benar diterapkan.
Klien HTTP OAuth dengan mcp 2.0.0–2.1.1Terdampak jika PRM tidak ada dan fallback lama digunakan, atau saat discovery step-up 403 insufficient_scope. Rentang versi paket dalam advisory adalah >=2.0.0a1, <2.2.0; prarilis 2.0.0 yang terdampak juga termasuk.Tingkatkan ke mcp 2.2.0 atau lebih baru; verifikasi versi yang benar-benar diterapkan.
ClientCredentialsOAuthProvider atau PrivateKeyJWTOAuthProvider dengan kredensial yang telah disediakanVersi terdampak tidak memiliki opsi issuer= untuk mengikat kredensial ke server otorisasi yang semestinya.Setelah meningkatkan versi, tetapkan issuer= secara eksplisit. Migrasikan RFC7523OAuthClientProvider yang deprecated di lini 1.x.
Server yang dibuat SDK, klien stdio, atau klien yang memasok token/header sendiriTidak terdampak menurut advisory ini.Tidak perlu tindakan untuk kelemahan khusus ini; nilai ulang jika aplikasi juga memakai klien HTTP OAuth yang terdampak.

Analisis Akar Masalah (Root Cause)

Kegagalan batas kepercayaan ini memiliki dua bagian terkait: beberapa jalur discovery yang terdampak tidak selalu membandingkan issuer pada metadata server otorisasi dengan issuer yang diharapkan secara independen dari server MCP, dan kredensial tersimpan atau yang disediakan sebelumnya tidak terikat pada issuer tujuan. Karena itu, server MCP berbahaya atau yang telah disusupi dapat mengarahkan pertukaran token ke endpoint yang dikendalikannya dan menerima materi OAuth milik klien. Perbaikan menentukan issuer yang diharapkan sebelum discovery, menolak ketidakcocokan, dan mengikat registrasi tersimpan ke issuer tersebut; provider machine-to-machine tanpa interaksi juga memerlukan issuer= eksplisit.[1], [2]

Kode Sumber: Rentan vs Aman

Argumen issuer tersedia pada rilis SDK yang telah diperbaiki. Argumen ini mengikat kredensial antarmesin ke authorization server yang benar, tetapi tidak menggantikan upgrade, penghapusan registrasi lama yang belum terikat, atau rotasi kredensial yang mungkin terekspos.[2], [3], [8]

Cuplikan sumber: mcp.client.auth

IMPLEMENTASI RENTAN
import os
from mcp.client.auth import ClientCredentialsOAuthProvider

auth = ClientCredentialsOAuthProvider(
    client_id=os.environ["MCP_CLIENT_ID"],
    client_secret=os.environ["MCP_CLIENT_SECRET"],
)
PERBAIKAN AMAN & KUAT
import os
from mcp.client.auth import ClientCredentialsOAuthProvider

auth = ClientCredentialsOAuthProvider(
    client_id=os.environ["MCP_CLIENT_ID"],
    client_secret=os.environ["MCP_CLIENT_SECRET"],
    issuer=os.environ["MCP_AUTH_ISSUER"],
)
# Gunakan mcp >= 1.30.0 (1.x) atau >= 2.2.0 (2.x).

Daftar Periksa Penguatan Sistem Rekayasa

Sumber

← AI Security Directory →