Skip to main content

Pydantic AI CVE-2026-107288

| EUVDEUVD-2026-95076 LOW
Server-Side Request Forgery (SSRF) (CWE-918)
2026-10-08 GitHub_M
3.7
CVSS 3.1 · Vendor: GitHub_M
View

Attack ChainAIDerived

Hypothetical attack flow derived from CVE metadata – not a confirmed exploit chain

  1. Access
    Influence agent via prompt injection
  2. Delivery
    Supply IDNA-equivalent spelling of blocked host
  3. Exploit
    Bypass pre-normalization blocklist comparison
  4. Execution
    Server fetches blocked host with its privileges
  5. Impact
    Disclose 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.

Monitor Track and reassess. Why: LOW severity (CVSS 0.1-3.9).
Patch available 0.4% exploitation probability (EPSS)

Get an e-mail when this CVE is exploited, patched or re-scored. Free account.

Alert me

AnalysisAIv1 – 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

pydantic-ai 2.0.0b1, < 2.44.0
pydantic-ai 1.77.0, < 1.107.6
pydantic-ai-slim 1.77.0, < 1.107.6
pydantic-ai-slim 2.0.0b1, < 2.44.0

Affected Packages

euvd pydantic_ai_1_77_0 fix: 1.107.6
euvd pydantic_ai_2_0_0b1 fix: 2.44.0
euvd pydantic_ai_slim_1_77_0 fix: 1.107.6
euvd pydantic_ai_slim_2_0_0b1 fix: 2.44.0

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

Vendor (GitHub_M) PRIMARY 3.7 LOW
AV:N/AC:H/PR:N/UI:N/S:U/C:L/I:N/A:N
vuln.today AI 3.7 LOW

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.

3.1 AV:N/AC:H/PR:N/UI:N/S:U/C:L/I:N/A:N
4.0 AV:N/AC:H/AT:N/PR:N/UI:N/VC:L/VI:N/VA:N/SC:N/SI:N/SA:N

Primary rating from Vendor (GitHub_M).

CVSS VectorVendor: GitHub_M

Attack Vector
Network
Attack Complexity
High
Privileges Required
None
User Interaction
None
Scope
Unchanged
Confidentiality
Low
Integrity
None
Availability
None

Lifecycle Timeline

1
Patch available
Oct 08, 2026 - 17:03 EUVD

DescriptionCVE.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

EPSS Score
0.4%
Top 70% exploitable
Prevalence
Medium
popular Python AI-agent framework, common but not universally deployed
Data Quality
6 sources
Confidence: High

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.

SignalValue
Severity LOW
CISA KEV No
Public POC No
EPSS 0.4%
Patch available Yes
Active threat No
Deciding rule
LOW severity (CVSS 0.1-3.9)
What every action level means
Emergency Immediate action required. Criteria: CRITICAL + in CISA KEV (actively exploited) without patch, OR CRITICAL + EPSS > 30% without patch, OR CRITICAL + active threat signals without patch.
Act Now Prioritize within 24-48h. Criteria: in KEV with patch available, OR CRITICAL + public POC, OR HIGH + EPSS > 10%, OR CRITICAL + active threat, OR any CRITICAL severity.
This Week Schedule remediation this week. Criteria: HIGH severity (CVSS 7.0-8.9). Patch within normal change window.
This Month Plan within 30 days. Criteria: MEDIUM severity (CVSS 4.0-6.9), lower exploitation probability. Include in regular patch cycle.
Monitor Track and reassess. Criteria: LOW severity (CVSS 0.1-3.9), minimal exploitation risk. No immediate action needed.

SSVC AssessmentENISA

SSVC Decision· derived
Defer
Exploitation
None
System Exposure· derived
Open
Automatable
No
Human Impact· derived
Low
Technical Impact
Partial

Priority Score

18
Low Medium High Critical
KEV: 0
EPSS: 0
CVSS: +18
PoC: 0
Weaponized: 0
Threat intel: 0
Gov advisory: 0

Attack Technique

Server-Side Request Forgery exploits applications that fetch remote resources based on user-supplied URLs.

CVE-2026-25580 HIGH POC
8.6 Feb 06

Pydantic AI versions 0.0.26 through 1.55.x contain a server-side request forgery vulnerability in URL download functiona

CVE-2026-107295 HIGH
7.6 Oct 08

Cross-site request forgery in Pydantic AI's development web chat UI allows any website a developer happens to visit whil

CVE-2026-107286 HIGH
7.5 Oct 08

Concurrency slot exhaustion in Pydantic AI 2.10.0 through 2.52.x lets streamed model requests permanently occupy slots i

CVE-2026-48782 MEDIUM
6.8 Jun 16

Server-Side Request Forgery in Pydantic AI (versions 1.56.0-1.101.0, 2.0.0b1, 2.0.0b2) allows unauthenticated network at

CVE-2026-107289 MEDIUM
6.8 Oct 08

Server-side request forgery in Pydantic AI's URL-fetching guards lets an application that has explicitly opted a URL int

CVE-2026-54249 MEDIUM POC
6.8 Jul 29

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

CVE-2026-107294 MEDIUM
6.5 Oct 08

Pydantic AI, a Python framework for building Generative AI agents, buffers complete HTTP response bodies before applying

CVE-2026-107290 MEDIUM
6.5 Oct 08

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

CVE-2026-107287 MEDIUM
6.5 Oct 08

Denial of service in Pydantic AI's local web_fetch_tool and WebFetch local fallback allows an attacker-controlled HTML p

CVE-2026-65975 MEDIUM
6.5 Jul 29

Tool call injection in Pydantic AI's UI adapters (AG-UI via Agent.to_ag_ui()/AGUIAdapter, and Vercel AI via VercelAIAdap

CVE-2026-107292 MEDIUM
6.4 Oct 08

DNS rebinding against the Pydantic AI development web chat server (Agent.to_web() and `clai web`) lets a hostile website

CVE-2026-25640 MEDIUM
5.4 Feb 06

Pydantic AI versions 1.34.0 through 1.50.x contain a path traversal vulnerability in the web UI that allows unauthentica

This site uses cookies essential for authentication and security. No tracking or analytics cookies are used. Privacy Policy