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-F283-GHQC-FG79

GHSA-f283-ghqc-fg79: Denial of Service via Unbounded Cookie Jar Resource Exhaustion in Guzzle

Amit Schendel
Amit Schendel
Senior Security Researcher

Jul 21, 2026·6 min read·12 visits

Executive Summary (TL;DR)

Unbounded memory and cookie header limits in Guzzle allow malicious web servers to poison client cookie jars, causing subsequent outgoing requests to be rejected with HTTP 431/400 errors, leading to a denial of service.

An unbounded resource allocation vulnerability exists in Guzzle's cookie parsing and storage engine. Prior to version 7.15.1, Guzzle did not restrict the number or size of cookies stored within the client-side CookieJar. This lack of boundary control allows a malicious server or an intermediary proxy to poison the cookie storage with oversized or excessive Set-Cookie headers. When the client subsequently targets sibling domains or legitimate services using the same cookie jar, it transmits exceptionally large Cookie headers, triggering upstream protocol violations and resulting in Denial of Service (HTTP 431 / HTTP 400 rejection).

Vulnerability Overview

The vulnerability exists in guzzlehttp/guzzle, a widely used PHP HTTP client. Guzzle provides cookie management via implementations of CookieJarInterface, allowing clients to preserve and send session cookies across multiple HTTP requests. This application-level cookie engine processes cookie storage internally, bypassing the native cookie handling of underlying transport engines such as libcurl.

Prior to version 7.15.1, Guzzle did not restrict the number or size of cookies stored within the client-side jar. It failed to enforce boundaries on the size of individual Set-Cookie headers or the total count of cookie headers processed from a single HTTP response. This design exposes the client application to potential denial-of-service vectors when communicating with untrusted or compromised servers.

An attacker controlling an upstream HTTP server can exploit this mechanism to inject thousands of large cookie parameters into the client cookie jar. When the client subsequently contacts downstream or sibling APIs using the same cookie jar, it issues oversized HTTP requests. These requests trigger immediate denial of service errors due to protocol restrictions on destination servers.

Root Cause Analysis

The underlying vulnerability stems from allocation of resources without limits or throttling (CWE-770) and improper control of sequential memory allocation (CWE-1325). The Guzzle client's CookieJar class parses and persists headers dynamically inside an internal PHP array. The storage loop continues processing items sequentially without enforcing maximum limits on string length or total element counts.

When Guzzle receives a response containing multiple Set-Cookie headers, the CookieJar::extractCookies method extracts each field and inserts it into storage. Because there are no limits on the number of fields or the length of each field, an attacker can transmit multiple megabytes of arbitrary cookie data. The client parses these entries and expands its internal storage, consuming system memory and CPU cycles during the matching process.

Subsequently, during outgoing request generation, the CookieJar::withCookieHeader method matches all saved cookies against the destination URI and concatenates them into a single Cookie header string. If the storage contains hundreds of records, Guzzle produces an exceptionally large header value. When this request is received by reverse proxies, load balancers, or web application firewalls, the upstream infrastructure rejects the transmission because the request header exceeds maximum size limitations.

Code Analysis

To understand the technical changes, we examine the difference between the vulnerable implementation and the patched code in src/Cookie/CookieJar.php. The patch limits both input validation and output assembly.

// In the patched code, the class introduces explicit limits
private const MAX_SET_COOKIE_FIELD_LENGTH = 8190;
private const MAX_SET_COOKIE_FIELDS = 50;
private const MAX_REQUEST_COOKIES = 150;
private const MAX_COOKIE_HEADER_LENGTH = 8190;

The extractCookies method was updated to implement boundary checks during the response-parsing loop. If an incoming Set-Cookie string exceeds the length limits, it is skipped entirely, protecting memory allocation.

public function extractCookies(RequestInterface $request, ResponseInterface $response): void
{
    if ($cookieHeader = $response->getHeader('Set-Cookie')) {
        $accepted = 0;
        foreach ($cookieHeader as $cookie) {
            // Prevent processing of oversized cookie values
            if (\strlen($cookie) > self::MAX_SET_COOKIE_FIELD_LENGTH) {
                continue;
            }
 
            $sc = SetCookie::fromString($cookie);
            // ... [Domain parsing logic] ...
 
            // Stop accepting further cookies once the cap is reached
            if ($this->setCookie($sc) && ++$accepted === self::MAX_SET_COOKIE_FIELDS) {
                break;
            }
        }
    }
}

Similarly, outgoing header generation in withCookieHeader now prevents the construction of oversized Cookie header values. The loop terminates before it exceeds length boundaries.

foreach ($this->cookies as $cookie) {
    if ($cookie->matchesPath($path) && $cookie->matchesDomain($host)) {
        $name = (string) $cookie->getName();
        $value = (string) $cookie->getValue();
        $separatorLength = $values === [] ? 0 : 2;
        $valueLength = \strlen($name) + 1 + \strlen($value);
 
        // Abort header construction if next entry pushes it over 8,190 bytes
        if ($headerLength + $separatorLength + $valueLength > self::MAX_COOKIE_HEADER_LENGTH) {
            break;
        }
 
        $values[] = $name.'='.$value;
        $headerLength += $separatorLength + $valueLength;
        if (\count($values) === self::MAX_REQUEST_COOKIES) {
            break;
        }
    }
}

Exploitation & Attack Scenarios

Exploitation of GHSA-f283-ghqc-fg79 relies on a client-side execution path communicating with a malicious or compromised web service. The attack requires no authentication or special privileges on the client application. The vulnerability is triggered as soon as the Guzzle client attempts to process a response from the adversarial endpoint.

The attacker structures an HTTP response containing dozens of Set-Cookie headers, each populated with random or large alphanumeric strings. Upon receiving this response, the vulnerable Guzzle client updates its local CookieJar storage, adding every entry without validation. The server payload effectively poisons the local cookie state.

When the client application subsequently issues a request using the same CookieJar instance to a legitimate target server, Guzzle automatically compiles the stored values. It generates an outgoing request carrying a multi-kilobyte Cookie header. When the legitimate server or intermediary proxy parses this request, it rejects the traffic, returning an HTTP 431 Request Header Fields Too Large or HTTP 400 Bad Request response, successfully causing a Denial of Service.

Impact Assessment

The impact of this vulnerability is primarily classified as application-level Denial of Service (DoS) through resource exhaustion and client disruption. While it does not facilitate arbitrary code execution or direct data leakage, it allows external entities to persistently block a client application's ability to communicate with legitimate remote services.

In microservice architectures or webhook integration handlers, a single poisoned shared cookie jar can cause cascading failures. Sibling subdomain poisoning represents a significant secondary risk, where an attacker-controlled subdomain (e.g., attacker.example.com) can infect shared cookie context used to access sensitive subdomains (e.g., secure.example.com). This behavior bypasses domain boundary expectations and corrupts runtime sessions.

The CVSS score is evaluated at 5.3 (Medium), with a vector of CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:L. Because exploitation requires no human interaction or elevated privileges, vulnerability scanners and policy compliance tools flag affected instances prior to version 7.15.1 as non-compliant.

Remediation & Testing Guidance

The recommended remediation is upgrading the guzzlehttp/guzzle library to version 7.15.1 or later. The update introduces robust limits that protect the processing pipeline from memory and header exhaustion attacks. System administrators and developers can apply the upgrade directly using the Composer package manager.

For systems where immediate upgrades are unfeasible, disabling cookie jars entirely for connections to untrusted APIs provides effective mitigation. Developers can achieve this by configuring the client with ['cookies' => false] in the request options array. If cookie handling is strictly required, implementing a custom wrapper implementing CookieJarInterface that enforces size and count validation is recommended.

To verify the effectiveness of the remediation, developers can run unit tests that inject oversized headers. The test cases must demonstrate that responses containing more than 50 cookies are truncated and individual cookies larger than 8,190 bytes are safely ignored, preserving client stability and preventing HTTP 431 errors.

Official Patches

GuzzleOfficial Security Advisory
GuzzlePull Request detailing remediation boundaries and mitigation test suites

Fix Analysis (1)

Technical Appendix

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

Affected Systems

PHP installations using Composer applications importing Guzzle client librarySymfony/Laravel/Drupal sites relying on Guzzle's CookieJar implementation for request state synchronization

Affected Versions Detail

Product
Affected Versions
Fixed Version
guzzle
guzzle
< 7.15.17.15.1
AttributeDetail
CWE IDCWE-770
Attack VectorNetwork
CVSS5.3
EPSSN/A
ImpactDenial of Service (DoS)
Exploit StatusProof of Concept
KEV StatusNot Listed

MITRE ATT&CK Mapping

T1499.004Endpoint Denial of Service: Application Exhaustion
Impact
CWE-770
Allocation of Resources Without Limits or Throttling

Allocation of Resources Without Limits or Throttling

Known Exploits & Detection

GitHub Security Advisory TestsVerification test cases that reproduce the DoS behavior by mocking HTTP responses containing more than 50 Set-Cookie values or oversized Set-Cookie headers.

Vulnerability Timeline

Vulnerability discovered, fix PR merged, and patch version 7.15.1 released.
2026-07-20
GitHub Security Advisory GHSA-f283-ghqc-fg79 published.
2026-07-20

References & Sources

  • [1]GHSA-f283-ghqc-fg79 Security Advisory
  • [2]Fix Commit 7b68220d6543f6f80fe62e633361fc9d4ead14d4
  • [3]Related curl Denial of Service Advisory

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•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
3 views•5 min read
•about 3 hours 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
7 views•6 min read
•about 4 hours 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
5 views•7 min read
•about 5 hours ago•GHSA-RM43-82J9-R4MJ
8.2

GHSA-RM43-82J9-R4MJ: Path Traversal (Arbitrary File Read) in atomic-agents-stack Dashboard

A path traversal vulnerability in the optional dashboard server of atomic-agents-stack before version 1.1.0 allows unauthenticated remote attackers to read arbitrary files from the host filesystem.

Amit Schendel
Amit Schendel
4 views•6 min read
•about 21 hours ago•CVE-2026-9318
5.4

CVE-2026-9318: Stored Cross-Site Scripting via HTML Export in Jazzband tablib

CVE-2026-9318 is a stored cross-site scripting (XSS) vulnerability affecting Jazzband tablib versions prior to 3.10.0. The flaw is located in the HTML export functionality of multi-sheet Databook objects. Due to raw f-string interpolation, unsanitized sheet titles containing malicious script tags are rendered directly as HTML, allowing arbitrary client-side code execution in a victim's browser.

Amit Schendel
Amit Schendel
7 views•8 min read
•about 22 hours ago•CVE-2026-54917
10.0

CVE-2026-54917: Cross-Bucket Path Traversal and Authorization Bypass in SeaweedFS S3 and Iceberg Gateways

CVE-2026-54917 is a critical path traversal and authorization bypass vulnerability affecting the S3 and Iceberg REST catalog gateways in SeaweedFS. By explicitly disabling canonical path cleaning in the gorilla/mux routing system, relative path segments such as '..' are allowed to bypass routing constraints and access control checks. When these paths are collapsed server-side by the backend filer, they resolve to folders outside the authorized bucket boundary, allowing unauthorized cross-bucket access.

Amit Schendel
Amit Schendel
9 views•5 min read