- 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代理供應鏈安全問題屬同一類威脅趨勢。
防守方現在要做甚麼
- 將MCP Python SDK升級至1.x線的1.30.0或2.x線的2.2.0或以上版本
- 若使用ClientCredentialsOAuthProvider或PrivateKeyJWTOAuthProvider,升級後須額外傳入issuer=參數指明授權伺服器
- 清除所有已儲存的OAuth客戶端註冊記錄一次,因舊記錄未與特定授權伺服器綁定
- 若懷疑客戶端曾連接不可信的MCP伺服器,應更換該客戶端的client secret並在授權伺服器撤銷相關權杖
- 未能升級前,僅連接可信任的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編號。



