Symfony Serializer lets clients turn server files into uploads
Key facts
- Attack vector
- Network
- Privileges required
- None
- User interaction
- None
- Attack complexity
- Low
- Attack requirements
- Present
- Impact type
- —
- Confidentiality · integrity · availability
- High · Low · High
- Fix status
- Fixed
Attack profile from CVSS 4.0 · CNA. Fix status from CNA.
Summary
Symfony versions before 5.4.56, from 6.0.0 before 6.4.50, from 7.0.0 before 7.4.23 and from 8.0.0 before 8.1.11 build UploadedFile objects from request data through the Serializer, so a client can choose the file path. An attacker can name any server file in a request body, and the application then treats that file as an upload even though it was never sent (CWE-73). An unauthenticated remote attacker needs only one request with a JSON or form body. Depending on what the application does with the upload, this can expose readable files or move them when move() runs.
Written with Claude Haiku 5.5 from the sources below · 2026-11-06
Description from the CNA
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.
Why it matters now
SSVC decision points
Not available: CISA has not published SSVC decision points for this record.
Affected products
No affected products listed by the sources yet.
Remediation
Upgrade Symfony to 5.4.56, 6.4.50, 7.4.23 or 8.1.11, matching your release line. A serializer built without DataUriNormalizer ahead of the object normalizer is not protected by the fix, while the serializer configured by FrameworkBundle is.
Written with Claude Haiku 5.5 from the sources below · 2026-11-06
Fixed in the same release
Records fixed by the same vendor advisory or release, as the CNA lists them.
- Release ·
sensiolabs symfony 5.4.56, 6.4.50 and 2 more versions
6 records Highest priority Priority LOW 6 LOW
Other records, highest priority first
- TI-2026-85971 Symfony YAML parser inefficient parsing enables denial of servicePriority LOW 38
- TI-2026-85987 Symfony DataUriNormalizer reads local files from uppercase data URIsPriority LOW 36
- TI-2026-86046 XML external entity injection in Symfony Config componentPriority LOW 12
Timeline
- 2026-11-06 Threatist record created from CVE-2026-118515
- 2026-11-08 Priority changed: MEDIUM → LOW
References
More sensiolabs vulnerabilities
- TI-2019-13616 An issue was discovered in Symfony 3.4.0 through 3.4.34, 4.2.0 through 4.2.11, and 4.3.0… CVSS 3.1CRITICAL 9.8
- TI-2018-10604 An issue was discovered in Http Foundation in Symfony 2.7.0 through 2.7.48, 2.8.0 through… CVSS 3.1MEDIUM 6.5
- TI-2019-08131 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… CVSS 3.1CRITICAL 9.8
- TI-2016-02159 Symfony before 2.8.6 and 3.x before 3.0.6 allows remote attackers to bypass… CVSS 3.0CRITICAL 9.8
- TI-2019-08459 An issue was discovered in Symfony before 4.2.12 and 4.3.x before 4.3.8. CVSS 3.1CRITICAL 9.8
- TI-2018-08136 An issue was discovered in the Ldap component in Symfony 2.8.x before 2.8.37, 3.3.x… CVSS 3.0CRITICAL 9.8
Sources
This product uses the NVD API but is not endorsed or certified by the NVD. Sources and licences