Attack ChainAIDerived
Hypothetical attack flow derived from CVE metadata – not a confirmed exploit chain
-
AccessIdentify target running Guzzle with https:// proxy
-
DeliveryConfirm libcurl < 7.50.2 on target host
-
ExploitGain network position between app and proxy
-
ExecutionObserve cleartext proxy TCP connection
-
PersistCapture Proxy-Authorization credentials and CONNECT tunnel metadata
-
ImpactLeverage credentials for proxy abuse or lateral movement
Vulnerability Assessment
| Weakness |
CWE
OWASP Top 10:2025
A06:2025 - Insecure Design
ASVS 5.0
V14 - Data Protection Encryption of sensitive data
|
| Exploitation Conditions | Three conditions must all be true simultaneously. First, the application must invoke Guzzle's built-in CurlHandler or CurlMultiHandler (the default whenever the PHP cURL extension is loaded - not the stream handler). Second, an https:// proxy must be configured, whether through the Guzzle proxy request option, a client-level proxy default, or any of the environment variables http_proxy, https_proxy, HTTPS_PROXY, all_proxy, or ALL_PROXY. Third, the system libcurl must be version 7.50.2 or older (libcurl 7.50.2 was released August 2016). Applications that do not configure an https:// proxy are entirely unaffected regardless of libcurl version. Deployments on libcurl 7.50.2 through 7.51.x or libcurl 7.52.0 without HTTPS-proxy compile-time support fail at connect rather than silently downgrading, which limits but does not eliminate exposure under the older Guzzle versions. Low-level CURLOPT_PROXY or CURLOPT_PROXYTYPE settings bypass Guzzle's first-class proxy handling and remain the caller's responsibility. |
| Impact | The vendor-supplied CVSS 3.1 vector (AV:N/AC:H/PR:N/UI:N/S:U/C:H/I:N/A:N, score 5.9) accurately characterises the risk: the attack is network-reachable (AV:N) but carries High Complexity (AC:H) because exploitation depends on three concurrent conditions - the application must use Guzzle's cURL handlers with an https:// proxy configured, the system libcurl must pre-date 7.50.2 (released August 2016), and an attacker must hold a network position between the application server and the proxy. Confidentiality impact is High because proxy credentials and tunnel metadata are fully exposed in cleartext. There is no integrity or availability impact. No EPSS score is available in the provided data, and the absence of KEV listing and public POC code limits urgency for most deployments. In practice, libcurl < 7.50.2 is approximately a decade old; modern Linux distributions ship libcurl 7.68 or newer. The realistic risk is concentrated in containerised or embedded environments that pin very old libcurl builds, or deployments running long-unmaintained base images. |
| Exploit ScenarioDerived | An attacker with a man-in-the-middle position on the network segment between an application server and its configured HTTPS proxy - for example, within the same data-centre VLAN or via ARP poisoning - intercepts the cleartext TCP connection that Guzzle's CurlHandler silently establishes instead of TLS. The attacker reads the Proxy-Authorization header containing proxy credentials in plaintext and, for tunneled HTTPS requests, observes the CONNECT target hostname and port. No public POC exists for this scenario, but the attack is conceptually straightforward for any network-adjacent adversary. |
Get an e-mail when this CVE is exploited, patched or re-scored. Free account.
Alert meAnalysisAIv1 – Jun 19, 2026
Silent TLS downgrade in Guzzle's built-in cURL handlers exposes proxy credentials and tunneled connection metadata to network interception when the application is configured to use an https:// proxy but runs against libcurl older than 7.50.2. Affected deployments see proxy authentication headers (Proxy-Authorization, CURLOPT_PROXYUSERPWD), CONNECT target host/port for tunneled HTTPS, and full request headers and bodies for plain HTTP requests transmitted without encryption - with no runtime error or warning from Guzzle or libcurl. No public exploit identified at time of analysis and no CISA KEV listing; however, the CVSS confidentiality impact is rated High (C:H) due to full credential exposure on the proxy leg.
RemediationAI
The primary fix is upgrading to guzzlehttp/guzzle 7.12.1 or later via Composer (composer require guzzlehttp/guzzle:^7.12.1). Starting in that release, the cURL handlers detect libcurl capability at request time by checking both the version (>= 7.52.0) and the CURL_VERSION_HTTPS_PROXY feature bit; if the proxy cannot be used securely, a GuzzleHttp\Exception\RequestException is thrown before any bytes reach the network. For teams that cannot upgrade immediately, the vendor-documented workaround is to add an explicit capability check before configuring an https:// proxy - verifying that libcurl version_compare >= '7.52.0' AND that the CURL_VERSION_HTTPS_PROXY bit is set in curl_version()['features'] - and throw an application-level exception if the check fails. Additionally, auditing and removing https:// proxy configuration from deployments where libcurl is confirmed below 7.50.2 eliminates exposure entirely. Upgrading the system libcurl to 7.52.0 or newer built with HTTPS-proxy support also resolves the underlying downgrade behaviour independently of the Guzzle version. Advisory reference: https://github.com/guzzle/guzzle/security/advisories/GHSA-wpwq-4j6v-78m3.
Affected VersionsENISA
Affected Packages
Source: OSV (Open Source Vulnerabilities)
Affects your stack
Affects 2 packages in composer, euvd
Checking this CVE against your own stacks and servers is part of the Basic plan and up.
Technical ContextAI · show details
Guzzle (guzzlehttp/guzzle, pkg:composer/guzzlehttp_guzzle) is a widely-used PHP HTTP client that delegates actual transport to PHP's cURL extension, backed by the system libcurl shared library. HTTPS-proxy support - meaning a proxy connection itself protected by TLS - was added to libcurl in version 7.52.0 (December 2016) and is gated behind the CURL_VERSION_HTTPS_PROXY feature bit. Versions older than 7.50.2 silently accept an https:// proxy URL but connect to it in plaintext; the library never establishes TLS to the proxy and issues no diagnostic. CWE-311 (Missing Encryption of Sensitive Data) captures the root cause: Guzzle's CurlHandler and CurlMultiHandler previously passed the proxy URL to libcurl without first checking whether the installed build actually supports the encrypted proxy scheme, leaving the enforcement gap entirely undetected by the application.
Know when PHP gets its next vulnerability
- Watch products and get an email when something new is published
- Check this CVE against your own stack and servers
- Exploit and PoC references, threat intelligence from 22 sources
No credit card · 7-day full trial
Severity by source
AV:N/AC:H/PR:N/UI:N/S:U/C:H/I:N/A:N
Network-reachable attack path (AV:N) but AC:H because exploitation requires concurrent libcurl < 7.50.2, https:// proxy configuration, and attacker network position; proxy credentials fully exposed so C:H.
Primary rating from Vendor (https://github.com/guzzle/guzzle).
CVSS VectorVendor: https://github.com/guzzle/guzzle
DescriptionCVE.org
Impact
The built-in cURL handlers (GuzzleHttp\Handler\CurlHandler and GuzzleHttp\Handler\CurlMultiHandler, used by default whenever the PHP cURL extension is available) accept an https:// proxy - a proxy reached over a TLS-encrypted connection - through the proxy request option, client-level proxy defaults, or proxy environment variables such as http_proxy, https_proxy, HTTPS_PROXY, all_proxy, and ALL_PROXY.
When the installed libcurl does not support HTTPS proxies, behavior depends on the libcurl version/build:
- libcurl older than 7.50.2 silently treats an
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. - libcurl 7.50.2 through 7.51.x rejects the unsupported proxy scheme at connect time, so no cleartext exposure occurs, but the failure is late and opaque.
- libcurl 7.52.0 or newer builds without HTTPS-proxy support also fail at connect time rather than downgrading.
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-Authorization header, proxy userinfo in the proxy URL, or CURLOPT_PROXYUSERPWD) are sent without encryption, and the CONNECT target 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 the curl request option, such as CURLOPT_PROXY or CURLOPT_PROXYTYPE, are advanced custom configuration and remain the caller's responsibility.
Patches
The issue is patched in 7.12.1 and 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 the CURL_VERSION_HTTPS_PROXY feature bit - and reject a request configured through Guzzle's first-class proxy handling with an https:// proxy up front by throwing a GuzzleHttp\Exception\RequestException. No request bytes reach the network when the proxy cannot be used securely. Versions before 7.12.1 are 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 explicit proxy option:
$curl = \curl_version();
$httpsProxyBit = \defined('CURL_VERSION_HTTPS_PROXY') ? \CURL_VERSION_HTTPS_PROXY : (1 << 21);
if (\version_compare($curl['version'], '7.52.0', '<') || 0 === ($curl['features'] & $httpsProxyBit)) {
throw new \RuntimeException('Installed libcurl does not support HTTPS proxies.');
}Upgrading the system libcurl to 7.52.0 or newer built with HTTPS-proxy support also resolves the underlying unsupported-proxy behavior.
Threat Intelligence Overview
How this decision was reached
The engine reads each signal below and applies a fixed list of rules from top to bottom. The first rule that matches sets the recommended action – like a statement, every line is shown.
What every action level means
SSVC AssessmentENISA
Priority Score
Attack Technique
Information disclosure occurs when an application unintentionally exposes sensitive data that aids attackers in reconnaissance or directly compromises security.
In PHP versions 7.1.x below 7.1.33, 7.2.x below 7.2.24 and 7.3.x below 7.3.11 in certain configurations of FPM setup it
sapi/cgi/cgi_main.c in PHP before 5.3.12 and 5.4.x before 5.4.2, when configured as a CGI script (aka php-cgi), does not
(1) boardData102.php, (2) boardData103.php, (3) boardDataJP.php, (4) boardDataNA.php, and (5) boardDataWW.php in Netgear
The '/common/download_agent_installer.php' script in the Quest KACE System Management Appliance 8.0.318 is accessible by
ProjectSend versions prior to r1720 are affected by an improper authentication vulnerability. Rated critical severity (C
Roundcube Webmail contains a critical PHP object deserialization vulnerability (CVE-2025-49113, CVSS 9.9) that allows au
Util/PHP/eval-stdin.php in PHPUnit before 4.8.28 and 5.x before 5.6.3 allows remote attackers to execute arbitrary PHP c
Palo Alto Networks PAN-OS management web interface contains an authentication bypass allowing unauthenticated attackers
Nagios XI version xi-5.7.5 is affected by OS command injection. Rated high severity (CVSS 8.8), this vulnerability is re
Nagios XI version xi-5.7.5 is affected by OS command injection. Rated high severity (CVSS 8.8), this vulnerability is re
The get_referers function in /opt/ws/bin/sblistpack in Sophos Web Appliance before 3.7.9.1 and 3.8 before 3.8.1.1 allows
The Backup Migration plugin for WordPress is vulnerable to Remote Code Execution in all versions up to, and including, 1
EUVD-2026-38456
GHSA-wpwq-4j6v-78m3
NVD
CVE.org
EPSS
Vulnrichment
Exploit-DB