// AI 威脅新聞台 · 2026年10月1日
首頁/CVE · 漏洞修補
漏洞修補高MCPCVSS 7.5 (unattended providers), 6.5 (interactive provider)

MCP Python SDK OAuth漏洞曝光 惡意伺服器可偷取存取權杖

MCP官方Python SDK的OAuth客戶端實作存在漏洞,惡意MCP伺服器可誘使應用程式將client secret、授權碼及PKCE驗證碼送往攻擊者控制的端點。漏洞已在1.30.0及2.2.0版修補,9月28日發出的公告未見實際攻擊個案,但防守者應盡快升級並檢查issuer設定。

示意圖:伺服器機櫃與網絡線,象徵身份驗證基礎設施。圖片來源:owleval.com 繪製
資料圖片:示意圖:伺服器機櫃與網絡線,象徵身份驗證基礎設施。圖片來源:owleval.com 繪製。圖片來源:U.S. Department of Agriculture / rawpixel (CC0)
重點
  • MCP官方Python SDK的OAuth客戶端實作有漏洞,惡意MCP伺服器可令應用程式將client secret、授權碼及PKCE驗證碼發送給攻擊者,取得具正當權限的存取權杖。
  • 漏洞影響1.9.1至1.29.1及2.0.0至2.1.1兩條版本線,在無人值守的授權方式下CVSS評分為7.5(高),需要人手登入的互動式授權方式評分為6.5,截至9月29日未獲分配CVE編號。
  • 修補已在1.30.0及2.2.0版推出;使用ClientCredentialsOAuthProvider或PrivateKeyJWTOAuthProvider的用戶,升級後仍須額外設定issuer=參數才能完全解決問題。
本文目錄

漏洞源於SDK未核實授權伺服器身份

根據MCP專案在GitHub發出的安全公告,MCP Python SDK的OAuth客戶端模組(mcp.client.auth)在部分發現路徑上未驗證授權伺服器元數據中的issuer欄位,亦未將已儲存或預先配置的客戶端憑證與特定授權伺服器綁定。

公告指出,惡意或遭入侵的MCP伺服器可藉此將客戶端導向其選定的權杖端點,做法包括在受保護資源元數據中聲稱自己是授權伺服器,或乾脆不提供該元數據,轉而偽裝成用戶真正的授權伺服器。一旦得手,攻擊者可取得client_secret、授權碼及PKCE code_verifier,若使用PrivateKeyJWTOAuthProvider則可取得已簽署的客戶端斷言。

攻擊者如何繞過兩重安全檢查

安全公司Cycode在其報告中解釋,SDK正常的身份發現流程會比對授權伺服器元數據中的issuer欄位與原本取得的URL是否一致,但在「舊版後備路徑」中,SDK從未取得原始URL,該檢查因而完全未被執行。攻擊者只需讓其伺服器在發現請求時回應404,SDK便會改用後備路徑,直接向攻擊者伺服器索取登入設定並全盤接受。

Cycode並指出,SDK的第二重防線「憑證綁定」同樣可被繞過:該檢查比對的正是攻擊者可操控的issuer欄位,攻擊者只需在該欄位填上用戶真正授權伺服器的名稱,檢查便會誤判通過。由於登入頁面本身是真實的授權伺服器頁面,用戶看到的畫面毫無異樣,只會在授權後見到MCP伺服器「出錯」,而實際上憑證已被送到攻擊者手上。

受影響範圍與評分

公告列出,1.9.1至1.29.1版本在所有發現路徑均缺乏檢查;2.x系列的2.0.0至2.1.1版本則在伺服器未提供受保護資源元數據(舊版後備)或回應403 insufficient_scope時出現同樣問題。受影響的授權提供者包括OAuthClientProvider、ClientCredentialsOAuthProvider、PrivateKeyJWTOAuthProvider,以及已棄用的1.x版RFC7523OAuthClientProvider。

漏洞在無人值守的兩種提供者(機器對機器)評分為高風險7.5分;在需要人手啟動登入的互動式OAuthClientProvider情況下評分為6.5分。截至9月29日,公告及報道均未見獲分配CVE編號。公告與Cycode均表示未發現任何實際攻擊案例,外界亦未有相關報告。

修補時間線與未完全解決的缺口

v1.30.0版本說明顯示,issuer檢查其實早在9月7日的版本中以「行為變更」而非安全修補的名義發布,安全公告則於9月28日發出,同日Cycode亦公開其研究報告。公告列出合共八名回報者,包括Cycode的研究員。

公告特別提醒,使用ClientCredentialsOAuthProvider或PrivateKeyJWTOAuthProvider的用戶,單純升級版本並不足夠,必須額外傳入issuer=參數指明所屬授權伺服器,否則仍會跟隨MCP伺服器所指定的任何伺服器。在1.30.0版本中,缺少該參數只會觸發Python預設隱藏的棄用警告,容易被忽略;已棄用的RFC7523OAuthClientProvider則完全沒有issuer選項,官方建議改用其他兩種提供者。此類OAuth相關供應鏈風險與本網此前報道的AI代理供應鏈安全問題屬同一類威脅趨勢。

防守方現在要做甚麼

  1. 將MCP Python SDK升級至1.x線的1.30.0或2.x線的2.2.0或以上版本
  2. 若使用ClientCredentialsOAuthProvider或PrivateKeyJWTOAuthProvider,升級後須額外傳入issuer=參數指明授權伺服器
  3. 清除所有已儲存的OAuth客戶端註冊記錄一次,因舊記錄未與特定授權伺服器綁定
  4. 若懷疑客戶端曾連接不可信的MCP伺服器,應更換該客戶端的client secret並在授權伺服器撤銷相關權杖
  5. 未能升級前,僅連接可信任的MCP伺服器,避免使用該SDK連接未知或第三方伺服器

常見問題

甚麼是PKCE,為何這次漏洞令它失效?

PKCE(Proof Key for Code Exchange)是客戶端在登入流程開始時產生的一次性驗證碼,用以證明兌換授權碼的是同一個客戶端,本應防止被盜授權碼被重用。根據Cycode的報告,這次漏洞令PKCE驗證碼連同授權碼和client secret一併被送到攻擊者手上,使這重保護失去作用。

使用MCP Python SDK 1.29版是否受影響?

是。根據GitHub安全公告,1.9.1至1.29.1版本的所有發現路徑均缺乏issuer驗證,屬於受影響範圍,應盡快升級至1.30.0版。

這個漏洞有否被實際利用?

根據GitHub安全公告及Cycode的報告,兩者均未發現任何實際攻擊個案,目前亦未有其他來源報告相關攻擊。

只升級SDK版本是否已經安全?

不一定。安全公告指出,若使用ClientCredentialsOAuthProvider或PrivateKeyJWTOAuthProvider,升級後仍須額外傳入issuer=參數指明所屬授權伺服器,否則保護並不完整。

這次漏洞是否已獲編配CVE編號?

根據報道,截至2026年9月29日,該漏洞尚未獲分配CVE編號。

來源

  1. OAuth client could send credentials to an authorization server chosen by the MCP server, GitHub Security Advisory GHSA-qx49-fqc8-xw99原始文件
  2. v1.30.0 release notes, modelcontextprotocol/python-sdk原始文件
  3. Cycode Uncovers Account Takeover in MCP Python SDK, Cycode blog
用 AI 深入了解