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-R7CG-QJJM-XHQQ

GHSA-R7CG-QJJM-XHQQ: Unbounded Recursion Denial of Service in webonyx/graphql-php

Alon Barad
Alon Barad
Software Engineer

May 5, 2026·6 min read·46 visits

Executive Summary (TL;DR)

A flaw in webonyx/graphql-php's parser allows attackers to crash the PHP process via highly nested GraphQL queries, bypassing application-level validation. The issue is fixed in version 15.32.3 by implementing a default recursion limit of 256.

An uncontrolled recursion vulnerability (CWE-674) in the webonyx/graphql-php library allows unauthenticated remote attackers to trigger a Denial of Service (DoS). The vulnerability resides in the recursive descent parser, which fails to limit the depth of nested structures, leading to a stack overflow and subsequent PHP process crash.

Vulnerability Overview

The webonyx/graphql-php library provides a robust PHP implementation of the GraphQL specification. It processes incoming GraphQL requests, parsing the query strings into an Abstract Syntax Tree (AST) before executing the requested operations against an application's data layer. This parsing phase is fundamental to the library's operation and handles all incoming user input automatically.

A vulnerability exists in the library's parser mechanism, specifically identified as CWE-674: Uncontrolled Recursion. The parser implements a recursive descent methodology to evaluate GraphQL document structures. Prior to version 15.32.3, this implementation lacked boundary limits on the depth of recursion it would permit during the initial lexical analysis.

When presented with a highly nested document structure, the parser enters an unconstrained recursive loop. This behavior exhausts the available call stack memory allocated to the executing process. The ensuing stack overflow results in an immediate denial of service condition by crashing the process handling the request.

Root Cause Analysis

The flaw resides within the Language\Parser class of the webonyx/graphql-php package. The parser translates standard GraphQL query strings into a programmatic AST representation. It maps specific structural elements of the GraphQL grammar, such as selection sets and type references, directly to recursive PHP method calls.

Key methods responsible for this recursive processing include parseSelectionSet(), parseValueLiteral(), and parseTypeReference(). Each method calls itself or a companion method to handle nested structures, such as a field requesting an inner object or a multi-dimensional array input. The structural design omitted state variables to track the current depth of this recursive descent.

As the parser descends into deeply nested structures, it continuously allocates new stack frames for each recursive method invocation. Once the number of frames exceeds the operating system's stack size limit for the PHP process, a memory access violation occurs. In PHP environments, this triggers a SIGSEGV (Signal 11), causing the entire process worker to terminate abruptly.

Code Analysis

The vulnerability was remediated in commit 7b7f2080ca5f7d5340a696fc5701b19a9222d2c2. The patch addresses the root cause by introducing stateful depth tracking to the Language\Parser class. This mechanism actively monitors the recursion depth during the initial parsing phase and applies upper boundary limits.

The developers added a recursionDepth integer property to track the current depth, alongside a configurable recursionLimit property with a default value of 256. A new validation method, increaseRecursionDepth(), was introduced to increment the counter and enforce the maximum permitted depth. This method is now invoked at the entry points of all recursive loops within the parser architecture.

When the recursion limit is breached, the parser interrupts the execution flow by throwing a GraphQL\Error\SyntaxError. This architectural change converts an uncatchable process-level fault into a catchable application-level exception. The following snippet illustrates the core logic introduced in the fix:

private function increaseRecursionDepth(): void
{
    if ($this->recursionLimit > 0 && $this->recursionDepth >= $this->recursionLimit) {
        throw new SyntaxError(
            $this->lexer->source, 
            $this->lexer->token->start, 
            "Recursion depth limit of {$this->recursionLimit} exceeded"
        );
    }
    ++$this->recursionDepth;
}

Exploitation

Exploitation requires no authentication and relies on sending a single crafted HTTP request to the vulnerable GraphQL endpoint. The attacker must supply a query string containing artificially deep nesting. This nesting can be achieved using nested lists, recursive field selections, or layered type declarations within the payload.

The execution timing of the vulnerability significantly increases its severity. The stack overflow occurs during the lexical analysis and parsing phase. This phase strictly precedes the application of standard GraphQL validation rules, such as maximum query complexity scoring or explicit depth limits defined by the application layer framework.

Proof-of-concept payloads leverage standard GraphQL syntax repeated continuously. For example, deeply nested lists can be triggered via query ($var: [[[[[[[[Int]]]]]]]]) { field }. Similarly, deeply nested selections utilize recursive field structures like { a { a { a { ... } } } }. The parser attempts to resolve these structures entirely in memory, triggering the fault before returning a response.

Impact Assessment

A successful attack results in a Denial of Service (DoS) affecting the availability of the targeted application. The uncatchable SIGSEGV fault bypasses standard PHP error handling structures, including global exception handlers. This causes the executing PHP-FPM worker process or PHP CLI instance to terminate without returning an HTTP response or executing necessary clean-up routines.

Repeated exploitation systematically terminates available worker processes in the application server pool. If the attack rate exceeds the process manager's ability to spawn new replacement workers, the entire application becomes unresponsive to legitimate user traffic. This creates a high availability impact with minimal resource expenditure or network bandwidth requirements on the attacker's side.

Modern runtime protections mitigate some recursion issues but prove insufficient in this context. The zend.max_allowed_stack_size directive introduced in PHP 8.3 attempts to prevent segmentation faults by throwing an Error exception before the stack guard page is hit. However, in certain environment configurations, the raw depth of the GraphQL parser payload circumvents this check, making the application-level patch strictly necessary.

Remediation

The primary remediation strategy requires updating the webonyx/graphql-php library to version 15.32.3 or later. This release introduces the required structural constraints to prevent uncontrolled recursion. System administrators and developers should execute composer update webonyx/graphql-php to deploy the fixed package to their environments.

Developers manually instantiating the Parser component must verify they do not inadvertently disable the new depth controls. The recursionLimit parameter defaults to 256, which provides ample margin for all legitimate GraphQL schemas. Explicitly setting this configuration to 0 removes the protection and re-exposes the application to the DoS vector.

In environments where immediate patching is unfeasible, administrators can deploy Web Application Firewall (WAF) rules as an interim mitigating control. These rules should explicitly block incoming payloads containing excessive consecutive structural characters, such as more than 100 sequential open brackets ([) or open braces ({). This heuristic approach successfully intercepts the fundamental structural prerequisite for the attack.

Official Patches

webonyxOfficial Release v15.32.3
GitHub AdvisorySecurity Advisory GHSA-R7CG-QJJM-XHQQ

Fix Analysis (1)

Technical Appendix

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

Affected Systems

webonyx/graphql-phpPHP-FPM Worker ProcessesPHP CLI instances utilizing vulnerable library versions

Affected Versions Detail

Product
Affected Versions
Fixed Version
graphql-php
webonyx
< 15.32.315.32.3
AttributeDetail
Vulnerability ClassCWE-674: Uncontrolled Recursion
Attack VectorNetwork (Unauthenticated)
ImpactHigh (Denial of Service via Process Crash)
Exploit StatusProof of Concept Available
KEV StatusNot Listed
Affected ComponentLanguage\Parser class

MITRE ATT&CK Mapping

T1499.004Endpoint Denial of Service: Application or System Exploitation
Impact
CWE-674
Uncontrolled Recursion

The product does not properly control the amount of recursion that takes place, consuming excessive resources, such as allocated memory or the program stack.

Known Exploits & Detection

Advisory PoCDeeply nested lists triggering unbounded recursion via input array structures.
Advisory PoCDeeply nested field selections triggering unbounded recursion via parsed schemas.

Vulnerability Timeline

Patch committed by Benedikt Franke to webonyx/graphql-php repository
2026-04-24
Fixed version 15.32.3 officially released
2026-04-24
Security advisory GHSA-R7CG-QJJM-XHQQ publicly disclosed
2026-04-25

References & Sources

  • [1]GitHub Advisory: Unbounded recursion in parser causes stack overflow in webonyx/graphql-php
  • [2]Fix Commit: 7b7f2080ca5f7d5340a696fc5701b19a9222d2c2
  • [3]Packagist: webonyx/graphql-php

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

•15 minutes ago•CVE-2026-54348
7.2

CVE-2026-54348: Second-Order SQL Injection in Froxlor API Layer

An authenticated administrator with privileges to manage admin accounts (such as change_serversettings) can execute arbitrary SQL commands via a second-order SQL injection vulnerability. The flaw resides in Froxlor's administrative API endpoints, specifically during the handling of IP address mapping parameters which are stored as serialized arrays and later interpolated without sanitization into active database queries. This vulnerability allows high-privileged administrative attackers to compromise the database. By injecting a payload into administrative profile metadata, an attacker can extract sensitive credentials, manipulate backend settings, or potentially disrupt database integrity. The vulnerability affects all versions of Froxlor prior to 2.3.8.

Amit Schendel
Amit Schendel
0 views•6 min read
•about 1 hour ago•CVE-2026-54543
5.4

CVE-2026-54543: DNS Resource Record (RR) Injection in Froxlor DomainZones API

CVE-2026-54543 is a DNS Resource Record (RR) Injection vulnerability in Froxlor, an open-source server administration control panel. Prior to version 2.3.8, the DomainZones.add API command failed to perform strict sanitization and validation on the user-controlled record (label) and type parameters before serializing them into BIND-compatible zone files. An authenticated customer with DNS zone management permissions can inject control characters, breaking out of the original record context to define unauthorized resource records within managed zones.

Amit Schendel
Amit Schendel
2 views•7 min read
•about 1 hour ago•CVE-2026-42533
9.2

CVE-2026-42533: NGINX Map Directive and Regex Matching Pre-Auth Heap Buffer Overflow & Info Leak

CVE-2026-42533 is a critical security vulnerability discovered in NGINX Open Source, NGINX Plus, NGINX Ingress Controller, and related products, referred to as the 'Two-Pass Capture-Clobbering' bug. The flaw is situated within NGINX's internal evaluation engine when handling complex variables, exposing a heap-based buffer overflow and information leak when a configuration chains regular expression-based map directives with numbered capture groups. An unauthenticated remote attacker can exploit this weakness by transmitting crafted HTTP requests to trigger remote code execution or defeat ASLR.

Alon Barad
Alon Barad
4 views•7 min read
•about 2 hours ago•CVE-2026-55593
6.5

CVE-2026-55593: Persistent Administrative Hijacking via Cross-Site Request Forgery in Froxlor Ajax Router

Froxlor prior to version 2.3.8 contains a high-severity architectural flaw where the standalone lib/ajax.php entry point bypasses the centralized request validation in lib/init.php. Unauthenticated remote attackers can leverage Cross-Site Request Forgery (CSRF) to induce authenticated administrators to submit forged requests that modify API key whitelists and expiration dates, potentially yielding persistent, out-of-band administrative control.

Amit Schendel
Amit Schendel
2 views•8 min read
•about 3 hours ago•CVE-2026-62988
9.0

CVE-2026-62988: Multi-Factor Authentication and Credential Bypass in Froxlor API

An insecure data retrieval flaw in the Froxlor server administration panel API allows authenticated remote attackers to retrieve unredacted bcrypt password hashes and Base32-encoded Time-Based One-Time Password (TOTP) seeds. Affected endpoints include several 'get' and 'listing' handlers for customers, administrators, and FTP accounts. Utilizing these leaked parameters, attackers can crack the password hashes offline and concurrently generate valid second-factor authentication codes to completely bypass access controls.

Amit Schendel
Amit Schendel
6 views•6 min read
•about 4 hours ago•CVE-2026-70666
7.4

CVE-2026-70666: Server-Side Request Forgery in Netflix Lemur ACME Authority Management

CVE-2026-70666 is a critical Server-Side Request Forgery (SSRF) vulnerability in Netflix Lemur's ACME certificate management integration. Prior to version 1.9.3, the system allowed authority-role users to bypass initial ACME URL allowlist validations when updating an existing authority. Additionally, the underlying ACME network client blindly parsed and connected to dynamic endpoint URLs supplied in JSON responses from the configured ACME directory, allowing attackers to route arbitrary JWS-signed requests to internal services or cloud metadata endpoints.

Alon Barad
Alon Barad
4 views•5 min read