Source: guzzle
Version: 7.15.1-1
Severity: important
Tags: security upstream
X-Debbugs-Cc: [email protected], Debian Security Team <[email protected]>

Hi,

The following vulnerabilities were published for guzzle.

CVE-2026-69245[0]:
| Guzzle is an extensible PHP HTTP client. Prior to 7.15.2 and 8.0.1,
| SetCookie::matchesDomain() gives every subdomain of a cookie Domain
| that cookie unless SetCookie::matchesDomain() recognizes the Domain
| as an IP literal or a numeric host, and the decision comes from the
| domain's own text, so two spellings a transport reads as an address
| keep subdomain scope. Hexadecimal and mixed-base forms such as
| 0x7f000001 and 0177.0.0.0x1 go unrecognized while libcurl 8.21.0
| reads both as 127.0.0.1. A percent-escaped Domain keeps that scope
| on both branches because percent-decoding sits above numeric
| parsing, so 192.168.0.%31 and 127.0.0.1%2e are registered names in
| the URI grammar rather than address literals, and no numeric rule in
| any base classifies them, while libcurl decodes the host before
| resolving and reads them as 192.168.0.1 and 127.0.0.1. A cookie
| stored for Domain=0x7f000001 is placed in the Cookie header of a
| request to evil.0x7f000001, disclosing a session identifier or token
| to a host that is not that address, and a response from
| evil.0x7f000001 setting Domain=0x7f000001 is accepted into the jar
| and replayed to the address, so a server answering for the look-
| alike name can fix a session or set application state. Exploitation
| requires the application to enable cookie support, address an origin
| by one of these spellings, and contact a host whose name ends in
| that spelling. This issue is fixed in versions 7.15.2 and 8.0.1.


CVE-2026-69246[1]:
| Guzzle is an extensible PHP HTTP client. Prior to 7.15.2 and 8.0.1,
| Guzzle gives a transport the request URI as text and supplies the
| Host header separately. The cURL handlers set CURLOPT_URL to the URI
| exactly as written and push that Host into CURLOPT_HTTPHEADER;
| StreamHandler does the same through fopen(). libcurl then parses the
| authority itself, percent-decoding it and, on an IDN-capable build,
| applying IDNA mapping, and uses the result to resolve, connect, name
| the TLS peer and address a proxy CONNECT, while the supplied Host
| suppresses the aligned one libcurl would have generated. For a URI
| host written as 127.0.0.%31, filter_var() rejects the host as an IP
| literal, yet libcurl decodes it to 127.0.0.1 and reaches loopback
| with no DNS lookup while the server receives Host: 127.0.0.%31. An
| attacker who influences a fetched URI can therefore reach a host the
| application's checks excluded and read whatever the host exposes of
| the response. The same divergence moves Guzzle's own decisions onto
| a spelling the transport does not use: no_proxy selects proxy
| routing from the literal host, and RedirectMiddleware decides from
| it whether to strip Authorization and Cookie. Exploitation requires
| the application to build a request URI from untrusted input and to
| make a host decision before handing it to Guzzle. This issue is
| fixed in versions 7.15.2 and 8.0.1.


If you fix the vulnerabilities please also make sure to include the
CVE (Common Vulnerabilities & Exposures) ids in your changelog entry.

For further information see:

[0] https://security-tracker.debian.org/tracker/CVE-2026-69245
    https://www.cve.org/CVERecord?id=CVE-2026-69245
[1] https://security-tracker.debian.org/tracker/CVE-2026-69246
    https://www.cve.org/CVERecord?id=CVE-2026-69246

Please adjust the affected versions in the BTS as needed.

Regards,
Salvatore

Reply via email to