CVE-2026-53723: Guzzle Services XML CDATA Injection (request integrity)
Guzzle Services, a popular PHP library for building API clients, has a flaw in how it writes untrusted data into XML requests. When an application serializes user-supplied input as XML element text (not attributes), an attacker can inject the string `]]>` to break out of the CDATA section and insert malicious XML elements. This only affects *outgoing* requests your application sends—not responses it receives. The attacker can manipulate what the downstream service sees, potentially bypassing security boundaries, injecting privileged fields, or creating duplicate elements. The fix is available in version 1.5.3 and later.
Source data · NVD / CISA · public domain
- CVSS
- 3.1 · 5.8 MEDIUM · CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:C/C:N/I:L/A:N
- Weaknesses (CWE)
- CWE-20, CWE-91
- Affected products
- 0 configuration(s)
- Published / Modified
- 2026-06-11 / 2026-06-17
NVD description (verbatim)
Guzzle Services provides an implementation of the Guzzle Command library that uses Guzzle service descriptions to describe web services, serialize requests, and parse responses into easy to use model structures. Versions prior ro 1.5.4 do not safely serialize scalar XML element values containing the CDATA terminator `]]>`. The XML request serializer writes values containing `<`, `>`, or `&` with `XMLWriter::writeCData($value)`. If attacker-controlled input contains `]]>`, the CDATA section closes early and the remainder is interpreted as XML markup. This is an outgoing request-body integrity issue, not a response parsing issue. The attacker does not need to control the service description or schema. Users are affected when all of the following are true: the application uses `guzzlehttp/guzzle-services` to serialize outgoing requests; a request parameter or `additionalParameters` schema uses `location: xml`; the value is serialized as XML element text, not an XML attribute; the value can contain attacker-controlled, user-controlled, tenant-controlled, or otherwise untrusted input; the value is not constrained by a safe `enum`, `pattern`, or custom filter that excludes `]]>`; and the downstream service parses the generated XML structurally and may act on unexpected, duplicated, or injected elements. Applications that serialize untrusted input into `location: xml` request parameters can emit XML containing attacker-controlled elements outside the intended text node. Depending on the receiving service, this can alter operation semantics, smuggle privileged fields, bypass modeled parameter boundaries, or create conflicting duplicated elements. Fixed service descriptions are sufficient if they contain an XML element parameter populated from attacker-controlled input. Users are not directly affected if they only use Guzzle Services to deserialize HTTP response bodies. Response XML parsing uses the response XML location visitor and does not invoke the vulnerable request XML serializer. Response bodies matter only in a second-order flow, such as parsing attacker-controlled response XML, storing or forwarding a parsed string value, and later using it as a `location: xml` request parameter. The issue is patched in `1.5.3` and later by safely splitting embedded CDATA terminators before serialization. The fix preserves the original scalar value as XML text and prevents injected nodes. As a workaround, constrain attacker-controlled XML element values with a strict `enum`, `pattern`, or custom filter that excludes `]]>`, or avoid serializing untrusted data into `location: xml` element text until patched. Where appropriate for the service schema, XML attributes are not affected because they are written with XMLWriter attribute APIs rather than CDATA sections. To determine whether action is needed, search service descriptions for request parameters using `location: xml`, including operation `parameters` and `additionalParameters`. Response-only `models` are not directly affected unless parsed values are reused for request serialization. For object and array parameters, review nested scalar properties because leaf element values can still be affected.
1 reference(s) · View on NVD →
SEC.co analysis · AI-assisted, reviewed against source
Technical summary
The vulnerability exists in Guzzle Services' XML request serializer, which uses `XMLWriter::writeCData()` to safely escape values containing `<`, `>`, or `&`. However, the CDATA wrapper itself is terminated by the sequence `]]>`. If an attacker controls a request parameter marked with `location: xml` in the service description, they can embed `]]>` in the parameter value. This prematurely closes the CDATA section, causing the remainder of the attacker's payload to be parsed as literal XML markup by the receiving service. The vulnerability requires several conditions: the application must use `guzzlehttp/guzzle-services`, the parameter must use XML element text (not attribute) serialization, the input must be untrusted, and the downstream service must parse the malformed XML structurally. The fix in version 1.5.3+ safely splits CDATA terminators before serialization, preserving the scalar value while preventing element injection.
Business impact
Organizations using Guzzle Services to communicate with external APIs or microservices face request integrity risks. An attacker exploiting this vulnerability can cause the downstream service to interpret requests differently than intended—for example, injecting hidden fields, duplicating parameters, or bypassing validation logic. The impact depends on the receiving service's parsing behavior and the sensitivity of data being transmitted. This is particularly concerning in multi-tenant environments where one tenant's input could affect another's requests, or in scenarios where privileged or sensitive fields can be smuggled through the XML injection. Applications that only use Guzzle Services to parse incoming responses are not directly at risk unless they subsequently reuse parsed data as input to a new outgoing request.
Affected systems
Any PHP application using `guzzlehttp/guzzle-services` version prior to 1.5.3 is potentially affected if it meets all of these conditions: (1) it serializes requests with parameters defined as `location: xml` in the service description; (2) those parameters are populated as XML element text (not XML attributes); (3) the parameter values can contain untrusted input (user-supplied, tenant-controlled, or from external sources); (4) the values are not restricted by a safe `enum`, `pattern`, or custom validation that excludes `]]>`; and (5) the receiving service parses the generated XML and acts on its structure. Applications using only response parsing, or those with all XML parameters as attributes rather than element text, are unaffected.
Exploitability
Exploitation requires no authentication, no special network position, and no user interaction. An attacker simply needs to control input to a parameter that the application serializes as XML element text. The attack is straightforward: inject `]]>` followed by XML markup. However, the severity is bounded by whether the downstream service parses the resulting malformed XML in a way that changes its behavior. Some strict XML parsers may reject the malformed document; others may accept it and act on the injected elements. This makes the vulnerability moderate in impact—not trivially exploitable against all downstream services, but dangerous against permissive parsers or services that accept duplicated or unexpected fields.
Remediation
Upgrade `guzzlehttp/guzzle-services` to version 1.5.3 or later. This version safely handles CDATA terminators by splitting them before serialization, preventing injection of XML elements. For applications unable to upgrade immediately, implement one or more workarounds: (1) constrain all untrusted XML element values with a strict `enum`, `pattern`, or custom validation filter that rejects the substring `]]>`; (2) restructure the service description to use XML attributes instead of element text for parameters that contain untrusted input (attributes are not affected because they use different XMLWriter APIs); or (3) avoid serializing untrusted data into `location: xml` parameters until patched. Review your service descriptions to identify all parameters using `location: xml`, including both operation-level and `additionalParameters` definitions, and audit whether their values are controlled by untrusted sources.
Patch guidance
Update `guzzlehttp/guzzle-services` to version 1.5.3 or later using your package manager: `composer update guzzlehttp/guzzle-services`. Verify the update in your `composer.lock` file. Test your application thoroughly with your downstream services to ensure the XML requests are still correctly formed and accepted. No configuration changes are required; the fix is transparent to application code. If you maintain custom service descriptions, no modifications are needed—the fix works with existing descriptions.
Detection guidance
To identify vulnerable configurations, search your service description files (typically YAML or JSON) for parameters with `location: xml`. Use a code search tool or grep to find service definitions and examine request parameter blocks. Pay special attention to nested object and array parameters, as leaf scalar properties can also be vulnerable. Correlate those parameters with code paths that populate them from untrusted sources: user input, query parameters, request bodies, or external APIs. Review your application logs and API gateway logs for suspicious XML payloads containing `]]>` sequences in request bodies, particularly in parameters known to use XML element text serialization. Monitor the receiving downstream service's logs for unexpected XML elements or parsing warnings that might indicate injection attempts.
Why prioritize this
This vulnerability warrants prompt patching because it affects request integrity in a broadly-used library and requires no authentication or user interaction to exploit. While severity is rated MEDIUM rather than HIGH due to the requirement that downstream services parse the malformed XML structurally, the consequences can be significant: parameter smuggling, field injection, and operation semantic changes. Organizations with multi-tenant systems or those sending sensitive data through Guzzle Services to external APIs should prioritize this update. The fix is low-risk (version 1.5.3 is already stable) and straightforward to deploy.
Risk score, explained
The CVSS 3.1 score of 5.8 (MEDIUM) reflects an attack with no authentication requirement, low attack complexity, and network-accessible scope—factors that elevate concern—but limited impact (integrity only, no confidentiality or availability loss). The score acknowledges that the vulnerability enables request tampering but does not guarantee exploitation against all downstream services. The scope change to CHANGED indicates the attacker can affect downstream services beyond the vulnerable application. This is a classic case where numeric severity understates real-world risk for certain deployments (e.g., APIs handling financial or multi-tenant data), warranting context-aware prioritization by threat teams.
Frequently asked questions
Does this vulnerability affect applications that only use Guzzle Services to parse API responses?
No. The vulnerability is specifically in the XML *request* serializer. Applications that only deserialize responses using Guzzle Services are not directly affected. However, if your application parses an attacker-controlled response, stores a value from it, and later reuses that value as input to an outgoing XML request parameter, you could be affected in that second-order flow. Review your data pipelines to identify such scenarios.
Can XML attributes be exploited the same way as XML element text?
No. XML attributes use different XMLWriter APIs and are not written using CDATA sections. They are not vulnerable to `]]>` injection. If your service description uses `location: xml` with attributes rather than element text, those parameters are safe from this attack.
What if we use an XML schema or enumeration to restrict parameter values?
That is an effective mitigation. If your service description constrains a parameter with a strict `enum` list, `pattern` regex, or custom validation filter that explicitly excludes the substring `]]>`, the parameter cannot be exploited. However, this mitigation only works if the constraint is enforced *before* serialization and cannot be bypassed by the application code.
Will upgrading to 1.5.3 break our existing integrations?
Unlikely. The fix preserves the original scalar value as XML text and ensures the output is valid XML, so downstream services should continue to parse requests correctly. However, test your integrations in a staging environment before deploying to production to confirm compatibility with your downstream services.
This analysis is provided for informational purposes and reflects the CVE details and available technical documentation as of the publication date. While we strive for accuracy, SEC.co makes no warranty regarding completeness or fitness for a specific environment. Organizations should validate all findings against their own systems and the official vendor advisory. This vulnerability carries a MEDIUM CVSS score but may pose elevated risk in multi-tenant or high-value data transmission scenarios; threat prioritization should factor in your specific use of Guzzle Services and downstream service configurations. No working exploit code or proof-of-concept details are provided; for security research, consult the vendor advisory and responsible disclosure guidelines. Always test patches in a non-production environment before deployment. Source: NVD (public-domain), retrieved 2026-07-20. Analysis generated by SEC.co (claude-haiku-4-5).
Related vulnerabilities
- CVE-2024-21944MEDIUMMemory Integrity Vulnerability in DIMM SPD Validation
- CVE-2025-5089MEDIUMArista EOS/CVX DoS via Malformed Messages
- CVE-2025-5090MEDIUMCVX CVE-2025-5090: Input Validation Flaw Leads to Agent Crashes and Denial of Service
- CVE-2026-0018MEDIUMAndroid AccessibilityManagerService Denial of Service Vulnerability
- CVE-2026-0051MEDIUMAndroid UBSan Runtime Denial of Service Vulnerability
- CVE-2026-0070MEDIUMAndroid DevicePolicyManagerService Local Denial of Service Vulnerability
- CVE-2026-0085MEDIUMAndroid Contact Handler Denial of Service Vulnerability
- CVE-2026-0410MEDIUMNetgear Router Firmware Integrity Vulnerability