CVE-2026-67339
guzzlehttp/guzzle before 7.14.2 Proxy-Authorization Header Disclosure
guzzlehttp/guzzle versions before 7.14.2 fail to properly isolate Proxy-Authorization headers from origin servers in cURL handlers. Attackers can capture proxy credentials through origin server access logs when requests are redirected, bypassed, or sent through SOCKS proxies that Guzzle misclassifies as direct connections.
Attack profile
How easy it is to exploit
- Attack vector
- Network
- Complexity
- Low
- Privileges needed
- None
- User interaction
- None
What an attacker can affect
- Confidentiality
- Low
- Integrity
- None
- Availability
- None
Exploit likelihood
What each source reports
CVE List Score used
6.9
guzzlehttp/guzzle before 7.14.2 Proxy-Authorization Header Disclosure
guzzlehttp/guzzle versions before 7.14.2 fail to properly isolate Proxy-Authorization headers from origin servers in cURL handlers. Attackers can capture proxy credentials through origin server access logs when requests are redirected, bypassed, or sent through SOCKS proxies that Guzzle misclassifies as direct connections.
- Record
CVE-2026-67339- CVSS 4.0
- 6.9 Medium
CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:L/VI:N/VA:N/SC:N/SI:N/SA:N - CVSS 3.1
- 5.3 Medium
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:L/I:N/A:N - Weakness
- CWE-200
- Updated
- 2026-11-02
EUVDEUVD-2026-51854
6.9
guzzlehttp/guzzle versions before 7.14.2 fail to properly isolate Proxy-Authorization headers from origin servers in cURL handlers. Attackers can capture proxy credentials through origin server access logs when requests are redirected, bypassed, or sent through SOCKS proxies that Guzzle misclassifies as direct connections.
- Record
EUVD-2026-51854- CVSS 4.0
- 6.9 Medium
CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:L/VI:N/VA:N/SC:N/SI:N/SA:N - Updated
- 2026-11-02
GitHub AdvisoriesGHSA-32rq-jhr7-m3hh
6.9
Duplicate Advisory: Guzzle: Proxy-Authorization headers can be sent to origin servers
Duplicate Advisory
This advisory has been withdrawn because it is a duplicate of GHSA-94pj-82f3-465w. This link is maintained to preserve external references.
Original Description
guzzlehttp/guzzle versions before 7.14.2 fail to properly isolate Proxy-Authorization headers from origin servers in cURL handlers. Attackers can capture proxy credentials through origin server access logs when requests are redirected, bypassed, or sent through SOCKS proxies that Guzzle misclassifies as direct connections.
- Record
GHSA-32rq-jhr7-m3hh- CVSS 4.0
- 6.9 Medium
CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:L/VI:N/VA:N/SC:N/SI:N/SA:N/E:X/CR:X/IR:X/AR:X/MAV:X/MAC:X/MAT:X/MPR:X/MUI:X/MVC:X/MVI:X/MVA:X/MSC:X/MSI:X/MSA:X/S:X/AU:X/R:X/V:X/RE:X/U:X - CVSS 3.1
- 5.3 Medium
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:L/I:N/A:N - Weakness
- CWE-200
- Updated
- 2026-11-02
GitHub AdvisoriesGHSA-94pj-82f3-465w
5.3
Guzzle: Proxy-Authorization headers can be sent to origin servers
Impact
In affected versions, the built-in cURL handlers (CurlHandler and CurlMultiHandler) 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 move Proxy-Authorization to 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 client headers defaults, the headers request option, or middleware. It does not include a literal line supplied through raw CURLOPT_HTTPHEADER, CURLOPT_PROXYHEADER, or stream_context.http.header controls.
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:
- direct, including
proxyset to''to disable proxying. - bypassed by a
no,no_proxy, orNO_PROXYmatch. - sent through a SOCKS proxy, which does not use the HTTP proxy header channel.
- redirected from a safely proxied hop into any of those routes: redirect middleware re-evaluates the proxy per hop but, unlike
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, and CURLHEADER_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 first Proxy-Authorization line from CONNECT, so another first-class value or a URL-userinfo Basic line could reach the tunneled origin. A later raw stream_context.http.proxy override 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-Authorization as 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 default Proxy-Authorization header, then follows the attacker's redirect to an HTTPS or no-proxy destination that Guzzle reaches directly.
Using a first-class Proxy-Authorization header 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 raw stream_context.http.proxy override. CURLOPT_PROXYUSERPWD is unaffected. Literal lines supplied through raw CURLOPT_HTTPHEADER, CURLOPT_PROXYHEADER, or stream_context.http.header remain caller-controlled and outside the first-class-header guarantee.
Patches
The issue is fixed in 7.14.2. The cURL handlers keep first-class Proxy-Authorization values out of the origin header list. When proxy header separation is available, they pass the values through CURLOPT_PROXYHEADER with CURLHEADER_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…
- Record
GHSA-94pj-82f3-465w- CVSS 3.1
- 5.3 Medium
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:L/I:N/A:N - Weakness
- CWE-200, CWE-201, CWE-522
- Updated
- 2026-11-02
NVD
6.9
guzzlehttp/guzzle versions before 7.14.2 fail to properly isolate Proxy-Authorization headers from origin servers in cURL handlers. Attackers can capture proxy credentials through origin server access logs when requests are redirected, bypassed, or sent through SOCKS proxies that Guzzle misclassifies as direct connections.
- Record
CVE-2026-67339- CVSS 4.0
- 6.9 Medium
CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:L/VI:N/VA:N/SC:N/SI:N/SA:N/E:X/CR:X/IR:X/AR:X/MAV:X/MAC:X/MAT:X/MPR:X/MUI:X/MVC:X/MVI:X/MVA:X/MSC:X/MSI:X/MSA:X/S:X/AU:X/R:X/V:X/RE:X/U:X - CVSS 3.1
- 5.3 Medium
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:L/I:N/A:N - Weakness
- CWE-200
- Updated
- 2026-11-02
OSV
6.9
guzzlehttp/guzzle before 7.14.2 Proxy-Authorization Header Disclosure
guzzlehttp/guzzle versions before 7.14.2 fail to properly isolate Proxy-Authorization headers from origin servers in cURL handlers. Attackers can capture proxy credentials through origin server access logs when requests are redirected, bypassed, or sent through SOCKS proxies that Guzzle misclassifies as direct connections.
- Record
CVE-2026-67339- CVSS 4.0
- 6.9 Medium
CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:L/VI:N/VA:N/SC:N/SI:N/SA:N - Weakness
- CWE-200
- Updated
- 2026-11-02
Show 9 moreShow less
OSVDEBIAN-CVE-2026-67339
6.9
guzzlehttp/guzzle versions before 7.14.2 fail to properly isolate Proxy-Authorization headers from origin servers in cURL handlers. Attackers can capture proxy credentials through origin server access logs when requests are redirected, bypassed, or sent through SOCKS proxies that Guzzle misclassifies as direct connections.
- Record
DEBIAN-CVE-2026-67339- CVSS 4.0
- 6.9 Medium
CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:L/VI:N/VA:N/SC:N/SI:N/SA:N/E:X/CR:X/IR:X/AR:X/MAV:X/MAC:X/MAT:X/MPR:X/MUI:X/MVC:X/MVI:X/MVA:X/MSC:X/MSI:X/MSA:X/S:X/AU:X/R:X/V:X/RE:X/U:X - Updated
- 2026-11-02
OSVGHSA-32rq-jhr7-m3hh
6.9
Duplicate Advisory: Guzzle: Proxy-Authorization headers can be sent to origin servers
Duplicate Advisory
This advisory has been withdrawn because it is a duplicate of GHSA-94pj-82f3-465w. This link is maintained to preserve external references.
Original Description
guzzlehttp/guzzle versions before 7.14.2 fail to properly isolate Proxy-Authorization headers from origin servers in cURL handlers. Attackers can capture proxy credentials through origin server access logs when requests are redirected, bypassed, or sent through SOCKS proxies that Guzzle misclassifies as direct connections.
- Record
GHSA-32rq-jhr7-m3hh- CVSS 4.0
- 6.9 Medium
CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:L/VI:N/VA:N/SC:N/SI:N/SA:N/E:X/CR:X/IR:X/AR:X/MAV:X/MAC:X/MAT:X/MPR:X/MUI:X/MVC:X/MVI:X/MVA:X/MSC:X/MSI:X/MSA:X/S:X/AU:X/R:X/V:X/RE:X/U:X - CVSS 3.1
- 5.3 Medium
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:L/I:N/A:N - Weakness
- CWE-200
- Updated
- 2026-11-02
OSVGHSA-94pj-82f3-465w
5.3
Guzzle: Proxy-Authorization headers can be sent to origin servers
Impact
In affected versions, the built-in cURL handlers (CurlHandler and CurlMultiHandler) 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 move Proxy-Authorization to 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 client headers defaults, the headers request option, or middleware. It does not include a literal line supplied through raw CURLOPT_HTTPHEADER, CURLOPT_PROXYHEADER, or stream_context.http.header controls.
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:
- direct, including
proxyset to''to disable proxying. - bypassed by a
no,no_proxy, orNO_PROXYmatch. - sent through a SOCKS proxy, which does not use the HTTP proxy header channel.
- redirected from a safely proxied hop into any of those routes: redirect middleware re-evaluates the proxy per hop but, unlike
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, and CURLHEADER_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 first Proxy-Authorization line from CONNECT, so another first-class value or a URL-userinfo Basic line could reach the tunneled origin. A later raw stream_context.http.proxy override 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-Authorization as 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 default Proxy-Authorization header, then follows the attacker's redirect to an HTTPS or no-proxy destination that Guzzle reaches directly.
Using a first-class Proxy-Authorization header 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 raw stream_context.http.proxy override. CURLOPT_PROXYUSERPWD is unaffected. Literal lines supplied through raw CURLOPT_HTTPHEADER, CURLOPT_PROXYHEADER, or stream_context.http.header remain caller-controlled and outside the first-class-header guarantee.
Patches
The issue is fixed in 7.14.2. The cURL handlers keep first-class Proxy-Authorization values out of the origin header list. When proxy header separation is available, they pass the values through CURLOPT_PROXYHEADER with CURLHEADER_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…
- Record
GHSA-94pj-82f3-465w- CVSS 3.1
- 5.3 Medium
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:L/I:N/A:N - Weakness
- CWE-200, CWE-201, CWE-522
- Updated
- 2026-11-02
OSVUBUNTU-CVE-2026-67339
6.9
guzzlehttp/guzzle versions before 7.14.2 fail to properly isolate Proxy-Authorization headers from origin servers in cURL handlers. Attackers can capture proxy credentials through origin server access logs when requests are redirected, bypassed, or sent through SOCKS proxies that Guzzle misclassifies as direct connections.
- Record
UBUNTU-CVE-2026-67339- CVSS 4.0
- 6.9 Medium
CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:L/VI:N/VA:N/SC:N/SI:N/SA:N - CVSS 3.1
- 5.3 Medium
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:L/I:N/A:N - Updated
- 2026-11-02
OSVCLSA-2026-1784856237 No score
TuxCare security update for guzzlehttp/guzzle (9 CVEs)
TuxCare rebuilt guzzlehttp/guzzle to address 9 CVEs. Fixed in 7.10.0-p2+tuxcare.
- Record
CLSA-2026-1784856237- Updated
- 2026-11-02
OSVCLSA-2026-1785380882 No score
TuxCare security update for guzzlehttp/guzzle (8 CVEs)
TuxCare rebuilt guzzlehttp/guzzle to address 8 CVEs. Fixed in 6.5.8-p2+tuxcare.
- Record
CLSA-2026-1785380882- Updated
- 2026-11-02
OSVCLSA-2026-1786439704 No score
TuxCare security update for guzzlehttp/guzzle (6 CVEs)
TuxCare rebuilt guzzlehttp/guzzle to address 6 CVEs. Fixed in 6.3.3-p2+tuxcare.
- Record
CLSA-2026-1786439704- Updated
- 2026-11-02
OSVCLSA-2026-1788269522 No score
TuxCare security update for guzzlehttp/guzzle (7 CVEs)
TuxCare rebuilt guzzlehttp/guzzle to address 7 CVEs. Fixed in 6.3.3-p3+tuxcare.
- Record
CLSA-2026-1788269522- Updated
- 2026-11-02
OSVCLSA-2026-1788433786 No score
TuxCare security update for guzzlehttp/guzzle (11 CVEs)
TuxCare rebuilt guzzlehttp/guzzle to address 11 CVEs. Fixed in 6.0.2-p5+tuxcare.
- Record
CLSA-2026-1788433786- Updated
- 2026-11-02
Affected products
Affected packages
| Package | Affected | Fixed |
|---|---|---|
guzzlehttp/guzzlePackagist |
before 7.14.2 | 7.14.2 |
guzzlehttp/guzzleTuxCare:Packagist From an advisory covering 5 CVEs |
7.10.0 up to 7.10.0-p2+tuxcare, plus listed versions 7.10.0-p1+tuxcare |
7.10.0-p2+tuxcare |
guzzlehttp/guzzleTuxCare:Packagist From an advisory covering 5 CVEs |
6.5.8 up to 6.5.8-p2+tuxcare, plus listed versions 6.5.8-p1+tuxcare |
6.5.8-p2+tuxcare |
guzzlehttp/guzzleTuxCare:Packagist From an advisory covering 3 CVEs |
6.3.3 up to 6.3.3-p2+tuxcare, plus listed versions 6.3.3-p1+tuxcare |
6.3.3-p2+tuxcare |
guzzlehttp/guzzleTuxCare:Packagist From an advisory covering 6 CVEs |
6.3.3 up to 6.3.3-p3+tuxcare, plus listed versions 6.3.3-p1+tuxcare6.3.3-p2+tuxcare |
6.3.3-p3+tuxcare |
guzzlehttp/guzzleTuxCare:Packagist From an advisory covering 7 CVEs |
6.0.2 up to 6.0.2-p5+tuxcare, plus listed versions 6.0.2-p1+tuxcare6.0.2-p2+tuxcare6.0.2-p3+tuxcare6.0.2-p4+tuxcare |
6.0.2-p5+tuxcare |
guzzleDebian:12 |
All versions, plus listed versions 7.11.0-17.12.0-17.12.1-17.12.3-17.13.1-1 Show 14 moreShow less7.14.0-17.14.1-17.14.2-17.15.0-17.15.1-17.15.2-17.15.3-17.15.5-17.4.5-17.9.2-0.18.0.1-18.0.2-18.1.0-18.2.0-1 |
None known |
guzzleDebian:13 |
All versions, plus listed versions 7.11.0-17.12.0-17.12.1-17.12.3-17.13.1-1 Show 13 moreShow less7.14.0-17.14.1-17.14.2-17.15.0-17.15.1-17.15.2-17.15.3-17.15.5-17.9.2-0.18.0.1-18.0.2-18.1.0-18.2.0-1 |
None known |
guzzleDebian:14 |
before 7.14.2-1, plus listed versions 7.11.0-17.12.0-17.12.1-17.12.3-17.13.1-17.14.0-17.14.1-17.9.2-0.1 |
7.14.2-1 |
guzzlehttp/guzzlePackagist |
before 7.14.2, plus listed versions 4.0.04.0.0-rc.14.0.0-rc.24.0.14.0.2 Show 45 moreShow less4.1.04.1.14.1.24.1.34.1.44.1.54.1.64.1.74.1.84.2.04.2.14.2.24.2.34.2.45.0.05.0.15.0.25.0.35.1.05.2.05.3.05.3.15.3.25.3.35.3.46.0.06.0.16.0.26.1.06.1.16.2.06.2.16.2.26.2.36.3.06.3.16.3.26.3.36.4.06.4.16.5.06.5.16.5.26.5.36.5.4 |
7.14.2 |
guzzleUbuntu:24.04:LTS |
All versions, plus listed versions 7.4.5-1 |
None known |
guzzleUbuntu:26.10 |
All versions, plus listed versions 7.9.2-0.1build17.13.1-17.15.1-17.15.2-17.15.3-1 |
None known |
guzzleUbuntu:26.04:LTS |
All versions, plus listed versions 7.9.2-0.17.9.2-0.1build1 |
None known |
History
| Recorded | Changed | Sources |
|---|---|---|
| affected, facts | ||
| affected | ||
| first indexed | CVE List, EUVD, GitHub Advisories, NVD, OSV |
Dates are when Every CVE recorded each change. Upstream dates may differ.
In short
CVE-2026-67339 is a medium vulnerability (CVSS 6.9) in Guzzle, published July 20, 2026. No source lists public exploit code. EPSS puts the chance of exploitation in the next 30 days at 0.37%, the 31st percentile. Fixed in guzzlehttp/guzzle 7.14.2.
References
github.com/guzzle/guzzle/security/advisories/GHSA-94pj-82f3-465w
vulncheck.com/advisories/guzzlehttp-guzzle-before-proxy-authorization-header-disclosure
nvd.nist.gov/vuln/detail/CVE-2026-67339
github.com/advisories/GHSA-32rq-jhr7-m3hh
github.com/guzzle/guzzle/pull/3876
github.com/guzzle/guzzle/commit/9e4580d4b9981e903dc6323fe37f50a96e85b05e
Show 7 moreShow less
github.com/guzzle/guzzle/releases/tag/7.14.2
github.com/advisories/GHSA-94pj-82f3-465w
github.com/CVEProject/cvelistV5/tree/main/cves/2026/67xxx/CVE-2026-67339.json
security-tracker.debian.org/tracker/CVE-2026-67339
github.com/guzzle/guzzle
ubuntu.com/security/CVE-2026-67339
cve.org/CVERecord?id=CVE-2026-67339
Left out here: 122 versions and the rest of 2 source descriptions. The JSON record has them.