chore(deps): update dependency guzzlehttp/guzzle to v7.14.2 [security]#30
Open
renovate[bot] wants to merge 1 commit into
Open
chore(deps): update dependency guzzlehttp/guzzle to v7.14.2 [security]#30renovate[bot] wants to merge 1 commit into
renovate[bot] wants to merge 1 commit into
Conversation
renovate
Bot
force-pushed
the
renovate/packagist-guzzlehttp-guzzle-vulnerability
branch
from
July 12, 2026 15:53
2c59ced to
9bf4381
Compare
renovate
Bot
force-pushed
the
renovate/packagist-guzzlehttp-guzzle-vulnerability
branch
from
July 20, 2026 19:12
9bf4381 to
be95909
Compare
Contributor
Author
|
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
This PR contains the following updates:
7.9.2→7.14.2guzzlehttp/guzzle: Silent HTTPS-Proxy Downgrade to Cleartext
CVE-2026-55568 / GHSA-wpwq-4j6v-78m3
More information
Details
Impact
The built-in cURL handlers (
GuzzleHttp\Handler\CurlHandlerandGuzzleHttp\Handler\CurlMultiHandler, used by default whenever the PHP cURL extension is available) accept anhttps://proxy — a proxy reached over a TLS-encrypted connection — through theproxyrequest option, client-levelproxydefaults, or proxy environment variables such ashttp_proxy,https_proxy,HTTPS_PROXY,all_proxy, andALL_PROXY.When the installed libcurl does not support HTTPS proxies, behavior depends on the libcurl version/build:
https://proxy as a plaintexthttp://proxy. The TLS connection to the proxy is never established, and the proxy leg is cleartext with no error or warning.The security-relevant case is the silent downgrade on libcurl older than 7.50.2. An application is affected when it sends requests through one of the built-in cURL handlers, configures an
https://proxy expecting the proxy connection itself to be encrypted, and runs with libcurl older than 7.50.2.In that configuration, traffic expected to be protected by TLS on the hop to the proxy is transmitted in cleartext. Proxy authentication credentials (the
Proxy-Authorizationheader, proxy userinfo in the proxy URL, orCURLOPT_PROXYUSERPWD) are sent without encryption, and theCONNECTtarget host and port for tunneled HTTPS requests are exposed. For plain HTTP requests, request headers and bodies are also exposed on the proxy leg. End-to-end HTTPS requests tunneled through the proxy remain protected by their inner TLS session; the exposure is limited to the proxy negotiation and proxy credentials.Applications that do not configure an
https://proxy are not affected. Installations running libcurl 7.52.0 or newer built with HTTPS-proxy support are not affected because HTTPS proxies work as intended. Installations running libcurl 7.50.2 through 7.51.x, or libcurl 7.52.0 or newer built without HTTPS-proxy support, are not exposed to the silent cleartext downgrade, but Guzzle now rejects those unsupported configurations up front as well. The built-in stream handler is not affected; the issue is specific to the cURL handlers' proxy handling. Low-level cURL options under thecurlrequest option, such asCURLOPT_PROXYorCURLOPT_PROXYTYPE, are advanced custom configuration and remain the caller's responsibility.Patches
The issue is patched in
7.12.1and later. Starting in that release, the built-in cURL handlers detect whether the installed libcurl supports HTTPS proxies — requiring both libcurl 7.52.0 or newer and theCURL_VERSION_HTTPS_PROXYfeature bit — and reject a request configured through Guzzle's first-class proxy handling with anhttps://proxy up front by throwing aGuzzleHttp\Exception\RequestException. No request bytes reach the network when the proxy cannot be used securely. Versions before7.12.1are affected by the silent downgrade when run against libcurl older than 7.50.2.Workarounds
If you cannot upgrade immediately, do not configure an
https://proxy on an installation whose libcurl lacks HTTPS-proxy support, and verify the capability in application code before using one. Remember to check proxy environment variables as well as any explicitproxyoption:Upgrading the system libcurl to 7.52.0 or newer built with HTTPS-proxy support also resolves the underlying unsupported-proxy behavior.
Severity
CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:H/I:N/A:NReferences
This data is provided by the GitHub Advisory Database (CC-BY 4.0).
guzzlehttp/guzzle: Dot-Only Cookie Domains Match All Hosts
CVE-2026-55767 / GHSA-cwxw-98qj-8qjx
More information
Details
Impact
CookieJarincorrectly accepts cookies with a dot-onlyDomainattribute, such asDomain=.,Domain=..,Domain=..., and whitespace-padded variants such asDomain= .. In affected versions,SetCookie::matchesDomain()removes leading dots from the cookie domain, normalizing dot-only values to the empty string;SetCookie::validate()only rejected a strictly empty domain, so these cookies could be stored and the empty normalized domain was treated as matching any request host.An attacker-controlled origin that an application requests with a shared cookie jar can therefore set a cookie that Guzzle later sends to unrelated hosts using the same jar. This may allow cookie injection or session fixation against downstream services, depending on how those services interpret the injected cookie. Applications are affected when they use Guzzle's cookie support, for example
new Client(['cookies' => true])or an explicit sharedCookieJar, and reuse the same jar across attacker-controlled and trusted origins.Applications that do not use Guzzle's cookie support, or that use separate cookie jars per origin or trust boundary, are not affected. This issue is distinct from public suffix list validation: dot-only domains contain no domain label and should not match unrelated hosts.
Patches
The issue is patched in
7.12.1and later. Starting in that release, Guzzle rejects dot-only cookieDomainattributes and prevents an empty normalized cookie domain from matching any request host.Workarounds
If you cannot upgrade immediately, do not reuse the same
CookieJarinstance across untrusted and trusted origins. Use separate cookie jars per origin or trust boundary, or disable cookie handling for requests to untrusted hosts.Avoid using
new Client(['cookies' => true])for clients that may contact unrelated hosts with different trust levels, because that option creates one shared jar for the client.Severity
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:C/C:N/I:L/A:NReferences
This data is provided by the GitHub Advisory Database (CC-BY 4.0).
Guzzle: Proxy-Authorization headers can be sent to origin servers
GHSA-94pj-82f3-465w
More information
Details
Impact
In affected versions, the built-in cURL handlers (
CurlHandlerandCurlMultiHandler) put every first-class request header in cURL's origin header list (CURLOPT_HTTPHEADER). These handlers are the default when the PHP cURL extension is available. They moveProxy-Authorizationto the proxy-only list (CURLOPT_PROXYHEADER) only when Guzzle predicts an HTTP or HTTPS proxy. A "first-class" header is part of the normal request message and can be set on a PSR-7 request, through clientheadersdefaults, theheadersrequest option, or middleware. It does not include a literal line supplied through rawCURLOPT_HTTPHEADER,CURLOPT_PROXYHEADER, orstream_context.http.headercontrols.Because that migration follows Guzzle's prediction rather than the route libcurl actually takes, the credential stays in the origin list and is sent to the origin server when a request is:
proxyset to''to disable proxying.no,no_proxy, orNO_PROXYmatch.AuthorizationandCookie, does not stripProxy-Authorizationcross-origin.On installations whose libcurl is older than 7.37.0, or whose PHP cURL extension lacks
CURLOPT_PROXYHEADER,CURLOPT_HEADEROPT, andCURLHEADER_SEPARATE, no proxy-only channel is available, so cURL left the header in the origin list for every route. The stream handler also serialized first-class values before selecting a proxy. PHP removes only the firstProxy-Authorizationline from CONNECT, so another first-class value or a URL-userinfo Basic line could reach the tunneled origin. A later rawstream_context.http.proxyoverride could instead reroute either credential directly to the origin.The disclosed value is a private credential meant only for the proxy. RFC 9110 defines
Proxy-Authorizationas credentials for the next inbound proxy, and an origin is never an intended recipient. The flaw can silently give a working proxy credential to an unrelated third party. In the worst case, an attacker controls the origin and records the credential through access logs, tracing systems, or application logs. If it remains valid, the attacker can abuse a paid or access-controlled proxy, impersonate the proxy principal, or reach destinations the proxy is trusted to reach. A strong remote exploit is possible when an application sends a request to an attacker-controlled HTTP URL through a proxy with a defaultProxy-Authorizationheader, then follows the attacker's redirect to an HTTPS or no-proxy destination that Guzzle reaches directly.Using a first-class
Proxy-Authorizationheader is a legitimate, documented configuration, so affected applications are not misusing the library. Guzzle does not create this field, so applications that never configure one are unaffected by the first-class-header flaw. Proxy URL userinfo is not affected on its own, but the stream handler could expose its Basic line when combined with a first-class field or a later rawstream_context.http.proxyoverride.CURLOPT_PROXYUSERPWDis unaffected. Literal lines supplied through rawCURLOPT_HTTPHEADER,CURLOPT_PROXYHEADER, orstream_context.http.headerremain caller-controlled and outside the first-class-header guarantee.Patches
The issue is fixed in
7.14.2. The cURL handlers keep first-classProxy-Authorizationvalues out of the origin header list. When proxy header separation is available, they pass the values throughCURLOPT_PROXYHEADERwithCURLHEADER_SEPARATE. An empty value uses cURL's semicolon form to suppress credentials from proxy URL userinfo. On older builds, Guzzle drops the field for direct, bypassed, and SOCKS routes, but fails before network I/O if the request might use an HTTP or HTTPS proxy.The stream handler removes the field from origin headers before choosing a route. If it selects a proxy, it accepts one value, including empty, writes a validated proxy header, and gives that value precedence over proxy URL userinfo. Multiple values, line breaks, and raw proxy overrides that could reroute generated credentials fail before connection. Direct and bypassed requests drop the field. Versions before
7.14.2are affected by these origin-bound credential paths.Workarounds
If you cannot upgrade immediately, remove first-class
Proxy-Authorizationfields from requests, client defaults, and middleware. Supply proxy credentials instead through proxy URL userinfo, for examplehttp://user:pass@proxy.example:8080, or useCURLOPT_PROXYUSERPWDwith the cURL handlers. Do not combine proxy URL userinfo with a first-class field or a rawstream_context.http.proxyoverride. If a first-class field is unavoidable, use libcurl 7.37.0 or newer withCURLOPT_PROXYHEADER,CURLOPT_HEADEROPT, andCURLHEADER_SEPARATE, and ensure the field is never present on a client that can issue direct, bypassed, or SOCKS requests or follow redirects into those routes. A newer libcurl is necessary but does not fix Guzzle's route-dependent migration by itself, and disabling redirects reduces but does not eliminate exposure.References
Severity
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:L/I:N/A:NReferences
This data is provided by the GitHub Advisory Database (CC-BY 4.0).
Guzzle: Cookie Disclosure and Injection via IP-Address Domains
CVE-2026-59883 / GHSA-g446-98w2-8p5w
More information
Details
Impact
CookieJardoes not restrict a cookie scoped to an IP address to the exact host that set it. When a stored cookie'sDomainattribute is an IPv4 literal (Domain=192.168.0.1), a bracketed IPv6 literal (Domain=[::1]), or a bare numeric value that denotes an IPv4 address (Domain=1, which is0.0.0.1),SetCookie::matchesDomain()applies ordinary subdomain (suffix) matching to it instead of requiring an exact host. The IP-address check insidematchesDomain()is applied only to the request host and never to the cookie's own domain, and response cookies that carry an explicitDomainattribute are stored as suffix-matchable. As a result Guzzle sends such a cookie to any host whose name ends in that value as a trailing label, for example sending aDomain=192.168.0.1cookie toevil.192.168.0.1, or aDomain=1cookie toevil.1. The same flaw lets a look-alike host store a cookie that Guzzle then sends to the bare IP address. Depending on how the receiving service interprets the cookie, the impact is cross-host cookie disclosure, cookie injection, or session fixation.You are affected if your application uses Guzzle's cookie support, for example
new Client(['cookies' => true])or an explicitCookieJar, reuses one cookie jar across more than one host or trust boundary, and that jar can hold a cookie scoped to an IP-address or bare-numeric host. To actually leak a cookie the application must also resolve and connect to a look-alike host whose name ends in the IP-address label, such asevil.192.168.0.1. Such names are not publicly registrable, so in practice an attacker needs some influence over name resolution, which is realistic on private, split-horizon, container, or development networks. You are not affected if you do not use Guzzle's cookie support, if you use a separate cookie jar per host or trust boundary, or if your jars never hold cookies scoped to IP-address or bare-numeric hosts. This issue is independent of public suffix list validation. Per RFC 6265, an IP-address cookie domain must match only the exact host that set it and must never match a subdomain.Patches
The issue is patched in
7.12.3and later. Starting in that release, Guzzle matches an IPv4 literal, a bracketed IPv6 literal, or a bare-numeric cookieDomainonly against the exact request host, and no longer applies subdomain suffix matching to them.Workarounds
If you cannot upgrade immediately, do not reuse one
CookieJarinstance across untrusted and trusted origins. Use a separate cookie jar per host or trust boundary, or disable cookie handling for requests to untrusted hosts, and avoid scoping cookies to IP-address or bare-numeric hosts. In particular, avoidnew Client(['cookies' => true])for any client that may contact unrelated hosts at different trust levels, because that option creates a single shared jar for the whole client.References
Severity
CVSS:3.1/AV:N/AC:H/PR:N/UI:R/S:C/C:L/I:L/A:NReferences
This data is provided by the GitHub Advisory Database (CC-BY 4.0).
Release Notes
guzzle/guzzle (guzzlehttp/guzzle)
v7.14.2Compare Source
Security
v7.14.1Compare Source
Changed
guzzlehttp/psr7version constraint to^2.12.5Fixed
@separatorsstream => true) on cap-configured stream handlersoptionsvaluesCURLOPT_HTTPAUTHmask permits NTLMCURLMOPT_PIPELININGwhen combined with explicit multiplexingon_statscallback throwson_trailerscallback is configuredon_trailerscallback before starting a cURL transferon_trailersrequest option on the stream handler, which cannot observe trailersv7.14.0Compare Source
Added
on_trailersrequest option to expose parsed HTTP response trailersmultiplexrequest option withMultiplexing::*modes to control or require HTTP/2 multiplexingmultiplexrequests whenCURLMOPT_PIPELININGdisables multiplexingmax_host_connectionsandmax_total_connectionsclient and cURL multi handler optionsChanged
CURLOPT_SHAREwhen combined with authenticated SOCKS proxy configurationCURLOPT_CERTINFOoptionDeprecated
CURLOPT_PIPEWAITcURL option in favour of themultiplexrequest optionselect_timeoutcURL multi handler option valuesv7.13.3Compare Source
Changed
guzzlehttp/promisesversion constraint to^2.5.1guzzlehttp/psr7version constraint to^2.12.4Fixed
no_proxyvaluesv7.13.2Compare Source
Fixed
RuntimeExceptionv7.13.1Compare Source
Fixed
v7.13.0Compare Source
Added
crypto_method_maxrequest option to cap the maximum TLS protocol versionChanged
CURLOPT_SHAREwhen combined with authenticated HTTP/HTTPS proxy tunnel configurationCURLOPT_PREREQFUNCTIONcallbacks when defined by PHP cURLcrypto_methodrequests to the stream handler when cURL cannot select TLS 1.2Deprecated
v7.12.3Compare Source
Changed
guzzlehttp/psr7version constraint to^2.12.3Security
v7.12.2Compare Source
Fixed
Max-Ageso a very large value no longer overflows to an already-expired timestampCookieJarconflict resolution so distinct numeric-string names don't overwriteDomainhas a trailing dot on the origin host instead of silently discarding itStreamHandlerhard-failing on bracketed IPv6 literal hosts whenforce_ip_resolveis setPathcomparison soCookieJar::clear()with a numeric path keeps a distinct-path cookieDomain,Max-Age, path, and name valuesdecode_contenthandling for falsey string valuesv7.12.1Compare Source
Changed
guzzlehttp/psr7version constraint to^2.12.1Fixed
Security
Domainattributes as match-all (GHSA-cwxw-98qj-8qjx)v7.12.0Compare Source
Added
RequestOptionsconstants forcurl,retries, andstream_contextChanged
guzzlehttp/psr7version constraint to^2.12proxyrequest option makes a decisionPsr7\Utils::redactUserInfo()Deprecated
handleroption, which will be ignored in 8.0CURLOPT_PROXYTYPEcURL request option; set the proxy type via a scheme-prefixed proxy URLntlmas a built-inauthtypeUtils::describeType()queryandform_paramsoptions; 8.0 rejects thembodyoption; 8.0 rejects themFixed
nolist matches being re-proxied through environment-configured proxies by libcurlnolist andNO_PROXYmatching to support IP CIDR ranges, matching libcurlv7.11.2Compare Source
Fixed
v7.11.1Compare Source
Fixed
transport_sharing, matching other unknown request optionsv7.11.0Compare Source
Added
proxyrequest option'snovalue as a comma-delimited stringprotocolsrequest option to restrict allowed URI schemes for request transferscert_typeandssl_key_typerequest options for TLS certificate and private-key file typesssl_keyrequest optiontransport_sharingclient and cURL handler optionsChanged
guzzlehttp/promisesversion constraint to^2.5guzzlehttp/psr7version constraint to^2.11SetCookieinstances to be stored without wildcard request matchingCurlMultiHandlerdestructors from throwing during cleanupDeprecated
Poolrequest collections, which will be rejected in 8.0headersrequest option values, which will be rejected in 8.0headersrequest option value arrays, which will be rejected in 8.0CURLOPT_SHARE, which will be rejected in 8.0idn_conversionrequest option values, which will be rejected in 8.0RequestException::wrapException(), which will be removed in 8.0RetryMiddleware::exponentialDelay(), which will be removed in 8.0v7.10.6Compare Source
Fixed
CurlMultiHandlernow rejects the promise whenCurlFactory::finish()throws, preserving sibling transfersSetCookienow normalizes unparseableExpiresvalues tonullinstead offalsegzip/deflatetruncation by dropping invalidContent-Lengthv7.10.5Compare Source
Fixed
ConnectExceptionv7.10.4Compare Source
Fixed
options()to uppercase inferred HTTP methodsv7.10.3Compare Source
Fixed
v7.10.2Compare Source
Fixed
v7.10.1Compare Source
Fixed
v7.10.0Compare Source
Added
Changed
guzzlehttp/promisesversion constraint to^2.3guzzlehttp/psr7version constraint to^2.8v7.9.3Compare Source
Changed
Configuration
📅 Schedule: (UTC)
🚦 Automerge: Disabled by config. Please merge this manually once you are satisfied.
♻ Rebasing: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.
🔕 Ignore: Close this PR and you won't be reminded about this update again.
This PR was generated by Mend Renovate. View the repository job log.