If you told Guzzle to use an https:// proxy, very old libcurl versions could quietly talk to that proxy in plain text instead. Anyone on the network between you and the proxy could then read your proxy username and password. They could also see which hosts you connect to, and the full contents of plain HTTP requests.

HTTPS requests tunneled through the proxy keep their own encryption, so their contents stay protected.

Who is affected

Apps on guzzlehttp/guzzle before 7.12.1 that use the default cURL handlers (CurlHandler or CurlMultiHandler) with an https:// proxy, and run on libcurl older than 7.50.2. The proxy can come from the proxy option or from variables like https_proxy and HTTPS_PROXY. The Guzzle advisory says apps without an https:// proxy, and servers with newer libcurl, don't get the silent downgrade. Guzzle's stream handler isn't affected.

You can check your libcurl version with curl_version() in PHP.

What to do

Update to 7.12.1 or later. Guzzle now refuses an https:// proxy that libcurl can't support, before sending anything. Until you can update, don't use an https:// proxy on a server with old libcurl, or upgrade libcurl to 7.52.0 or newer with HTTPS proxy support.

Reported by GrahamCampbell.