Attack ChainAIDerived
Hypothetical attack flow derived from CVE metadata – not a confirmed exploit chain
-
AccessReach endpoint parsing untrusted expression
-
ExploitSubmit deeply nested expression payload
-
ExecutionOverflow native stack freeing node tree
-
ImpactCrash PHP process (denial of service)
Vulnerability Assessment
| Weakness |
CWE
ASVS 5.0
V15 - Secure Coding and Architecture Recursion depth limits
|
| Exploitation Conditions | Exploitable only when the application parses attacker-controlled (untrusted) expressions through the ExpressionLanguage component - most directly via the #[Assert\ExpressionSyntax] / ExpressionLanguageSyntax validator which passes the validated value to ExpressionLanguage::lint(), or via any direct call to ExpressionLanguage::parse()/lint() on user input. The required payload is a single expression with extreme nesting depth (the fix caps nesting at 256 levels; tests use ~300 nested unary operators, parentheses, array/hash literals, binary operators, property accesses or ternaries). Limiting factor: applications that only evaluate developer-authored or hard-coded expressions never expose attacker-controlled input to the parser and are not realistically exploitable; impact is confined to availability (process crash) with no data exposure or code execution. |
| Impact | This is a genuine availability-only denial-of-service issue (CWE-674 unbounded recursion) in Symfony's ExpressionLanguage parser. The vendor-supplied CVSS 4.0 vector (AV:N/AC:L/AT:N/PR:N/UI:N) describes a network-reachable, low-complexity, unauthenticated condition with HIGH availability impact and no confidentiality or integrity impact (VC:N/VI:N/VA:H), which is internally consistent - the flaw crashes the PHP worker process via native stack overflow while the oversized node tree is being freed, with no code execution. The headline 8.7 score is driven entirely by the ease of triggering, not by impact breadth. No EPSS score was provided and the issue is NOT in CISA KEV, so there is no evidence of active exploitation; treat exploitation status as 'no public exploit identified at time of analysis.' A critical caveat: the AV:N/PR:N/UI:N metrics assume the vulnerable code path is actually reachable with attacker-controlled input - this flaw is only exploitable in applications that parse UNTRUSTED expressions (e.g. validating user-written expressions via #[Assert\ExpressionSyntax], which calls ExpressionLanguage::lint()). Applications that only parse developer-authored expressions are effectively unaffected regardless of the CVSS vector. Net: real but conditional priority - patch promptly where untrusted expressions are parsed, lower urgency elsewhere; it is a resource-exhaustion DoS, not RCE. |
| Exploit ScenarioDerived | An application exposes a field that validates user-supplied Symfony expressions (for example via the ExpressionSyntax constraint, which internally calls ExpressionLanguage::lint()). An unauthenticated attacker submits a single request containing an expression built from tens of thousands of nested unary operators, array literals, or property accesses; parsing builds an unbounded node tree whose destruction overflows the native stack and crashes the PHP process, denying service. No public weaponized exploit is identified, though the vendor's regression tests disclose the exact trigger pattern (e.g. str_repeat('!',300).'1'). |
Get an e-mail when this CVE is exploited, patched or re-scored. Free account.
Alert meAnalysisAIv1 – Oct 15, 2026
Denial of service in Symfony's ExpressionLanguage component lets a remote, unauthenticated attacker crash the PHP process by submitting a single expression built from tens of thousands of nested unary operators, array/hash literals, binary operators, property accesses or ternaries. The parser places no bound on the depth of the node tree it builds, and when that tree is destroyed PHP's recursive free overflows the native stack; the crash occurs while the tree is being freed, so it happens even if the expression itself would never be evaluated. Symfony applications that lint user-supplied expressions - most directly through the #[Assert\ExpressionSyntax] validator, which forwards the validated value to ExpressionLanguage::lint(), or any code calling parse()/lint() on untrusted input - are affected in versions up to 5.4.53, 6.4.47, 7.4.20 and 8.1.8. Impact is availability-only (CVSS:4.0 base 8.7 per NVD; our independent CVSS:3.1 assessment scores it AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H), there is no data exposure or code execution, no public exploit code has been identified at time of analysis, and vendor patches are available.
RemediationAI
Upgrade symfony/expression-language to 5.4.54, 6.4.48, 7.4.21 or 8.1.9 (vendor-released patch; landed via GitHub PRs 65690, 66720 and 66723), which enforces a maximum nesting level of 256 and throws a SyntaxError instead of constructing an unbounded node tree - run the Composer update for the component and redeploy, then verify that deeply nested payloads such as 300 chained unary operators now fail validation rather than terminating the worker. If the component cannot be updated immediately, the effective compensating control is to stop passing untrusted strings to the parser: remove or disable the #[Assert\ExpressionSyntax] constraint on user-supplied fields, and audit direct parse()/lint() calls so that only developer-authored expressions reach them; because the crash is triggered by nesting depth rather than input length alone, also cap the length of any expression a user may submit (for example a few hundred characters) before it reaches the parser, accepting that this may reject legitimately long expressions and that it is a mitigation rather than a fix. Note that the patched limit of 256 nesting levels is itself a behavioral constraint that can reject unusually deep but otherwise valid developer-authored expressions, so re-test any complex generated expressions after upgrading. Advisory and patch references: https://github.com/symfony/symfony/security/advisories/GHSA-7rpj-w9pf-39rr, https://symfony.com/blog/cve-2026-109449-unbounded-nesting-in-the-expression-parser-lets-untrusted-expressions-crash-the-process, https://github.com/symfony/symfony/pull/65690, https://github.com/symfony/symfony/pull/66720, https://github.com/symfony/symfony/pull/66723.
Affected VersionsENISA
Affects your stack
Find out whether the stacks and servers you run are on an affected version.
Checking this CVE against your own stacks and servers is part of the Basic plan and up.
Technical ContextAI · show details
The vulnerability is CWE-674 (Uncontrolled Recursion) in the Parser of the symfony/expression-language component, tracked against the CPE cpe:2.3:a:sensiolabs:symfony. ExpressionLanguage is the component that tokenizes and parses Symfony expression strings (the same syntax used by the #[Assert\Expression] and #[Assert\ExpressionSyntax] constraints, security voters, routing conditions and dependency-injection expressions) into a tree of Node objects. Because the original parser recursed through getPrimary(), parseExpression(), parsePostfixExpression() and the argument/array/hash productions without tracking how deep it had gone, a payload such as str_repeat('!', 300).'1' or str_repeat('[', 300).'1'.str_repeat(']', 300) produced an equivalently deep node tree. The failure mode is not in the parse walk itself but in the teardown: destructing such a tree recurses once per level, and beyond a few thousand levels that recursion exhausts the native C stack and aborts the PHP process. The upstream fix (PR 65690, with follow-ups 66720 and 66723) introduces a MAX_NESTING_LEVEL constant of 256 and an enterNestingLevel() guard that increments a per-parse counter on every primary, binary-operator and postfix production, saving and restoring the counter in a finally block so sibling branches do not accumulate against the limit. Expressions deeper than 256 levels now raise a SyntaxError with a cursor position instead of building an unbounded tree; the PR's own tests confirm that 300-level payloads of each syntactic family (unary operators, signs, parentheses, arrays, hashes, binary operators, properties, array accesses, ternaries) are rejected while a 100-level expression is still accepted.
Know when Symfony gets its next vulnerability
- Watch products and get an email when something new is published
- Check this CVE against your own stack and servers
- Exploit and PoC references, threat intelligence from 22 sources
No credit card · 7-day full trial
Severity by source
CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:N/VI:N/VA:H/SC:N/SI:N/SA:N
Network-reachable parser crash triggered by a single unauthenticated request with no user interaction; availability-only impact with no confidentiality or integrity effect.
Primary rating from Vendor (Checkmarx).
CVSS VectorVendor: Checkmarx
DescriptionCVE.org
In Symfony Expression Language versions prior to 5.4.54, 6.4.48, 7.4.21, and 8.1.9, the parser of the ExpressionLanguage component built its node tree with no bound on its depth. An expression made of tens of thousands of nested unary operators, array literals, binary operators or property accesses crashed the PHP process, while the tree was being freed.
#[Assert\ExpressionSyntax] passes the validated value to ExpressionLanguage::lint(), so an application validating expressions written by its users could be crashed by a single request, and so could any code parsing untrusted expressions.
This issue affects symfony/expression-language through v5.4.53, v6.0.0-BETA1 through v6.4.47, v7.0.0-BETA1 through v7.4.20, and v8.0.0-BETA1 through v8.1.8.
Technical POC Analysis
CWE-674 (uncontrolled recursion), in Parser.php of the symfony/expression-language component.
Full technical POC analysis - root cause, step-by-step exploitation and patch breakdown - is part of the Pro and Business plans.
Executive ViewAI
A denial-of-service flaw in Symfony's ExpressionLanguage component allows an unauthenticated remote user to crash the PHP process serving a Symfony application by submitting a single maliciously constructed expression. Organizations are exposed wherever end-user input is passed into expression parsing or linting, most notably applications using the #[Assert\ExpressionSyntax] validation attribute, and the resulting worker crashes can degrade or interrupt availability of customer-facing services. Because a vendor remedy is already published, leadership should treat this as a near-term patching obligation rather than an open research problem.
Apply vendor patch.
Threat Intelligence Overview
How this decision was reached
The engine reads each signal below and applies a fixed list of rules from top to bottom. The first rule that matches sets the recommended action – like a statement, every line is shown.
What every action level means
SSVC AssessmentENISA
Priority Score
Attack Technique
Denial of Service attacks render applications or systems unavailable by overwhelming resources or triggering failure conditions.
FragmentListener in the HttpKernel component in Symfony 2.3.19 through 2.3.28, 2.4.9 through 2.4.10, 2.5.4 through 2.5.1
In Symfony before 2.7.51, 2.8.x before 2.8.50, 3.x before 3.4.26, 4.x before 4.1.12, and 4.2.x before 4.2.7, when servic
Twig before 2.4.4 allows Server-Side Template Injection (SSTI) via the search search_key parameter. Rated critical sever
Insufficient verification of payment-claim state in the Sylius e-commerce platform (versions before 2.1.16 and 2.2.9) le
Incorrect authorization in the Sylius Shop API lets anyone holding an order token submit arbitrary payment actions - mos
Symfony is a PHP framework for web and console applications and a set of reusable PHP components. Rated high severity (C
Symfony versions up to 5.4.51 contains a vulnerability that allows attackers to operations being performed on an uninten
Reflected Cross-site scripting (XSS) vulnerability in the web profiler in SensioLabs Symfony 3.3.6 allows remote attacke
Symfony before 2.8.6 and 3.x before 3.0.6 allows remote attackers to bypass authentication by logging in with an empty p
Symphony process is a module for the Symphony PHP framework which executes commands in sub-processes. Rated critical sev
An issue was discovered in Symfony 3.4.0 through 3.4.34, 4.2.0 through 4.2.11, and 4.3.0 through 4.3.7. Rated critical s
An issue was discovered in Symfony before 4.2.12 and 4.3.x before 4.3.8. Rated critical severity (CVSS 9.8), this vulner
EUVD-2026-102134
NVD
CVE.org
EPSS
Vulnrichment
GitHub
Exploit-DB