// 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 深入了解