{"description":"Trending threats, MITRE ATT\u0026CK coverage, and detection metadata. Fed continuously.","feed_url":"https://feed.craftedsignal.io/products/guzzle-7.x/feed.json","home_page_url":"https://feed.craftedsignal.io/","items":[{"_cs_actors":[],"_cs_cpes":[],"_cs_cves":[{"cvss":7.2,"id":"CVE-2026-69246"}],"_cs_exploited":true,"_cs_has_poc":false,"_cs_poc_references":[],"_cs_products":["Guzzle (7.x)","Guzzle (8.0.0)"],"_cs_severities":["high"],"_cs_tags":["ssrf","php","vulnerability","web-security"],"_cs_type":"threat","_cs_vendors":["Guzzle"],"content_html":"\u003cp\u003eGuzzle, 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.\u003c/p\u003e\n\u003cp\u003eThis issue is particularly dangerous when applications rely on \u003ccode\u003efilter_var()\u003c/code\u003e or similar mechanisms to validate hostnames, as these can be bypassed using non-canonical encodings like \u003ccode\u003e127.0.0.%31\u003c/code\u003e. 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.\u003c/p\u003e\n\u003ch2 id=\"attack-chain\"\u003eAttack Chain\u003c/h2\u003e\n\u003col\u003e\n\u003cli\u003eThe attacker identifies an application feature that accepts user-provided URIs for fetching remote content.\u003c/li\u003e\n\u003cli\u003eThe application parses the input URI and performs a security check (e.g., denying private IP ranges or internal hostnames).\u003c/li\u003e\n\u003cli\u003eThe attacker provides a non-canonical URI (e.g., \u003ccode\u003ehttp://127.0.0.%31/\u003c/code\u003e or \u003ccode\u003eblocked.example.com@127.0.0.1\u003c/code\u003e) that passes the application's check but is misinterpreted by the Guzzle transport.\u003c/li\u003e\n\u003cli\u003eThe application passes the URI to Guzzle, which transmits it to the \u003ccode\u003ecURL\u003c/code\u003e or \u003ccode\u003eStreamHandler\u003c/code\u003e.\u003c/li\u003e\n\u003cli\u003eThe transport layer performs its own parsing, percent-decoding, or IDN resolution on the provided hostname.\u003c/li\u003e\n\u003cli\u003eThe transport layer initiates a connection to the resolved, internal target, bypassing the initial application-level validation.\u003c/li\u003e\n\u003cli\u003eThe application receives and potentially exposes the response content from the internal service, completing an SSRF attack.\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch2 id=\"impact\"\u003eImpact\u003c/h2\u003e\n\u003cp\u003eSuccessful 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.\u003c/p\u003e\n\u003ch2 id=\"recommendation\"\u003eRecommendation\u003c/h2\u003e\n\u003col\u003e\n\u003cli\u003eUpgrade to Guzzle \u003ccode\u003e7.15.2\u003c/code\u003e or \u003ccode\u003e8.0.1\u003c/code\u003e immediately to receive the built-in host validation patches.\u003c/li\u003e\n\u003cli\u003eIf 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.\u003c/li\u003e\n\u003cli\u003eTreat user-supplied URIs as untrusted; perform resolution and address-based checks rather than relying on hostname string comparisons.\u003c/li\u003e\n\u003cli\u003eUse dedicated, restricted network namespaces or firewalls to limit the reach of outgoing requests from the application environment.\u003c/li\u003e\n\u003c/ol\u003e\n","date_modified":"2026-08-03T23:42:00Z","date_published":"2026-08-03T23:42:00Z","id":"https://feed.craftedsignal.io/briefs/2026-08-guzzle-host-bypass/","summary":"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.","title":"Guzzle Hostname Validation Bypass via Transport Discrepancy","url":"https://feed.craftedsignal.io/briefs/2026-08-guzzle-host-bypass/"}],"language":"en","title":"CraftedSignal Threat Feed - Guzzle (7.x)","version":"https://jsonfeed.org/version/1.1"}