<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Guzzle - CraftedSignal Threat Feed</title><link>https://feed.craftedsignal.io/vendors/guzzle/</link><description>Trending threats, MITRE ATT&amp;CK coverage, and detection metadata. Fed continuously.</description><generator>Hugo</generator><language>en</language><managingEditor>hello@craftedsignal.io</managingEditor><webMaster>hello@craftedsignal.io</webMaster><lastBuildDate>Mon, 03 Aug 2026 23:42:00 +0000</lastBuildDate><atom:link href="https://feed.craftedsignal.io/vendors/guzzle/feed.xml" rel="self" type="application/rss+xml"/><item><title>Guzzle Hostname Validation Bypass via Transport Discrepancy</title><link>https://feed.craftedsignal.io/briefs/2026-08-guzzle-host-bypass/</link><pubDate>Mon, 03 Aug 2026 23:42:00 +0000</pubDate><author>hello@craftedsignal.io</author><guid isPermaLink="true">https://feed.craftedsignal.io/briefs/2026-08-guzzle-host-bypass/</guid><description>Guzzle versions before 7.15.2 and 8.0.1 are vulnerable to a host-based security check bypass where transport handlers interpret non-canonical URI hostnames differently than application-level validation, potentially enabling SSRF.</description><content:encoded><![CDATA[<p>Guzzle, a popular PHP HTTP client, contains a vulnerability (CVE-2026-69246) that allows an attacker to bypass application-level host validation checks. The vulnerability stems from a divergence between how Guzzle processes request URIs and how its underlying transport handlers (cURL and stream wrappers) resolve those same URIs. When an application performs security checks on a hostname - such as denylisting private IP ranges or verifying domain allowlists - it may inspect the URI as a string. However, when the request is handed to the transport layer, libcurl or fopen may parse, percent-decode, or apply IDNA mapping to the host, resulting in a connection to a destination the application intended to block.</p>
<p>This issue is particularly dangerous when applications rely on <code>filter_var()</code> or similar mechanisms to validate hostnames, as these can be bypassed using non-canonical encodings like <code>127.0.0.%31</code>. The transport layer resolves this as the loopback address while the application incorrectly validates it as a different, non-local host. The vulnerability affects both the Guzzle 7.x and 8.x branches.</p>
<h2 id="attack-chain">Attack Chain</h2>
<ol>
<li>The attacker identifies an application feature that accepts user-provided URIs for fetching remote content.</li>
<li>The application parses the input URI and performs a security check (e.g., denying private IP ranges or internal hostnames).</li>
<li>The attacker provides a non-canonical URI (e.g., <code>http://127.0.0.%31/</code> or <code>blocked.example.com@127.0.0.1</code>) that passes the application's check but is misinterpreted by the Guzzle transport.</li>
<li>The application passes the URI to Guzzle, which transmits it to the <code>cURL</code> or <code>StreamHandler</code>.</li>
<li>The transport layer performs its own parsing, percent-decoding, or IDN resolution on the provided hostname.</li>
<li>The transport layer initiates a connection to the resolved, internal target, bypassing the initial application-level validation.</li>
<li>The application receives and potentially exposes the response content from the internal service, completing an SSRF attack.</li>
</ol>
<h2 id="impact">Impact</h2>
<p>Successful exploitation allows attackers to interact with internal services or private network infrastructure that should be inaccessible from the outside. This can lead to unauthorized access to internal APIs, administrative interfaces, or sensitive data. While the vulnerability does not directly provide remote code execution, it serves as a critical primitive for SSRF attacks. There is no evidence of widespread in-the-wild exploitation, but the ease of crafting non-canonical hostnames makes this a high-risk issue for services relying on Guzzle for third-party requests.</p>
<h2 id="recommendation">Recommendation</h2>
<ol>
<li>Upgrade to Guzzle <code>7.15.2</code> or <code>8.0.1</code> immediately to receive the built-in host validation patches.</li>
<li>If patching is not possible, implement the recommended validation logic from the advisory before passing any hostnames to Guzzle, specifically ensuring that host components are printable ASCII and do not contain percent escapes, delimiters, or trailing dots.</li>
<li>Treat user-supplied URIs as untrusted; perform resolution and address-based checks rather than relying on hostname string comparisons.</li>
<li>Use dedicated, restricted network namespaces or firewalls to limit the reach of outgoing requests from the application environment.</li>
</ol>
]]></content:encoded><category domain="severity">high</category><category domain="type">threat</category><category>ssrf</category><category>php</category><category>vulnerability</category><category>web-security</category></item></channel></rss>