Attack ChainAIDerived
Hypothetical attack flow derived from CVE metadata – not a confirmed exploit chain
-
AccessObtain valid token for a sibling service
-
DeliveryPresent bearer token to target MCP server
-
ExploitServer's TokenVerifier omits audience check
-
ExecutionToken accepted as authenticated
-
ImpactExercise token's access on wrong server
Vulnerability Assessment
| Weakness |
CWE
OWASP Top 10:2025
A01:2025 - Broken Access Control
ASVS 5.0
V8 - Authorization Authorization logic validation
MITRE ATT&CK
1 technique across 1 tactic: Privilege Escalation The technique list with ATT&CK links and the kill-chain view is part of the Basic plan and up. |
| Exploitation Conditions | All of the following must hold: the target runs the SDK's HTTP server-side bearer authentication (auth=AuthSettings(...) with token_verifier=); the authorization server it trusts also issues tokens for other services/resources; and the deployment's TokenVerifier does not itself validate the token's aud audience. The attacker must additionally already possess a valid bearer token issued by that same authorization server for a different service. Exploitation is LIMITED to affected versions (mcp 1.10.0-1.29.1 and 2.0.0-2.1.1) and does NOT apply when the authorization server serves only a single resource, when the TokenVerifier already checks aud, or after validate_token_resource=True is correctly configured with resource_server_url and AccessToken.resource - merely upgrading without that configuration does not enable the check. |
| Impact | This is a genuine but conditional authorization flaw (CWE-863, token audience/resource confusion), not a drop-everything emergency. The supplied CVSS 3.1 vector (AV:N/AC:H/PR:L/UI:N/S:U/C:H/I:H/A:N, base 6.8) is internally consistent with the mechanism: network-reachable, but gated by AC:H (a specific deployment - one authorization server issuing tokens for multiple resources plus a TokenVerifier that never checks aud) and PR:L (the attacker must already hold a valid token issued for some other service by that same authorization server). No EPSS score, no CISA KEV entry, and no public exploit were provided in the input, so there is no signal of active or widespread exploitation; the vuln.today Decision label is 'this_month' (not act_now/emergency). The realistic risk is therefore targeted lateral movement within a single-authorization-server, multi-resource environment rather than opportunistic mass exploitation - high technical impact (C:H/I:H) but narrowed by the required misconfiguration and prior token possession. No signals conflict here; the main caveat is that EPSS and POC status are simply absent from the input, not confirmed negative. |
| Exploit ScenarioDerived | In an environment where one authorization server (for example an OAuth/OIDC provider) issues bearer tokens for several MCP servers and other services, an attacker who legitimately holds a token for service A presents that same token to a target MCP server B that uses the SDK's bearer auth without independently validating the token's aud. Because B never checks that the token was issued for it, the token is accepted and the attacker exercises whatever access that token grants against the wrong server. No public exploit code is identified in the input; the referenced PRs and commits are patch material, not a weaponized PoC. |
Get an e-mail when this CVE is exploited, patched or re-scored. Free account.
Alert meAnalysisAIv1 – Oct 28, 2026
Resource-confusion in the Model Context Protocol Python SDK (pip package mcp) causes server-side bearer authentication to accept a token that was issued for a different service. The flaw affects HTTP servers built on the SDK that configure auth=AuthSettings(...) with a token_verifier, and it only bites when the same authorization server issues tokens for multiple resources and the deployment's TokenVerifier does not itself check the token's aud audience; in that setup an attacker who already holds a valid bearer token for another service can present it to the wrong MCP server and exercise the access it carries (CVSS 6.8, AV:N/AC:H/PR:L/UI:N/S:U/C:H/I:H/A:N, CWE-863). Affected builds are mcp 1.10.0 through 1.29.1 and 2.0.0 through 2.1.1; single-resource deployments, verifiers that already validate aud, and correctly configured patched versions are not exposed. No public exploit code has been identified at time of analysis and there is no CISA KEV entry; exploitation requires a pre-existing token plus a specific multi-resource authorization-server topology.
RemediationAI
Vendor-released patches exist: upgrade to mcp 1.30.0 or later on the 1.x line, or mcp 2.2.0 or later on the 2.x line (releases v1.30.0 and v2.2.0, advisory GHSA-w4fh-qvv9-3v23, fixes in PR #3447 and #3451). Upgrading alone does not change behaviour, because the new check ships disabled: you must also set validate_token_resource=True in AuthSettings with resource_server_url set to the exact URL/audience the authorization server puts in tokens for your server, and return the token's audience from verify_token() as AccessToken.resource (when aud is a list, report the entry that equals resource_server_url). Both changes are required together - with only validate_token_resource=True and no AccessToken.resource, every request receives 401. If your own TokenVerifier already validates aud, set validate_token_resource=False to silence the MCPDeprecationWarning, noting the setting becomes True by default in 3.0. If you cannot upgrade yet, the complete compensating control is to reject any token whose aud does not include your server inside verify_token(); this closes the issue on all affected versions and is documented by the maintainers as the pre-upgrade workaround.
Affected VersionsENISA
Affected Packages
Source: OSV (Open Source Vulnerabilities)
Affects your stack
Affects 2 packages in pypi, euvd
Checking this CVE against your own stacks and servers is part of the Basic plan and up.
Technical ContextAI · show details
The MCP Python SDK implements the server side of the Model Context Protocol authorization model, where an MCP server acts as an OAuth 2.0 resource server that consumes bearer tokens minted by an external authorization server. In the affected range the SDK's bearer authentication had no mechanism to verify that a presented token was issued for this particular server, i.e. that the token's audience (aud, per the OAuth 2.0 resource-indicator/RFC 8707 style binding of tokens to a resource) matched the server's own URL; the SDK delegated validity entirely to the user-supplied TokenVerifier and only compared identity/scopes after the fact. CWE-863 (Incorrect Authorization) describes the root cause: the authorization decision authenticates a token as valid but does not establish that it was minted for the protected resource, so where one authorization server fronts several services, a token for service A is accepted by service B. The CVSS AC:H reflects that exploitation depends on a deployment topology (multi-resource authorization server) and on a verifier that omits its own aud check, while PR:L reflects the prerequisite of already possessing a valid token from that same authorization server for a different service. The upstream fix (PR #3447, with follow-up #3451, commits 0c91368 and 8c2fa6e) introduces an AuthSettings option validate_token_resource plus an AccessToken.resource field so the SDK, not only user code, can compare the token's audience against resource_server_url. Notably the option is opt-in in the patched releases and defaults to False (unset) with a deprecation warning, becoming True by default only in 3.0, so the mere act of upgrading does not close the gap.
Know when Python Sdk gets its next vulnerability
- Watch products and get an email when something new is published
- Check this CVE against your own stack and servers
- Exploit and PoC references, threat intelligence from 22 sources
No credit card · 7-day full trial
Severity by source
AV:N/AC:H/PR:L/UI:N/S:U/C:H/I:H/A:N
Network-reachable but AC:H because it needs a multi-resource authorization server plus a verifier that skips aud, and PR:L because the attacker must already hold a valid token for another service; no availability impact.
Primary rating from Vendor (GitHub_M).
CVSS VectorVendor: GitHub_M
Lifecycle Timeline
1DescriptionCVE.org
The Model Context Protocol Python SDK is the official Python SDK for Model Context Protocol servers and clients. From 1.10.0 until 1.30.0 and 2.2.0, server-side bearer authentication configured through AuthSettings with token_verifier accepts a valid token issued for another service when the authorization server serves multiple resources and the TokenVerifier does not independently validate the aud audience. This resource-confusion flaw lets a token holder authenticate to the wrong MCP server and exercise that token's resulting access. This issue is fixed in versions 1.30.0 and 2.2.0.
Blast Radius
ecosystem impact- 84 pypi packages depend on mcp (66 direct, 18 indirect)
Ecosystem-wide dependent count for version 2.0.0.
Threat Intelligence Overview
How this decision was reached
The engine reads each signal below and applies a fixed list of rules from top to bottom. The first rule that matches sets the recommended action – like a statement, every line is shown.
What every action level means
SSVC AssessmentENISA
Priority Score
Attack Technique
Authentication bypass attacks exploit flaws in the verification mechanisms that control access to systems and applications.
More in Python Sdk
View allCross-session message injection in the MCP Python SDK (the 'mcp' package on PyPI) prior to 1.27.2 allows an authenticate
Client-side server-side request forgery and denial of service in the official Model Context Protocol Python SDK: when a
Cross-origin redirect handling in the Model Context Protocol Python SDK (published on PyPI as `mcp`) leaks caller-suppli
Missing authorization in the MCP Python SDK (the `mcp` PyPI package) versions 1.23.0 through 1.27.1 lets any authenticat
Unbounded HTTP request-body buffering in the Model Context Protocol Python SDK (the 'mcp' package) before 1.29.1 and in
Cross-origin WebSocket hijacking in the Model Context Protocol Python SDK (mcp on PyPI) before 1.28.1 lets a remote web
Unbounded server-side memory growth in stateful Streamable HTTP servers built on the MCP Python SDK (the 'mcp' package o
EUVD-2026-111369
GHSA-w4fh-qvv9-3v23
NVD
CVE.org
EPSS
Exploit-DB