- 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编号。



