guzzlehttp/guzzle security advisory
CVE-2026-69246: Guzzle: Noncanonical host can bypass host-based checks
CVE-2026-69246 is a high-severity SSRF vulnerability in the PHP package guzzlehttp/guzzle (CVSS 7.2), published 3 August 2026. It is fixed in 7.15.2 and 8.0.1, one per release line; earlier versions on each line are affected. It can be exploited without an account.
high 7.2 published 2026-08-03 · updated 2026-09-08
- Affected versions
- < 7.15.2
>= 8.0.0, < 8.0.1 - Fixed in
- 7.15.2, 8.0.1
- Newest release
- 8.3.1
- Severity
- High · CVSS 7.2
- Type
- Server-side request forgery (SSRF)
CWE-180, CWE-436, CWE-918, CWE-941 - Exploited in the wild
- Not on the CISA KEV list
checked 2026-11-04
Is your guzzlehttp/guzzle version affected?
Who can exploit CVE-2026-69246
- Access: No account. Anyone who can send a request to an app that uses the affected code.
CVSS vector (scored by GitHub): CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:C/C:L/I:L/A:N
How to fix CVE-2026-69246 in guzzlehttp/guzzle
- Find the installed version:
composer show guzzlehttp/guzzle. If you never required it yourself,composer why guzzlehttp/guzzleshows which package pulls it in. - Update it:
composer update guzzlehttp/guzzle --with-all-dependencies. You need the fixed version for your release line (7.15.2 and 8.0.1). - If Composer will not go that high, your composer.json constraint is holding it back. Widen it (for example
"guzzlehttp/guzzle": "^8.0.1"if you can take that version), or upgrade the package that requires it. - Run
composer audit. It reads the same advisory data and should no longer list CVE-2026-69246. - Commit composer.lock and deploy it. On the server, run
composer install --no-devfrom the lock file, notcomposer update.
If you cannot upgrade yet
- Block outbound requests from the app server to private ranges and cloud metadata (169.254.169.254) at the firewall.
- Do not pass user-supplied URLs to the affected feature.
- If your app does not use the affected feature, note that in your audit, but still plan the upgrade.
The CVE-2026-69246 advisory
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.
References
- GitHub advisory GHSA-v5mv-p594-2x33 github.com
- Fix commit 3aeea04 github.com
- Fix commit 7441019 github.com
- Pull request #3907 github.com
- Pull request #3908 github.com
- Release 7.15.2 github.com
- Release 8.0.1 github.com
Other guzzlehttp/guzzle advisories
- medium CVE-2026-69245: Guzzle: Noncanonical cookie domain keeps subdomain scope 2026-08-03
- medium CVE-2026-67354: Guzzle: URI fragments disclosed in redirect Referer headers 2026-07-20
- medium CVE-2026-67355: Guzzle: Host-only cookie scope is not preserved 2026-07-20
- medium CVE-2026-67353: Guzzle: Unbounded response cookies risk denial of service 2026-07-20
- medium CVE-2026-59883: Guzzle: Cookie Disclosure and Injection via IP-Address Domains 2026-07-20
- medium CVE-2026-67339: Guzzle: Proxy-Authorization headers can be sent to origin servers 2026-07-20
Related
Need help patching or upgrading? Laskyr does PHP and Laravel security fixes and upgrades. Tell us what you run and we reply with a plan and a price.
Ask about a fixWhere this data comes from
- Affected and fixed versions: the Packagist security advisories API (GitHub Advisory Database and FriendsOfPHP), the same data
composer audituses. Synced 2026-11-03. - Description, score, weakness and references: NIST National Vulnerability Database (NVD), checked 2026-11-04. This product uses data from the NVD API but is not endorsed or certified by the NVD.
- Exploited-in-the-wild status: the CISA Known Exploited Vulnerabilities catalog, checked 2026-11-04.
- Compiled by Daniel Lasek at Laskyr from the sources above. The summary, “who can exploit it”, “how to fix it” and hardening sections are our plain-English reading of the record and are generated from it. The quoted description is the record's own text. Spot an error? Tell us.