Skip to main content

Pydantic AI EUVDEUVD-2026-95077

| CVE-2026-107289 MEDIUM
Server-Side Request Forgery (SSRF) (CWE-918)
2026-10-08 GitHub_M GHSA-vmxc-h2x2-jmf3
6.8
CVSS 3.1 · Vendor: GitHub_M
View

Attack ChainAIDerived

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

  1. Access
    Identify app with allow-local opt-in on IPv6 host
  2. Delivery
    Supply zone-scoped IPv6 metadata URL (fd00:ec2::254%251)
  3. Exploit
    Bypass blocklist via zone-id equality mismatch
  4. Execution
    Reach cloud metadata endpoint
  5. Impact
    Exfiltrate IAM short-term credentials

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 ALL of the following concrete preconditions, each confirmed by the vendor advisory: (1) the application must explicitly opt a URL into local network access via either a FileUrl (ImageUrl/AudioUrl/VideoUrl/DocumentUrl) with force_download='allow-local' or web_fetch_tool(allow_local_urls=True) - both OFF BY DEFAULT; (2) that URL must be influenceable by untrusted input (attacker-controlled, or model-chosen in the web_fetch_tool path); (3) the runtime must be an IPv6-enabled cloud environment with a reachable metadata service (e.g. AWS EC2/EKS with IPv6, GCP IPv6-only instances, Scaleway), since only the IPv6 metadata endpoints were reachable via zone-identifier smuggling. Limiting factors: applications using bundled ingestion integrations (e.g. Agent.to_web / clai web) are NOT affected via the FileUrl path because they do not propagate force_download from external data; IPv4, private-range, and transition-form metadata checks were never bypassable. The specific bypass is appending an IPv6 zone identifier (e.g. fd00:ec2::254%251) to a blocked metadata address.

Impact

This is a genuinely lower-priority issue despite its CWE-918 SSRF classification, and the signals are internally consistent rather than conflicting. The CVSS 3.1 vector (AV:N/AC:H/PR:N/UI:N/S:C/C:H/I:N/A:N, 6.8 Medium) correctly captures the tension: although the attacker needs no privileges on the target (PR:N) and no user interaction (UI:N), the high attack complexity (AC:H) reflects a stack of required preconditions that the vendor advisory confirms - the application must explicitly opt an attacker-influenced URL into local network access (force_download='allow-local' or web_fetch_tool with allow_local_urls=True), both of which are DISABLED BY DEFAULT, and the environment must be IPv6-enabled (e.g. AWS EC2/EKS with IPv6, GCP IPv6-only, Scaleway). The scope change (S:C) and C:H are justified because success exposes cloud IAM short-term credentials from the metadata service, crossing a trust boundary. There is no EPSS score, KEV listing, or POC in the provided data - no public exploit identified at time of analysis - and this absence is consistent with a defense-in-depth hardening fix rather than an actively exploited flaw. Notably, this is explicitly an INCOMPLETE FIX of prior advisories (GHSA-cqp8-fcvh-x7r3/CVE-2026-46678 and GHSA-cg7w-rg45-pc59/CVE-2026-48782, themselves follow-ups to CVE-2026-25580), which raises the realistic likelihood that security-conscious operators who already allow local URLs are the exposed population. Net assessment: real but narrow; prioritize patching only where the opt-in local-access settings are actually enabled in an IPv6 environment.

Exploit ScenarioDerived

An application has enabled local-URL access (force_download='allow-local' or web_fetch_tool(allow_local_urls=True)) and runs on an IPv6-enabled cloud instance. An attacker who can influence a fetched URL - or the LLM-chosen URL in the web_fetch_tool case - supplies a zone-scoped IPv6 metadata address such as http://[fd00:ec2::254%251]/latest/meta-data/iam/security-credentials/; the blocklist comparison fails because Python folds the zone id into IPv6Address equality, while the kernel ignores the zone for the non-link-local destination and reaches the metadata service, returning cloud IAM credentials. No public exploit was identified at time of analysis.

This Month Plan within 30 days. Why: MEDIUM severity (CVSS 4.0-6.9).
Patch available 0.3% exploitation probability (EPSS)

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

Alert me

AnalysisAIv1 – Oct 08, 2026

Server-side request forgery in Pydantic AI's URL-fetching guards lets an application that has explicitly opted a URL into local-network access reach IPv6 cloud metadata endpoints such as fd00:ec2::254 and read short-lived cloud IAM credentials, because appending an RFC 4007 zone identifier (for example fd00:ec2::254%251) makes the address unequal to its blocklist entry while the kernel silently ignores the zone for a non-link-local destination and routes the request anyway. Affected releases are pydantic-ai and pydantic-ai-slim at 1.56.0 up to but not including 1.107.6, and 2.0.0b1 up to but not including 2.44.0; exploitation additionally requires that the URL be attacker-influenced or model-chosen, that one of the two opt-ins be enabled (FileUrl with force_download='allow-local', or web_fetch_tool(allow_local_urls=True) - both off by default), and an IPv6-enabled environment with a reachable metadata service. Vendor-released patches are available in versions 1.107.6 and 2.44.0 (upstream fix tracked via pull requests 8401 and 8402); no public exploit code was identified at time of analysis and there is no confirmed active exploitation (CISA KEV).

RemediationAI

Vendor-released patch: upgrade to pydantic-ai / pydantic-ai-slim 1.107.6 (1.x line) or 2.44.0 (2.x line), which strip IPv6 zone identifiers before any blocklist comparison (upstream pull requests 8401 and 8402, commits 02157e1b87bd45d3f2e111ce07afdf89f9fb0e5b and 4da70591460f51a8c4f128eaeef70a33340dbd55). If immediate upgrade is not possible, the most effective compensating control is to not opt into local access at all: leave FileUrl/force_download at its default and do not call web_fetch_tool(allow_local_urls=True) - this fully removes exposure on both vulnerable paths, with the trade-off that the application loses the ability to fetch legitimately local or intranet resources through those APIs. Where local access is genuinely required, never pass untrusted or model-chosen URLs into those paths: hard-code the URL, or validate attacker-influenced URLs against an explicit hostname/IP allowlist that rejects any address containing a '%' zone identifier before it reaches Pydantic AI; the trade-off is added application logic and the risk of a permissive allowlist reintroducing SSRF. Environment-level mitigations reduce the blast radius rather than the bug: enforce IMDSv2 with a short hop limit or disable the IPv6 metadata endpoint on AWS (and equivalent link-local restrictions on GCP/Scaleway) so a successful request cannot retrieve IAM credentials, accepting that this does not prevent the outbound SSRF itself; and apply outbound egress filtering that blocks the IPv6 metadata prefixes fd00:ec2::/64, fd20:ce::/64 and fd00:42::42 from the workload, which may break other legitimate link-local or private IPv6 traffic. Because the two opt-in settings are disabled by default and only the IPv6 metadata endpoints were reachable, confirm exposure by checking whether your deployment combines an enabled opt-in, untrusted URL input, and an IPv6-enabled cloud network before treating this as urgent.

Affected VersionsENISA

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

Affected Packages

pypi pydantic-ai fix: 1.107.6, 2.44.0
pypi pydantic-ai-slim fix: 1.107.6, 2.44.0
euvd pydantic_ai_2_0_0b1 fix: 2.44.0
euvd pydantic_ai_slim_2_0_0b1 fix: 2.44.0

Source: OSV (Open Source Vulnerabilities)

Affects your stack

Affects 4 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 flaw sits in Pydantic AI's SSRF guard module (pydantic_ai/_ssrf.py), which maintains a frozenset of blocked cloud metadata endpoints and, for opt-in local access, is supposed to unconditionally refuse requests to them. Root cause is CWE-918 (Server-Side Request Forgery) compounded by a Python semantics edge case: ipaddress.IPv6Address folds an RFC 4007 zone/scope identifier into equality and hashing, so a zone-scoped spelling of a blocked address is not a member of the frozenset, while the operating system treats the zone as meaningful only for a link-local destination and ignores it otherwise. The vulnerability is therefore an incomplete fix: it is a follow-up to GHSA-cqp8-fcvh-x7r3 / CVE-2026-46678 and GHSA-cg7w-rg45-pc59 / CVE-2026-48782, which were themselves follow-ups to CVE-2026-25580, whose remediation advertised a guarantee that cloud metadata endpoints are always blocked even with local access allowed. Notably, the private-range checks and the IPv4 and IPv4-transition-form (IPv4-mapped, IPv4-compatible, 6to4, NAT64, ISATAP) metadata checks were never bypassable, because they compare by network containment and by packed bytes respectively rather than by set membership - only the IPv6 metadata list was exposed. The upstream patch introduces a _parse_ip helper that strips the scope_id before any comparison, so address classification is unaffected by the zone while the connection still carries it (link-local destinations with zones remain reachable under allow-local). Only IPv6 metadata endpoints were reachable through this path, so an IPv6-enabled runtime - AWS EC2/EKS with IPv6, GCP IPv6-only instances, or Scaleway - is required.

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 6.8 MEDIUM
AV:N/AC:H/PR:N/UI:N/S:C/C:H/I:N/A:N
vuln.today AI 6.8 MEDIUM

Attacker needs no target privileges (PR:N) but the opt-in local-access config plus IPv6 environment make AC:H; leaking IAM creds from the metadata service crosses scope (S:C) with C:H and no integrity/availability impact.

3.1 AV:N/AC:H/PR:N/UI:N/S:C/C:H/I:N/A:N
4.0 AV:N/AC:H/AT:P/PR:N/UI:N/VC:H/VI:N/VA:N/SC:H/SI:N/SA:N
Red Hat 3.7 LOW

Primary rating from Vendor (GitHub_M).

CVSS VectorVendor: GitHub_M

Attack Vector
Network
Attack Complexity
High
Privileges Required
None
User Interaction
None
Scope
Changed
Confidentiality
High
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.56.0 until 1.107.6 and 2.44.0, applications that opt attacker-influenced URLs into local network access through FileUrl with force_download='allow-local' or web_fetch_tool with allow_local_urls=True can bypass the cloud-metadata blocklist by appending an IPv6 zone identifier to an IPv6 metadata address. IPv6Address equality and hashing include the zone identifier, so the blocklist comparison fails even though the network stack ignores the zone on a non-link-local destination and reaches the metadata service, potentially exposing cloud IAM credentials. The opt-in settings are disabled by default, and the issue requires an IPv6-enabled environment. This issue is fixed in versions 1.107.6 and 2.44.0.

Blast Radius

ecosystem impact
† from your stack dependencies † transitive graph · vuln.today resolves 4-path depth
  • 2 pypi packages depend on pydantic-ai (2 direct, 0 indirect)
  • 12 pypi packages depend on pydantic-ai-slim (10 direct, 2 indirect)

Ecosystem-wide dependent count for version 1.56.0 and other introduced versions.

Threat Intelligence Overview

EPSS Score
0.3%
Top 76% exploitable
Prevalence
Medium
popular but newer Python GenAI agent framework, not universally deployed
Threat Intel
1
1 source
Data Quality
6 sources
Confidence: High
EUVD 🇯🇵JVN NVD CVE.org EPSS Vulnrichment GHSA Vendor GitHub

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 MEDIUM
CISA KEV No
Public POC No
EPSS 0.3%
Patch available Yes
Active threat No
Deciding rule
MEDIUM severity (CVSS 4.0-6.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
Scheduled
Exploitation
None
System Exposure· derived
Open
Automatable
No
Human Impact· derived
Medium
Technical Impact
Partial

Priority Score

34
Low Medium High Critical
KEV: 0
EPSS: 0
CVSS: +34
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-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

CVE-2026-107288 LOW
3.7 Oct 08

A domain-denylist bypass in Pydantic AI's local web-fetch tooling (web_fetch_tool and the WebFetch local fallback) lets

Vendor StatusVendor

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