Skip to main content

Symfony ExpressionLanguage EUVDEUVD-2026-102134

| CVE-2026-109449 HIGH
Uncontrolled Recursion (CWE-674)
2026-10-15 Checkmarx
8.7
CVSS 4.0 · Vendor: Checkmarx
View

Attack ChainAIDerived

Hypothetical attack flow derived from CVE metadata – not a confirmed exploit chain

  1. Access
    Reach endpoint parsing untrusted expression
  2. Exploit
    Submit deeply nested expression payload
  3. Execution
    Overflow native stack freeing node tree
  4. Impact
    Crash 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').

This Week Schedule remediation this week. Why: HIGH severity (CVSS 7.0-8.9).
Patch available 0.5% exploitation probability (EPSS)

Get an e-mail when this CVE is exploited, patched or re-scored. Free account.

Alert me

AnalysisAIv1 – 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

symfony 0 <v5.4.54
symfony v7.0.0-BETA1 <v7.4.21
symfony v6.0.0-BETA1 <v6.4.48
symfony v8.0.0-BETA1 <v8.1.9

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

Vendor (Checkmarx) PRIMARY 8.7 HIGH
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
vuln.today AI 7.5 HIGH

Network-reachable parser crash triggered by a single unauthenticated request with no user interaction; availability-only impact with no confidentiality or integrity effect.

3.1 AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H
4.0 AV:N/AC:L/AT:N/PR:N/UI:N/VC:N/VI:N/VA:H/SC:N/SI:N/SA:N

Primary rating from Vendor (Checkmarx).

CVSS VectorVendor: Checkmarx

Attack Vector
Network
Attack Complexity
Low
Attack Requirements
None
Privileges Required
None
User Interaction
None
Vulnerable system: Confidentiality
None
Vulnerable system: Integrity
None
Vulnerable system: Availability
High
Subsequent system: Confidentiality
None
Subsequent system: Integrity
None
Subsequent system: Availability
None

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

Why It Matters

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.

Business Impact: Medium
Compensating Controls

Apply vendor patch.

Threat Intelligence Overview

EPSS Score
0.5%
Top 57% exploitable
Prevalence
High
symfony/expression-language is a widely used component of the popular Symfony PHP framework
Data Quality
6 sources
Confidence: High

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.

SignalValue
Severity HIGH
CISA KEV No
Public POC No
EPSS 0.5%
Patch available Yes
Active threat No
Deciding rule
HIGH severity (CVSS 7.0-8.9)
What every action level means
Emergency Immediate action required. Criteria: CRITICAL + in CISA KEV (actively exploited) without patch, OR CRITICAL + EPSS > 30% without patch, OR CRITICAL + active threat signals without patch.
Act Now Prioritize within 24-48h. Criteria: in KEV with patch available, OR CRITICAL + public POC, OR HIGH + EPSS > 10%, OR CRITICAL + active threat, OR any CRITICAL severity.
This Week Schedule remediation this week. Criteria: HIGH severity (CVSS 7.0-8.9). Patch within normal change window.
This Month Plan within 30 days. Criteria: MEDIUM severity (CVSS 4.0-6.9), lower exploitation probability. Include in regular patch cycle.
Monitor Track and reassess. Criteria: LOW severity (CVSS 0.1-3.9), minimal exploitation risk. No immediate action needed.

SSVC AssessmentENISA

SSVC Decision
Scheduled
Exploitation
None
System Exposure· derived
Open
Automatable
Yes
Human Impact
Medium
Technical Impact
Partial

Priority Score

45
Low Medium High Critical
KEV: 0
EPSS: +1
CVSS: +44
PoC: 0
Weaponized: 0
Threat intel: 0
Gov advisory: 0

Attack Technique

Denial of Service attacks render applications or systems unavailable by overwhelming resources or triggering failure conditions.

CVE-2015-4050 MEDIUM POC
4.3 Jun 02

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

CVE-2019-10910 CRITICAL POC
9.8 May 16

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

CVE-2018-13818 CRITICAL POC
9.8 Jul 10

Twig before 2.4.4 allows Server-Side Template Injection (SSTI) via the search search_key parameter. Rated critical sever

CVE-2026-100872 HIGH POC
8.7 Sep 27

Insufficient verification of payment-claim state in the Sylius e-commerce platform (versions before 2.1.16 and 2.2.9) le

CVE-2026-100869 HIGH POC
8.2 Sep 27

Incorrect authorization in the Sylius Shop API lets anyone holding an order token submit arbitrary payment actions - mos

CVE-2025-64500 HIGH POC
7.3 Nov 12

Symfony is a PHP framework for web and console applications and a set of reusable PHP components. Rated high severity (C

CVE-2026-24739 MEDIUM POC
6.3 Jan 28

Symfony versions up to 5.4.51 contains a vulnerability that allows attackers to operations being performed on an uninten

CVE-2018-12040 MEDIUM POC
6.1 Jun 13

Reflected Cross-site scripting (XSS) vulnerability in the web profiler in SensioLabs Symfony 3.3.6 allows remote attacke

CVE-2016-2403 CRITICAL
9.8 Feb 07

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

CVE-2024-51736 CRITICAL
9.8 Nov 06

Symphony process is a module for the Symphony PHP framework which executes commands in sub-processes. Rated critical sev

CVE-2019-18889 CRITICAL
9.8 Nov 21

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

CVE-2019-11325 CRITICAL
9.8 Nov 21

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

This site uses cookies essential for authentication and security. No tracking or analytics cookies are used. Privacy Policy