Attack ChainAIDerived
Hypothetical attack flow derived from CVE metadata – not a confirmed exploit chain
-
AccessInfluence agent via prompt injection
-
DeliverySupply IDNA-equivalent spelling of blocked host
-
ExploitBypass pre-normalization blocklist comparison
-
ExecutionServer fetches blocked host with its privileges
-
ImpactDisclose fetched content to attacker
Vulnerability Assessment
| Weakness |
CWE
OWASP Top 10:2025
A01:2025 - Broken Access Control
ASVS 5.0
V4 - API and Web Service URL allowlisting, SSRF prevention
MITRE ATT&CK
2 techniques across 2 tactics: Initial Access, Credential Access The technique list with ATT&CK links and the kill-chain view is part of the Basic plan and up. |
| Exploitation Conditions | Exploitation requires that the deploying application (a) uses pydantic-ai/pydantic-ai-slim version 1.77.0-1.107.5 or 2.0.0b1-2.44.0, (b) invokes the local web_fetch_tool or the WebFetch local fallback, and (c) relies specifically on blocked_domains (a denylist) to restrict fetch targets - the flaw is a denylist bypass only. The attacker must be able to influence the model's chosen URL (e.g., prompt injection) and supply a host spelling that is DNS-equivalent to a blocked entry (IDNA/fullwidth form, non-ASCII label separator, case variation, or trailing root label). Strong limiting factors: configurations using allowed_domains (allowlist) are NOT affected because unmatched spellings fail closed; the private-IP and cloud-metadata SSRF defenses remain effective, so internal/metadata endpoints are not reachable via this bug; and the attacker can only reach an externally-resolvable host that the operator explicitly tried to blocklist, not arbitrary internal infrastructure. |
| Impact | This is a genuinely low-priority issue, and the multiple signals agree rather than conflict. The vendor-assigned CVSS is 3.7 (Low) with vector AV:N/AC:H/PR:N/UI:N/S:U/C:L/I:N/A:N - network-reachable and unauthenticated, but with high attack complexity and only low confidentiality impact, no integrity or availability impact, and no scope change. No EPSS score, KEV listing, or public POC was provided in the input, so there is no evidence of exploitation probability or active abuse; exploitation status is best characterized as no public exploit identified at time of analysis. The high attack complexity is well-justified: the flaw is a blocklist-normalization bypass (CWE-918 SSRF) that requires the attacker to craft an IDNA-equivalent, non-ASCII-separator, case-varied, or trailing-root-label spelling of an already-blocked host, AND requires the application to be relying on blocked_domains rather than allowed_domains. Critically, the advisory and source diff confirm the blast radius is narrow: allowed_domains fails closed for unmatched spellings, and the separate private-IP and cloud-metadata protections remain fully effective - so this does NOT enable classic SSRF to 169.254.169.254 or internal RFC1918 ranges. The realistic impact is limited to reaching a specific externally-resolvable host the operator tried to blocklist. No data is missing in a way that changes the conclusion; the signals are internally consistent and point to a low real-world risk. |
| Exploit ScenarioDerived | An application uses Pydantic AI's web_fetch_tool (or the WebFetch local fallback) configured with blocked_domains to keep the agent away from a specific host. An attacker who can influence the model's output (e.g., via prompt injection in retrieved content) induces it to request an equivalent spelling of the blocked host - such as an IDNA/fullwidth form or a trailing-dot FQDN - which passes the pre-normalization string comparison and is then fetched by the server with its own privileges. No public exploit code was identified in the provided data. |
Get an e-mail when this CVE is exploited, patched or re-scored. Free account.
Alert meAnalysisAIv1 – Oct 08, 2026
A domain-denylist bypass in Pydantic AI's local web-fetch tooling (web_fetch_tool and the WebFetch local fallback) lets an attacker-influenced model reach a host the operator explicitly placed in blocked_domains by supplying a DNS-equivalent spelling - an IDNA/fullwidth form, a non-ASCII label separator, a case variation, or a trailing root label - that does not string-match the configured entry but resolves to the same host. Affected are pydantic-ai and pydantic-ai-slim versions 1.77.0 through 1.107.5 and 2.0.0b1 through 2.44.0; the flaw is a denylist bypass only, so configurations that use allowed_domains fail closed and are unaffected, and the private-IP and cloud-metadata SSRF protections remain effective, meaning internal or metadata endpoints are not reachable through this bug. Rated CVSS 3.1 3.7 (AV:N/AC:H/PR:N/UI:N/S:U/C:L/I:N/A:N) as a low-severity, high-complexity information-fetch issue, with no public exploit identified at time of analysis and vendor patches available in 1.107.6 and 2.44.0.
RemediationAI
Vendor-released patch: upgrade to pydantic-ai / pydantic-ai-slim 1.107.6 on the 1.x line or 2.44.0 on the 2.x line (releases at https://github.com/pydantic/pydantic-ai/releases/tag/v1.107.6 and https://github.com/pydantic/pydantic-ai/releases/tag/v2.44.0; advisory GHSA-22h6-qm39-v87j; fix PRs 8407, 8409, 8421 and commits 490335f8e2322e143a79337ddca9410e0176c812, a9dab92099d0ef9d5d4aa34ccac8a6f1b0e51284, c1f212a084cbfa0012f2044cdb4731d214b3b983). If upgrading cannot be done immediately, the most effective compensating control is to replace blocked_domains denial lists with an explicit allowed_domains allowlist on the web_fetch_tool and WebFetchLocalTool, since allowlist checks fail closed for unrecognized spellings - the trade-off is that every legitimate fetch target must be enumerated and unlisted hosts will raise ModelRetry, which can break open-ended browsing workflows. Operators staying on an unpatched version and unable to switch to an allowlist should normalize their denylist entries at configuration time (lowercase them, strip trailing dots, and apply IDNA/NFKC encoding) so all equivalent spellings map to one blocked key, while accepting that new separator variants could still be missed; note that enabling the existing private-IP and cloud-metadata SSRF protections does not need revisiting, as those defenses were never bypassed by this issue, and only the denylist path was affected.
Affected VersionsENISA
Affected Packages
Source: OSV (Open Source Vulnerabilities)
Affects your stack
Affects 4 packages in euvd
Checking this CVE against your own stacks and servers is part of the Basic plan and up.
Technical ContextAI · show details
The vulnerability is CWE-918 (Server-Side Request Forgery) arising from a comparison performed before normalization. Pydantic AI's SSRF guard in pydantic_ai_slim/pydantic_ai/_ssrf.py compared the URL hostname to entries in blocked_domains as raw strings, but the resolver (getaddrinfo / the IDNA codec) canonicalizes hostnames in ways the raw comparison does not anticipate: NFKC-based IDNA encoding folds fullwidth characters (e.g. fullwidth 'evil.com') and maps several characters to label separators - U+3002 ideographic full stop, U+FF0E fullwidth full stop, U+FF61 halfwidth ideographic full stop, U+2024 one dot leader and U+FE52 small full stop - and case and a trailing FQDN root label are also non-distinguishing to DNS. A host written with any of those spellings therefore reached the blocked destination while evading the exact-match denylist check. The fix introduces _domain_key(), which folds the known IDNA label separators, strips the root label via _normalized_host(), lowercases, and then IDNA-encodes both the request host and each list entry so that comparison happens in the ASCII form the resolver will actually use, stripping the root label again after encoding so that characters only converted to '.' by the codec (e.g. a trailing U+2024) still key correctly. Case folding is deliberately applied in _domain_key rather than _normalized_host because urlparse has already lowercased the URL host and the only cased component it leaves is an IPv6 zone identifier, where case is semantically meaningful (if_nametoindex('ETH0') != if_nametoindex('eth0')). Labels the codec rejects (empty or over 63 characters) are left as raw keys since they name unresolvable hosts. Affected artifacts are cpe:2.3:a:pydantic:pydantic-ai and cpe:2.3:a:pydantic:pydantic-ai-slim across the 1.x and 2.x release lines.
Know when Pydantic Ai 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:N/UI:N/S:U/C:L/I:N/A:N
Network-reachable and unauthenticated (AV:N/PR:N), but crafting a DNS-equivalent spelling of a specifically blocked host and relying on a denylist config make it AC:H; impact is limited content disclosure (C:L), no I/A.
Primary rating from Vendor (GitHub_M).
CVSS VectorVendor: GitHub_M
Lifecycle Timeline
1DescriptionCVE.org
Pydantic AI is a Python agent framework for building applications and workflows with Generative AI. From 1.77.0 until 1.107.6 and 2.44.0, the local web_fetch_tool and the WebFetch local fallback compare blocked_domains entries with a URL hostname before both values are normalized to the form used by getaddrinfo. An attacker-influenced model can use an equivalent IDNA spelling, non-ASCII label separator, case variation, or trailing root label that resolves to a blocked host but does not match the configured string, causing the application to fetch that host with its own privileges. allowed_domains fails closed for unmatched spellings, and private-IP and cloud-metadata protections remain effective. This issue is fixed in versions 1.107.6 and 2.44.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
Server-Side Request Forgery exploits applications that fetch remote resources based on user-supplied URLs.
More in Pydantic Ai
View allPydantic AI versions 0.0.26 through 1.55.x contain a server-side request forgery vulnerability in URL download functiona
Cross-site request forgery in Pydantic AI's development web chat UI allows any website a developer happens to visit whil
Concurrency slot exhaustion in Pydantic AI 2.10.0 through 2.52.x lets streamed model requests permanently occupy slots i
Server-Side Request Forgery in Pydantic AI (versions 1.56.0-1.101.0, 2.0.0b1, 2.0.0b2) allows unauthenticated network at
Server-side request forgery in Pydantic AI's URL-fetching guards lets an application that has explicitly opted a URL int
Server-Side Request Forgery in Pydantic AI's UI adapter layer (versions 1.65.0-1.105.0 and 2.0.0b1-2.0.0b5) allows unaut
Pydantic AI, a Python framework for building Generative AI agents, buffers complete HTTP response bodies before applying
Denial of service in Pydantic AI (pydantic-ai and pydantic-ai-slim) versions 1.77.0 through 1.107.5 and 2.0.0b1 through
Denial of service in Pydantic AI's local web_fetch_tool and WebFetch local fallback allows an attacker-controlled HTML p
Tool call injection in Pydantic AI's UI adapters (AG-UI via Agent.to_ag_ui()/AGUIAdapter, and Vercel AI via VercelAIAdap
DNS rebinding against the Pydantic AI development web chat server (Agent.to_web() and `clai web`) lets a hostile website
Pydantic AI versions 1.34.0 through 1.50.x contain a path traversal vulnerability in the web UI that allows unauthentica
EUVD-2026-95076
NVD
CVE.org
EPSS
Vulnrichment
GitHub
Exploit-DB