Description
The Symfony Serializer component ObjectNormalizer treats any attribute name containing . (and, from Symfony 6.4, [) as a writable property path, allowing untrusted input to modify properties of nested objects and bypass their #[Ignore] metadata attribute in Symfony versions 5.4.41 prior to 5.4.56, 6.4.9 prior to 6.4.50, 7.0.9 prior to 7.1.0, 7.1.2 prior to 7.4.23, and 8.x prior to 8.1.11.
ObjectNormalizer::isAllowedAttribute() accepts such names, and setAttributeValue() hands the name straight to PropertyAccessor::setValue(), which parses it as a property path and traverses into the nested object. A payload key such as customer.admin writes to $order->customer->admin. The #[Ignore] metadata attribute is only consulted when the nested object is denormalized in its own right, never when it is reached through a path. #[Groups] restrictions are not bypassed: the path is only accepted when no groups are passed in the context, and then groups restrict nothing. When the root class carries neither #[Ignore] nor #[Groups], no allowlist applies and every key of the payload is let through. Because PropertyAccessor also resolves a path segment against public methods, a segment matching a public method name invokes that method with the attacker’s value.Applications that bind untrusted input to objects are affected, including controllers using #[MapRequestPayload] or #[MapQueryString], whose default normalizer is ObjectNormalizer. With OBJECT_TO_POPULATE, as used for partial updates, the traversal reaches an already hydrated entity graph, and the modified field may be persisted.

The fix accepts a property path only when the class metadata declares an attribute of that exact name. Declared paths keep working unchanged, and a path in the payload with no matching declaration is ignored.
Published: 2026-11-06
Score: 6.9 Medium
EPSS: n/a
KEV: No
Impact: Untrusted property‑path traversal that bypasses #[Ignore] protection
Action: Upgrade Immediately
AI Analysis

Impact

The Symfony Serializer’s ObjectNormalizer treats attribute names that include a dot (.) or, from Symfony 6.4, an opening bracket ([) as a property path. When an attacker supplies a key such as customer.admin, the normalizer resolves the path and writes to $order->customer->admin, effectively modifying nested object properties that are normally protected by the #[Ignore] attribute. Because PropertyAccessor also interprets a path segment as a public method name, an attacker can trigger public methods with arbitrary values, allowing unintended writes to private or protected state and potentially executing sensitive functionality. The weakness is identified by CWE‑915, which concerns property‑path traversal leading to unauthorized property modification.

Affected Systems

Applications built with SensioLabs Symfony are affected. Versions 5.4.41 through 5.4.55, 6.4.9 through 6.4.49, 7.0.9 through 7.0.99, 7.1.2 through 7.4.22, and all 8.x releases below 8.1.11 are vulnerable. The flaw manifests in any endpoint that binds untrusted input to objects via the default ObjectNormalizer, such as controllers using #[MapRequestPayload] or #[MapQueryString], or when OBJECT_TO_POPULATE is used for partial updates.

Risk and Exploitability

The CVSS score of 6.9 denotes moderate severity. The EPSS score is not available, so the probability of exploitation cannot be accurately quantified. The vulnerability is not listed in the CISA KEV catalog. The exploit is likely to occur remotely by submitting crafted payloads to endpoints that deserialize untrusted input, allowing attackers to tamper with nested data, bypass isolation attributes, or invoke arbitrary public methods when the application logic is driven by user input.

Generated by OpenCVE AI on November 6, 2026 at 19:38 UTC.

Remediation

No solution or workaround provided in the CVE record.

OpenCVE Recommended Actions

  • Upgrade to the latest patched Symfony releases (>=5.4.56, 6.4.50, 7.1.0, 7.4.23, or 8.1.11).
  • After upgrading, enforce explicit allowlists in the ObjectNormalizer and disable automatic request‑payload mapping on security‑sensitive endpoints.
  • If an upgrade cannot be applied immediately, configure the ObjectNormalizer to reject any property path that is not declared in the class metadata and validate incoming requests so that no nested property paths are transmitted.

Generated by OpenCVE AI on November 6, 2026 at 19:38 UTC.

Tracking

Sign in to view the affected projects.

Advisories

No advisories yet.

History

Fri, 06 Nov 2026 21:30:00 +0000

Type Values Removed Values Added
Metrics cvssV3_1

{'score': 6.5, 'vector': 'CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:L/I:L/A:N'}


Fri, 06 Nov 2026 17:00:00 +0000

Type Values Removed Values Added
Description The Symfony Serializer component ObjectNormalizer treats any attribute name containing . (and, from Symfony 6.4, [) as a writable property path, allowing untrusted input to modify properties of nested objects and bypass their #[Ignore] metadata attribute in Symfony versions 5.4.41 prior to 5.4.56, 6.4.9 prior to 6.4.50, 7.0.9 prior to 7.1.0, 7.1.2 prior to 7.4.23, and 8.x prior to 8.1.11. ObjectNormalizer::isAllowedAttribute() accepts such names, and setAttributeValue() hands the name straight to PropertyAccessor::setValue(), which parses it as a property path and traverses into the nested object. A payload key such as customer.admin writes to $order->customer->admin. The #[Ignore] metadata attribute is only consulted when the nested object is denormalized in its own right, never when it is reached through a path. #[Groups] restrictions are not bypassed: the path is only accepted when no groups are passed in the context, and then groups restrict nothing. When the root class carries neither #[Ignore] nor #[Groups], no allowlist applies and every key of the payload is let through. Because PropertyAccessor also resolves a path segment against public methods, a segment matching a public method name invokes that method with the attacker’s value.Applications that bind untrusted input to objects are affected, including controllers using #[MapRequestPayload] or #[MapQueryString], whose default normalizer is ObjectNormalizer. With OBJECT_TO_POPULATE, as used for partial updates, the traversal reaches an already hydrated entity graph, and the modified field may be persisted. The fix accepts a property path only when the class metadata declares an attribute of that exact name. Declared paths keep working unchanged, and a path in the payload with no matching declaration is ignored.
Title Symfony: ObjectNormalizer Dotted-Key Property-Path Traversal Bypasses #[Ignore] on Nested Objects
First Time appeared Sensiolabs
Sensiolabs symfony
Weaknesses CWE-915
CPEs cpe:2.3:a:sensiolabs:symfony:*:*:*:*:*:*:*:*
Vendors & Products Sensiolabs
Sensiolabs symfony
References
Metrics cvssV4_0

{'score': 6.9, 'vector': 'CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:L/VI:L/VA:N/SC:N/SI:N/SA:N'}


Subscriptions

Sensiolabs Symfony
cve-icon MITRE

Status: PUBLISHED

Assigner: Checkmarx

Published:

Updated: 2026-11-06T20:39:54.876Z

Reserved: 2026-11-04T16:22:10.624Z

Link: CVE-2026-122053

cve-icon Vulnrichment

No data.

cve-icon NVD

Status : Awaiting Analysis

Published: 2026-11-06T17:17:20.123

Modified: 2026-11-06T21:40:43.450

Link: CVE-2026-122053

cve-icon Redhat

No data.

cve-icon OpenCVE Enrichment

Updated: 2026-11-06T19:45:08Z

Weaknesses
  • CWE-915

    Improperly Controlled Modification of Dynamically-Determined Object Attributes