CVEReports
CVEReports

Automated vulnerability intelligence platform. Comprehensive reports for high-severity CVEs generated by AI.

Product

  • Home
  • Sitemap
  • RSS Feed

Company

  • About
  • Contact
  • Privacy Policy
  • Terms of Service

© 2026 CVEReports. All rights reserved.

Made with love by Amit Schendel & Alon Barad



GHSA-4CC2-G9W2-FHF6

GHSA-4cc2-g9w2-fhf6: Server-Side Request Forgery in python-zeep via Transitive Schema Resolution

Amit Schendel
Amit Schendel
Senior Security Researcher

Jun 21, 2026·6 min read·2 visits

Executive Summary (TL;DR)

A silent regression in python-zeep versions 4.0.0 to 4.3.2 ignores the forbid_external security setting, allowing remote attackers to trigger unauthenticated SSRF against internal endpoints.

A regression in python-zeep (versions 4.0.0 through 4.3.2) silently ignores the security configuration designed to block transitive external resource fetches during WSDL and XSD parsing. This defect exposes applications to Server-Side Request Forgery (SSRF) when loading untrusted schemas.

Vulnerability Overview

The python-zeep library is a widely utilized SOAP client for Python. It parses Web Services Description Language (WSDL) and XML Schema Definition (XSD) files to compile programmatic interfaces for interacting with web services. During parsing, the library must resolve various nested elements and external schema components to build complete request and response models.

By default, SOAP definitions allow referring to other schemas through elements such as <xsd:import>, <xsd:include>, and <wsdl:import>. In python-zeep, processing these transitive references triggers secondary network requests to load the referenced target URLs. If an attacker controls or influences the initial schema file, they can direct the client to parse nested references pointing to sensitive internal endpoints.

This behavior leads to Server-Side Request Forgery (SSRF) mapped under CWE-918. Although python-zeep defined a configuration parameter named Settings.forbid_external to disable these remote fetches, a major architectural change caused this setting to be ignored. This vulnerability exposes application servers to unintended outbound connections, enabling access to local metadata engines and private network segments.

Root Cause Analysis

The root cause of this regression stems from an architectural migration away from the defusedxml package in version 4.0.0. Prior to this release, python-zeep relied on defusedxml to parse incoming XML and prevent standard XML-based vectors, such as XML Entity Expansion and external entity resolution. When the project transitioned to utilizing native lxml parsing logic combined with a custom resolver, the security mechanisms were refactored.

During this transition, the security configuration forbid_external was correctly declared in the Settings class with a default value of True. However, the loader and schema resolver implementations were not updated to read or enforce this attribute. Specifically, neither ImportResolver in src/zeep/loader.py nor the schema parsers in the WSDL and XSD submodules passed the settings object down to the active parser resolution context.

As a consequence, when the lxml engine encountered a external reference, it invoked the custom ImportResolver class. Because this class lacked awareness of the forbid_external setting, it unconditionally resolved any http or https URI using the application transport layer. The configuration setting remained a silent, non-functional parameter that developers assumed was protecting their environment.

Code Analysis and Diagram

To understand the resolution path and where the security policy failed, analyze the interaction between the loader and the XML parsers. The following diagram illustrates how the missing reference allowed external loads to bypass the security switch:

In the vulnerable implementation of src/zeep/loader.py, the custom resolver class did not receive the settings configuration block during initialization:

# src/zeep/loader.py (Vulnerable Code)
class ImportResolver(Resolver):
    def __init__(self, transport):
        # Settings are never passed or stored
        self.transport = transport
 
    def resolve(self, url, pubid, context):
        if urlparse(url).scheme in ("http", "https"):
            # Unconditional remote retrieval occurs here
            content = self.transport.load(url)
            return self.resolve_string(content, context)

The fix introduces the settings parameter into the resolver and checks the forbid_external attribute prior to dispatching network queries:

# src/zeep/loader.py (Patched Code)
class ImportResolver(Resolver):
    def __init__(self, transport, settings=None):
        self.transport = transport
        # Defaults to default settings if none provided
        self.settings = settings or Settings()
 
    def resolve(self, url, pubid, context):
        if urlparse(url).scheme in ("http", "https"):
            # Enforce the security boundary
            if self.settings.forbid_external:
                raise ExternalReferenceForbidden(url)
            content = self.transport.load(url)
            return self.resolve_string(content, context)

Furthermore, the patch introduces an internal flag called _initial when parsing documents. This flag ensures that the top-level schema specified by the developer is allowed to load, but any subsequent secondary, recursive schemas triggered by imports are subjected to the strict forbid_external check.

Exploitation Methodology

To exploit this vulnerability, an attacker must identify an application endpoint that accepts a user-provided WSDL or XSD URL, or processes an uploaded XML document that gets parsed by python-zeep. The target application does not need to run with elevated privileges; the client context is sufficient.

The attack vector begins by hosting a custom WSDL document on a public server. This document contains a transitive schema import directing the server to retrieve an internal host resource. The target URL is typically directed toward local loopback addresses, RFC 1918 private subnets, or cloud-specific instance metadata links:

<?xml version="1.0" encoding="utf-8"?>
<wsdl:definitions xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
                  xmlns:xsd="http://www.w3.org/2001/XMLSchema"
                  targetNamespace="http://example.com/">
  <wsdl:types>
    <xsd:schema targetNamespace="http://example.com/">
      <xsd:import namespace="http://internal.service/"
                  schemaLocation="http://169.254.169.254/latest/meta-data/iam/security-credentials/"/>
    </xsd:schema>
  </wsdl:types>
</wsdl:definitions>

When the vulnerable application processes this file, the custom ImportResolver reads the schemaLocation parameter. It triggers an HTTP GET request to the local AWS Instance Metadata Service (IMDSv1). If successful, the fetched administrative credentials are included in the compilation cycle or leaked through parsing error messages returned in the HTTP response.

Impact & Security Assessment

The impact of this vulnerability is significant for systems deployed in cloud-native environments or connected to restricted intranet services. Through SSRF, unauthenticated remote attackers can query non-routable internal networks that are shielded from the public internet. This allows port scanning, identification of local network topology, and interaction with unauthenticated management interfaces.

In environments utilizing cloud infrastructure (such as AWS, Google Cloud, or Microsoft Azure), the vulnerability allows retrieval of instance metadata. For example, queries targeting http://169.254.169.254/ can leak short-term IAM credentials, instance configuration data, and network bootstrap tokens.

This vulnerability has been assigned a CVSS v3.1 base score of 5.9 (Medium). The scoring reflects a high confidentiality impact (C:H) due to potential credential exposure, combined with a high attack complexity (AC:H) because exploitation depends on application endpoints accepting dynamic schema paths and processing them under a vulnerable client configuration.

Remediation & Defense-in-Depth

To completely resolve this vulnerability, update python-zeep to version 4.3.3 or later. It is critical to recognize that upgrading the library alone is insufficient to secure the application. To maintain backwards compatibility with existing implementations, the patch updated the default value of the forbid_external parameter from True to False.

Developers must explicitly enable this parameter during client initialization. To secure your implementation, modify the client configuration as shown below:

from zeep import Client, Settings
 
# Configure settings to explicitly block transitive external schemas
settings = Settings(forbid_external=True)
 
# Instantiate client with secure settings
client = Client("https://example.com/api?wsdl", settings=settings)

If upgrading immediately is not possible, implement firewall rules to restrict egress traffic. Restrict application containers from making outbound network connections to local resources and the link-local metadata range (169.254.169.254). If possible, transition AWS environments to IMDSv2 and enforce a session token hop limit of 1 to mitigate metadata extraction.

Official Patches

mvantellingenSecurity fix commit wiring up forbid_external setting
mvantellingenRelease tag for 4.3.3 containing the security patch

Fix Analysis (1)

Technical Appendix

CVSS Score
5.9/ 10
CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:H/I:N/A:N

Affected Systems

Applications implementing python-zeep (zeep) version 4.0.0 through 4.3.2

Affected Versions Detail

Product
Affected Versions
Fixed Version
zeep
mvantellingen
>= 4.0.0, <= 4.3.24.3.3
AttributeDetail
CWE IDCWE-918
Attack VectorNetwork
CVSS v3.15.9 (Medium)
ImpactConfidentiality High
Exploit StatusProof of Concept available
KEV StatusNot listed

MITRE ATT&CK Mapping

T1190Exploit Public-Facing Application
Initial Access
T1557Adversary-in-the-Middle
Credential Access
CWE-918
Server-Side Request Forgery (SSRF)

The web server receives a URL from an upstream client and retrieves the resource without validating the destination.

Known Exploits & Detection

GitHub Security Advisoryhttps://github.com/mvantellingen/python-zeep/security/advisories/GHSA-4cc2-g9w2-fhf6

Vulnerability Timeline

Version 4.0.0 released with regression (migration from defusedxml to lxml)
2020-09-01
Vulnerability identified and code patch committed
2026-06-18
GHSA-4cc2-g9w2-fhf6 Advisory published and version 4.3.3 released
2026-06-19

References & Sources

  • [1]GHSA-4cc2-g9w2-fhf6 Security Advisory

Attack Flow Diagram

Press enter or space to select a node. You can then use the arrow keys to move the node around. Press delete to remove it and escape to cancel.
Press enter or space to select an edge. You can then press delete to remove it or escape to cancel.

More Reports

•about 3 hours ago•CVE-2026-11941
5.6

CVE-2026-11941: Use-After-Free Vulnerabilities in Cloudflare Quiche FFI Layer

Two critical use-after-free vulnerabilities exist within the Foreign Function Interface (FFI) layer of Cloudflare Quiche, affecting connection ID iterator functions. These flaws occur because raw pointers are returned to C callers pointing to temporary, owned Rust values that are immediately dropped and deallocated upon function exit. This leads to undefined behavior, potential limited heap information disclosure, or application crashes when integrating applications dereference these dangling pointers.

Alon Barad
Alon Barad
4 views•7 min read
•about 4 hours ago•GHSA-C3XH-98XP-6QHF
7.1

GHSA-C3XH-98XP-6QHF: Command Injection via Issue Title in Discord Notification Workflow

A command injection vulnerability exists in the .github/workflows/discord-issue.yml workflow of the gouef/githubtoplanguages repository. By exploiting literal string interpolation of untrusted issue titles into an inline Bash script, an attacker can execute arbitrary code within the GitHub Actions runner environment. This exposure risks the theft of repository secrets such as the Discord webhook URL.

Alon Barad
Alon Barad
4 views•5 min read
•about 5 hours ago•GHSA-F4XH-W4CJ-QXQ8
7.7

GHSA-F4XH-W4CJ-QXQ8: Arbitrary Server-Side File Read in LangSmith SDK TracingMiddleware

The LangSmith Python SDK TracingMiddleware is vulnerable to an arbitrary server-side file read. Due to origin validation and type confusion flaws, external inputs parsed from distributed tracing headers bypass local filesystem read protections, allowing remote attackers to silently exfiltrate arbitrary server files to the telemetry dashboard.

Alon Barad
Alon Barad
4 views•6 min read
•1 day ago•GHSA-H5X8-XP6M-X6Q4
7.1

GHSA-H5X8-XP6M-X6Q4: Unvalidated Signature Generation in @jhb.software/payload-cloudinary-plugin

The @jhb.software/payload-cloudinary-plugin exposes an endpoint that performs unvalidated cryptographic signing of Cloudinary API parameters, allowing authenticated users with minimal privileges to forge valid signatures for arbitrary actions. This flaw allows attackers to overwrite remote storage assets, execute unauthorized file uploads, alter asset visibility parameters, trigger SSRF webhooks, and perform directory traversal within Cloudinary repositories.

Alon Barad
Alon Barad
3 views•6 min read
•1 day ago•GHSA-G2GW-Q38M-VJFC
8.7

GHSA-G2GW-Q38M-VJFC: Server-Side Request Forgery and Bearer Token Exfiltration in @merill/lokka

A Server-Side Request Forgery (SSRF) and Bearer Token Exfiltration vulnerability exists in the @merill/lokka (Lokka) Model Context Protocol (MCP) server prior to version 2.1.2. The server constructed Azure Resource Manager request URLs by concatenating user-controlled path parameters directly into destination request strings. By injecting authority-redefinition characters, an attacker can manipulate URL parsing to execute a host-escape attack, forcing the server to send high-privilege Azure Resource Manager (ARM) Bearer tokens to an external attacker-controlled host. This allows complete administrative access to the associated Azure subscriptions.

Alon Barad
Alon Barad
6 views•7 min read
•1 day ago•GHSA-4XGF-CPJX-PC3J
5.3

GHSA-4xgf-cpjx-pc3j: Directory Traversal and Symlink Following in Pydantic Settings

A directory traversal and symlink following vulnerability exists in Pydantic Settings when using the NestedSecretsSettingsSource with nested subdirectory lookups enabled. An attacker capable of writing to the secrets directory can bypass size limitations, read arbitrary host files, or cause a denial-of-service condition via cyclic symlinks.

Amit Schendel
Amit Schendel
2 views•7 min read