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·21 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

•about 1 hour ago•GHSA-8RW6-P7M8-63JP
6.5

GHSA-8RW6-P7M8-63JP: Array Element-Level SELECT Permissions Leak in SurrealDB

SurrealDB versions supporting element-level SELECT permissions on arrays are vulnerable to a logical authorization bypass. Due to an index-shifting error during array filtration, restricted elements can skip permission checks and leak to unauthorized record users.

Alon Barad
Alon Barad
1 views•6 min read
•about 23 hours ago•CVE-2026-12243
7.5

CVE-2026-12243: Incomplete Path Traversal Validation and Percent-Encoding Bypass in NLTK

CVE-2026-12243 is a path traversal vulnerability in the Natural Language Toolkit (NLTK) version 3.9.4. The flaw exists because the input validation routine fails to account for percent-encoded directory traversal sequences like '..%2f' before passing them to urllib.request.url2pathname(), which decodes them into active traversal sequences.

Amit Schendel
Amit Schendel
5 views•8 min read
•about 24 hours ago•CVE-2026-73654
8.5

CVE-2026-73654: Prototype Pollution in Trigger.dev leading to Cascading Denial of Service

CVE-2026-73654 is a high-severity prototype pollution vulnerability in Trigger.dev. The flaw occurs during the handling of run-metadata updates through the PUT /api/v1/runs/:runId/metadata endpoint. Because user-supplied keys are parsed directly by the @jsonhero/path library without sanitization, an authenticated attacker with low privileges can pollute the global Object.prototype. This causes database queries via Prisma ORM to fail validation and induces unhandled exceptions in the Prometheus metrics client, resulting in a process-wide denial of service.

Alon Barad
Alon Barad
11 views•6 min read
•1 day ago•CVE-2026-73559
6.5

CVE-2026-73559: Uncontrolled Resource Consumption in vLLM API completions

CVE-2026-73559 is an uncontrolled resource consumption vulnerability in the vLLM engine, specifically within the /v1/completions API endpoint, allowing authenticated attackers to cause application-level denial of service via unbounded prompt arrays.

Amit Schendel
Amit Schendel
10 views•5 min read
•1 day ago•CVE-2026-54526
9.9

CVE-2026-54526: Strict Template Referencing Bypass and Privilege Escalation in Argo Workflows

A critical security bypass vulnerability in Argo Workflows allows authenticated attackers with workflow submission privileges to bypass 'Strict' or 'Secure' template referencing restrictions. By injecting unvalidated fields into the nested ArtifactGC configuration, attackers can execute arbitrary pod patches, leading to host namespace escape and cluster-wide privilege escalation.

Alon Barad
Alon Barad
15 views•6 min read
•1 day ago•CVE-2026-54249
6.8

CVE-2026-54249: Server-Side Request Forgery via Confused Deputy in Pydantic AI UI Adapters

A Server-Side Request Forgery (SSRF) / Confused Deputy vulnerability has been identified in Pydantic AI UI Adapters (such as VercelAIAdapter). Under certain conditions, a malicious client can supply manipulated message history with provider metadata that forces the server to resolve files within privileged cloud environments (AWS S3, Google Cloud Storage) or model providers. This occurs because the adapters deserialize client-provided metadata structures directly into UploadedFile instances without validation, which are subsequently fetched using high-privilege server credentials.

Alon Barad
Alon Barad
7 views•7 min read