The Fetch server checked one string under Python hostname normalization and let HTTPX connect using a different IDNA interpretation. The two domain spellings were not interchangeable, yet the result of the first lookup authorized the second request. primary evidence shows how an agent fetch operation can cross from public web content to an internal endpoint…
Inspect the ClaimsCase · DiggingBeagle record
MCP Fetch private-address guard resolved a different hostname than HTTPX
An IDNA2003 versus IDNA2008 normalization difference allowed a public-address validation decision to be reused when the HTTP client connected to a different, internal destination.
Assessment profile
Assessment method- Setting
- research demonstration
- Exploitation
- demonstrated
- Evidence
- Grade B
- Remediation
- patch available
- AI role
- AGAINST AI
Basis and provenance
Direct maintainer advisory and local end-to-end SSRF surrogate; not observed cloud secret exfiltration. The impact band remains unknown: available evidence does not establish actual deployed victim outcomes or a comparable measured loss.
Assessed Oct 26, 2026 using diggingbeagle.assessment/1.
Evidence basis: CLM-CP20-MCP-FETCH-IDNA · CLM-CP20-ENRICH-MCP-FETCH-IDNA · MCP Fetch SSRF via different IDNA normalization in validator and httpx transport
At a glance
The proof reached a local stand-in service, not a verified production metadata credential. The defender must be persuaded or instructed to fetch a crafted URL, and reachable internal destinations depend on deployment.
Limits and uncertaintyFull account
The Fetch server checked one string under Python hostname normalization and let HTTPX connect using a different IDNA interpretation. The two domain spellings were not interchangeable, yet the result of the first lookup authorized the second request. primary evidence shows how an agent fetch operation can cross from public web content to an internal endpoint without time-based DNS rebinding.
The proof reached a local stand-in service, not a verified production metadata credential. The defender must be persuaded or instructed to fetch a crafted URL, and reachable internal destinations depend on deployment.
Resolve, authorize and connect against one pinned network endpoint; repeat checks across redirects. The patched Fetch version cited in the disclosure should be installed rather than relying on apparent URL normalization.
The mismatch is deterministic and must not be mislabeled DNS rebinding. Python's IDNA2003 conversion can treat a name containing ß as ss, while HTTPX uses the IDNA2008 punycode form. A public address checked under the first hostname can therefore authorize a private target reached by the second. The disclosure demonstrated a loopback service rather than credential theft. Fetch 2026.10.24 corrects the affected range 2026.10.10 through 2026.10.19. Destination checks must use the final address the socket actually connects to, including after redirects.
Claims & evidence
CLM-CP20-MCP-FETCH-IDNAThe MCP Fetch advisory demonstrates a crafted Unicode/punycode hostname that passed its public IP check but connected through HTTPX to a loopback test service.supported
Basis: reported finding
- supportsMCP Fetch SSRF via different IDNA normalization in validator and httpx transportrole not specified
IDNA host mismatch; root cause; Impact; localhost PoC
CLM-CP20-ENRICH-MCP-FETCH-IDNAGHSA-v38p-wf49-hx2j confirms that Python IDNA2003 and HTTPX IDNA2008 normalize certain internationalized names differently, allowing a public-IP check to authorize a loopback proof-of-concept fetch; fixed release is 2026.10.24.supported
Basis: reported finding
- supportsMCP Fetch SSRF via different IDNA normalization in validator and httpx transportrole not specified
Advisory Summary; checked and connected host mismatch, loopback PoC and patched versions
Unknowns and contradictions
- The proof reached a local stand-in service, not a verified production metadata credential. The defender must be persuaded or instructed to fetch a crafted URL, and reachable internal destinations depend on deployment.
Sources and citation
Material revision history
- Oct 26, 2026 · Canonical change recorded · new in release · revision 193