CVEReports
CVEReports

Automated vulnerability intelligence platform. Comprehensive reports for high-severity CVEs generated by AI.

Product

  • Home
  • Sitemap
  • RSS Feed

Company

  • About
  • Contact
  • Privacy Policy
  • Terms of Service

© 2026 CVEReports. All rights reserved.

Made with love by Amit Schendel & Alon Barad



GHSA-WM3W-8RRP-J577

GHSA-WM3W-8RRP-J577: Host-Only Cookie Scope Exposure in Guzzle Cookie Jar

Alon Barad
Alon Barad
Software Engineer

Jul 21, 2026·6 min read·34 visits

Executive Summary (TL;DR)

Guzzle failed to track whether cookies were originally set without a Domain attribute, causing host-only cookies to be incorrectly forwarded to subdomains and potentially exposing sensitive sessions.

An information disclosure vulnerability in guzzlehttp/guzzle allows host-only cookies to be incorrectly matched and sent to subdomains. Because Guzzle failed to track whether cookies were defined without a Domain attribute, it evaluated host-only cookies using standard domain-suffix rules, widening their scope and exposing sensitive session tokens to untrusted subdomains.

Vulnerability Overview and Context

The PHP HTTP client library guzzlehttp/guzzle provides a comprehensive framework for handling synchronous and asynchronous HTTP requests. A core capability of this library is persistent state management, facilitated by various implementations of the CookieJarInterface. Under default operations, a Cookie Jar intercepts standard response headers, parses cookie definitions, and dynamically injects them into outbound requests targeting matching hosts.

This automatic state management introduces a significant security boundary. The client must strictly isolate cookies based on domain boundaries specified by RFC 6265. When a client library fails to respect these boundaries, it exposes an attack surface where highly sensitive cookies, such as active session identifiers, can be inadvertently transmitted to unauthorized endpoints.

This vulnerability represents a classic class of incorrect privilege assignment and cookie scope widening. By failing to track the structural difference between host-only cookies and domain-scoped cookies, the library systematically bypassed origin separation boundaries designed to restrict cookie visibility.

Root Cause Analysis: RFC 6265 Host-Only Cookie Semantics

According to RFC 6265 Section 4.1.2.3, the absence of an explicit Domain attribute in a Set-Cookie header obligates the user agent to treat the cookie as a host-only cookie. A host-only cookie must only be returned to the exact host that originally set it, preventing propagation to any related subdomains. Conversely, if a cookie explicitly defines a domain, it is a domain cookie and is sent to both the target host and all subdomains.

In legacy versions of Guzzle, the extraction logic within CookieJar::extractCookies parsed the cookie and, if the domain was empty, simply backfilled it using the current request's hostname. This backfilling operation permanently erased the structural distinction between an explicitly scoped domain cookie and a host-only cookie. Guzzle did not maintain any state flag indicating that this cookie was originally host-only.

Because Guzzle did not retain the historical state of whether the Domain attribute was originally present, subsequent matching operations executed standard domain suffix matching. This resulted in the cookie being matched against any child subdomains, causing cookie scope widening and leading to information leakage when communicating with non-origin hosts.

Code-Level Analysis of the Vulnerability and Patch

To understand the technical mechanics, examine the vulnerable implementation in Guzzle's extraction flow before the patch:

// Legacy logic inside extractCookies()
$sc = SetCookie::fromString($cookie);
$domain = $sc->getDomain();
if ($domain === null || $domain === '') {
    // The domain is assigned the request host, but no flag is set to record its host-only nature
    $sc->setDomain($request->getUri()->getHost());
}

The vulnerability was resolved in commit 7b68220d6543f6f80fe62e633361fc9d4ead14d4. The patch introduces a private boolean $hostOnly state tracker inside the SetCookie class, alongside updated matching rules:

// Patched logic in src/Cookie/SetCookie.php
public function matchesDomain(string $domain): bool
{
    $cookieDomain = $this->getDomain();
    if (null === $cookieDomain) {
        return !$this->getHostOnly();
    }
 
    if ($this->getHostOnly()) {
        // Strict, case-insensitive match for Host-Only cookies
        return Psr7\Utils::asciiToLower($domain) === Psr7\Utils::asciiToLower($cookieDomain);
    }
 
    // Suffix matching logic continues for standard domain cookies
}

Additionally, the extraction logic in CookieJar.php was hardened to explicitly flag host-only cookies during parsing:

// Patched logic in src/Cookie/CookieJar.php
$sc = SetCookie::fromString($cookie);
$domain = $sc->getDomain();
if ($domain === null || $domain === '') {
    $sc->setDomain($request->getUri()->getHost());
    $sc->setHostOnly(true);
} else {
    $sc->setHostOnly(false);
}

To prevent state loss between HTTP client cycles, both JSON-based persistent jars (FileCookieJar and SessionCookieJar) were updated to serialize and deserialize the HostOnly flag. Loading an existing cookie database file or session that lacks this marker now throws a RuntimeException to avoid silent regressions.

Exploitation and Attack Scenarios

An exploitation scenario begins with a client application using a vulnerable version of Guzzle. The application communicates with a secure parent site https://example.com which issues a host-only authentication cookie: Set-Cookie: auth=token123; Secure; HttpOnly. The Guzzle client stores this cookie inside its persistent cookie jar.

If an attacker compromises or establishes control over a subdomain (e.g., https://attacker-controlled.example.com), they can exploit Guzzle's scope widening. When the Guzzle client subsequently sends an HTTP request to the attacker-controlled subdomain, Guzzle automatically appends the host-only cookie to the headers because it evaluates example.com as matching the subdomain under legacy rules.

The target interaction and flow can be structured as follows:

Upon receiving the request, the attacker extracts the auth token from the headers, enabling complete session hijacking of the Guzzle client's session on the parent site. This scenario is highly viable in shared hosting environments or platforms that host user-generated content on subdomains.

Remaining Attack Surface and Edge Cases

A key technical limitation of the fix involves the lack of Public Suffix List (PSL) validation. As noted in Guzzle's patched codebase, Guzzle does not natively validate domains against a Public Suffix List because it avoids pulling in a large external dependency. Consequently, if an attacker operates a service on a public suffix subdomain (such as attacker.github.io), they can set a domain-scoped cookie for github.io which Guzzle will accept and forward to other subdomains under the same suffix.

Additionally, developers must manage the risk of the downgrade migration bypass. When Guzzle's updated persistent cookie jars encounter legacy files lacking the HostOnly key, they immediately throw a RuntimeException. If developers write legacy conversion scripts that blindly set the HostOnly field to false to suppress these errors, they will force-disable host-only protection for those cookies, exposing them to scope widening.

Security teams must also audit custom implementations of CookieJarInterface that may have replicated Guzzle's original flawed logic without adopting the new $hostOnly tracking architecture. Custom engines must be updated to explicitly respect host-only boundaries.

Detection and Remediation Strategy

Remediation requires upgrading the Guzzle package to version 7.15.1 or higher. This update introduces the necessary schema definitions and code-level checks to strictly enforce host-only rules. System administrators should verify the installed package version using Composer commands.

Because the patch updates persistent cookie store schemas, developers must handle the transition period carefully. Loading existing cookie files using FileCookieJar or SessionCookieJar will trigger a RuntimeException if they do not contain the newly introduced HostOnly serialization key. To prevent application downtime, security administrators should clear or regenerate existing persistent cookie storage files during the deployment of the patched version.

For temporary workarounds where immediate updates are impossible, developers should avoid making requests to parent domains and subdomains using the same shared Guzzle Cookie Jar instance. Separating Cookie Jars per host boundary prevents cross-origin data exposure.

Official Patches

GuzzleSecurity patch commit implementing Host-Only tracking and domain-matching validation

Fix Analysis (1)

Technical Appendix

CVSS Score
7.5/ 10
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:N/A:N

Affected Systems

guzzlehttp/guzzle

Affected Versions Detail

Product
Affected Versions
Fixed Version
guzzlehttp/guzzle
Guzzle
< 7.15.17.15.1
AttributeDetail
Vulnerability TypeCWE-200: Exposure of Sensitive Information to an Unauthorized Actor
Attack VectorNetwork
CVSS Score7.5
Exploit StatusProof of Concept (PoC) documented
Affected ComponentsGuzzleHttp\Cookie\CookieJar
CISA KEV StatusNot Listed

MITRE ATT&CK Mapping

T1539Steal Web Session Cookie
Credential Access
CWE-200
Exposure of Sensitive Information to an Unauthorized Actor

The product exposes sensitive information to an actor that is not explicitly authorized to have access to that information.

Vulnerability Timeline

Guzzle releases version 7.15.0
2026-07-17
Security fixes implemented in commit 7b68220d6543f6f80fe62e633361fc9d4ead14d4
2026-07-18
Release of version 7.15.1 addressing GHSA-WM3W-8RRP-J577
2026-07-18

References & Sources

  • [1]GitHub Security Advisory GHSA-WM3W-8RRP-J577
  • [2]Guzzle Security Patch Commit
  • [3]Guzzle Security Pull Request
  • [4]Guzzle Official v7.15.1 Release Changelog

Attack Flow Diagram

Press enter or space to select a node. You can then use the arrow keys to move the node around. Press delete to remove it and escape to cancel.
Press enter or space to select an edge. You can then press delete to remove it or escape to cancel.

More Reports

•1 day ago•CVE-2026-11748
6.9

CVE-2026-11748: Unauthenticated LDAP Injection in Central Dogma Server Authentication

An LDAP injection vulnerability exists in the centraldogma-server-auth-shiro module of LY Corporation Central Dogma before version 0.84.0. The search logic dynamically constructs LDAP search filters by interpolating user-provided usernames without escaping RFC 4515 metacharacters. Unauthenticated remote attackers can leverage this flaw to bypass authentication, enumerate directory hierarchies, and access unauthorized resources.

Alon Barad
Alon Barad
9 views•6 min read
•1 day ago•CVE-2026-11746
9.4

CVE-2026-11746: Use of Hard-coded ZooKeeper Replication Secret 'ch4n63m3' in Central Dogma Server

CVE-2026-11746 is a critical vulnerability in Central Dogma Server prior to version 0.84.0, where an embedded ZooKeeper replication secret silently falls back to a publicly known, hard-coded default string ('ch4n63m3'). Remote attackers with access to the replication network can authenticate as legitimate cluster peers, potentially leading to unauthorized data exposure, state manipulation, or complete cluster takeover.

Amit Schendel
Amit Schendel
7 views•6 min read
•1 day ago•CVE-2026-56665
4.2

CVE-2026-56665: Logical Validation Bypass in ZITADEL External JWT Identity Provider

A logical verification flaw in ZITADEL's external JWT Identity Provider validation allows attackers to bypass session expiration checks. If an incoming JWT lacks the 'exp' claim, the system skips validation entirely, creating an indefinitely valid session. This issue has been addressed in versions 3.4.12 and 4.15.2.

Alon Barad
Alon Barad
6 views•7 min read
•1 day ago•CVE-2026-59149
6.5

CVE-2026-59149: Sibling Directory Path Traversal in Mockoon Backend Server

CVE-2026-59149 identifies a directory traversal vulnerability in `@mockoon/commons-server`, the backend mock-server library powering the Mockoon application. The flaw occurs in the path containment validation logic used during raw file response generation. An unauthenticated attacker can exploit this weakness to retrieve arbitrary files from sibling directories sharing a common prefix with the designated static base directory.

Amit Schendel
Amit Schendel
9 views•5 min read
•1 day ago•CVE-2026-59148
8.8

CVE-2026-59148: Unauthenticated Administrative API and CORS Misconfiguration in Mockoon

An in-depth analysis of CVE-2026-59148, a high-severity flaw in Mockoon where unauthenticated administrative endpoints and a wildcard Cross-Origin Resource Sharing (CORS) policy allow remote execution, state poisoning, and credential theft.

Alon Barad
Alon Barad
11 views•6 min read
•1 day ago•CVE-2026-56666
4.8

CVE-2026-56666: Account Takeover via Improper Email Verification in ZITADEL Federated Identity Handler

An improper authentication vulnerability (CWE-287) in ZITADEL's external identity provider handler before version 4.15.3 allows remote attackers to perform complete account takeover. When auto-linking by email is enabled, ZITADEL verifies that the local target account has a verified email address but fails to verify if the external provider confirmed ownership of that same email. Attackers can exploit this by registering an unverified account with a victim's email address on a permissive external provider, leading to unauthorized account binding and persistent access.

Amit Schendel
Amit Schendel
7 views•7 min read