Description
The Symfony Serializer component DataUriNormalizer handles only the exact types SplFileInfo, SplFileObject, and File, so for a property typed with a subclass such as UploadedFile, ObjectNormalizer instantiates the object through its constructor from attacker-controlled data, including the file path. This allows an arbitrary file on the server to be treated as an uploaded file in Symfony versions prior to 5.4.56, 6.x prior to 6.4.50, 7.x prior to 7.4.23, and 8.x prior to 8.1.11.

A request body such as {"image": {"path": "/path/to/project/.env.local", "originalName": "a.png", "test": true}} makes the application handle any file on the server as an upload, without the file being sent. With test: true, UploadedFile::isValid() skips is_uploaded_file() and move() falls back to rename(). Assert\File does not prevent this because it validates the file at the attacker-chosen path, which exists on the server.
Any code that deserializes untrusted data into a type that holds such a property is affected. That includes #[MapRequestPayload] on a DTO with an UploadedFile property, which is how uploads are mapped in Symfony 8.1; a single unauthenticated request with a JSON or form body is enough. Depending on what the application does with the upload, this can expose any file readable by PHP (for instance, when uploads are stored and served back), move any such file when move() is called, and reveal whether a path exists.

A serializer built without DataUriNormalizer ahead of the object normalizer is not protected by the fix; the serializer configured by FrameworkBundle is.
Published: 2026-11-06
Score: 8.4 High
EPSS: n/a
KEV: No
Impact: Arbitrary File Manipulation
Action: Immediate Patch
AI Analysis

Impact

The Symfony Serializer component’s DataUriNormalizer protects only the exact types SplFileInfo, SplFileObject, and File. When a property is typed with a subclass such as UploadedFile, the ObjectNormalizer constructs an UploadedFile instance from the request data, passing the supplied file path to its constructor. If an attacker supplies any path to a server file, that file becomes treated as an uploaded file without being sent. With the test flag set to true, isValid() bypasses is_uploaded_file() and the move() method falls back to rename(), allowing the attacker to read, move, or otherwise manipulate any file readable by PHP. This can expose sensitive configuration files, enable deletion or relocation of files, or cause the application to serve the file, resulting in substantial confidentiality and integrity impacts.

Affected Systems

Symfony framework versions prior to 5.4.56, 6.4.50, 7.4.23, and 8.1.11 are affected. Any application that uses the Serializer component and accepts untrusted data into a property typed as UploadedFile—such as DTOs annotated with #[MapRequestPayload]—falls into the risk zone. Custom serializers that do not load DataUriNormalizer before the ObjectNormalizer are also vulnerable, while the default configuration provided by FrameworkBundle is protected by the fix.

Risk and Exploitability

The flaw manifests when a request contains a property of type UploadedFile, so a single unauthenticated request with the desired file path is sufficient to trigger the vulnerability. Once the object is constructed, application logic may store or serve the ‘uploaded’ file, exposing its contents, and if move() is called the file may be relocated. No elevated privileges are required; any PHP‑readable file can be targeted. The CVSS score of 8.4 reflects the significant impact, while the absence of EPSS data indicates no current exploitation statistics, yet the attack surface via HTTP or JSON remains large. The vulnerability is not listed in CISA KEV, so administrators should treat this as a high‑priority issue.

Generated by OpenCVE AI on November 6, 2026 at 18:05 UTC.

Remediation

No solution or workaround provided in the CVE record.

OpenCVE Recommended Actions

  • Upgrade Symfony to 5.4.56 or later, 6.4.50 or later, 7.4.23 or later, or 8.1.11 or later to receive the patch that restricts UploadedFile creation.
  • Verify that any custom serializer configuration loads DataUriNormalizer before ObjectNormalizer or that FrameworkBundle’s default configuration is used, so that the protective logic applies.
  • Audit application code to remove or sanitize any usage of UploadedFile or similar file objects in serialized input. Replace indirect file uploads with explicit file‑upload handling or validate file paths and enforce that test mode is disabled.

Generated by OpenCVE AI on November 6, 2026 at 18:05 UTC.

Tracking

Sign in to view the affected projects.

Advisories

No advisories yet.

History

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

Type Values Removed Values Added
Description The Symfony Serializer component DataUriNormalizer handles only the exact types SplFileInfo, SplFileObject, and File, so for a property typed with a subclass such as UploadedFile, ObjectNormalizer instantiates the object through its constructor from attacker-controlled data, including the file path. This allows an arbitrary file on the server to be treated as an uploaded file in Symfony versions prior to 5.4.56, 6.x prior to 6.4.50, 7.x prior to 7.4.23, and 8.x prior to 8.1.11. A request body such as {"image": {"path": "/path/to/project/.env.local", "originalName": "a.png", "test": true}} makes the application handle any file on the server as an upload, without the file being sent. With test: true, UploadedFile::isValid() skips is_uploaded_file() and move() falls back to rename(). Assert\File does not prevent this because it validates the file at the attacker-chosen path, which exists on the server. Any code that deserializes untrusted data into a type that holds such a property is affected. That includes #[MapRequestPayload] on a DTO with an UploadedFile property, which is how uploads are mapped in Symfony 8.1; a single unauthenticated request with a JSON or form body is enough. Depending on what the application does with the upload, this can expose any file readable by PHP (for instance, when uploads are stored and served back), move any such file when move() is called, and reveal whether a path exists. A serializer built without DataUriNormalizer ahead of the object normalizer is not protected by the fix; the serializer configured by FrameworkBundle is.
Title Symfony: The Serializer Builds UploadedFile Objects From Request Data, Letting a Client Point an Upload at Any Server File
First Time appeared Sensiolabs
Sensiolabs symfony
Weaknesses CWE-73
CPEs cpe:2.3:a:sensiolabs:symfony:*:*:*:*:*:*:*:*
Vendors & Products Sensiolabs
Sensiolabs symfony
References
Metrics cvssV4_0

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


Subscriptions

Sensiolabs Symfony
cve-icon MITRE

Status: PUBLISHED

Assigner: Checkmarx

Published:

Updated: 2026-11-06T16:17:01.487Z

Reserved: 2026-10-28T14:33:36.992Z

Link: CVE-2026-118515

cve-icon Vulnrichment

No data.

cve-icon NVD

Status : Received

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

Modified: 2026-11-06T17:17:16.580

Link: CVE-2026-118515

cve-icon Redhat

No data.

cve-icon OpenCVE Enrichment

Updated: 2026-11-06T18:15:07Z

Weaknesses
  • CWE-73

    External Control of File Name or Path