Symfony's YAML Parser has a ReDoS via Catastrophic Backtracking in Parser::cleanup() Regex
Impact
Symfony\Component\Yaml\Parser::cleanup() strips the optional %YAML directive header, leading comments, and document start/end markers before parsing. The original regexes contained overlapping quantifiers, most notably '^%YAML[: ][\d.]+.\nu', whose [\d.]+ and . overlap on the dot, that exhibit catastrophic backtracking on crafted input. A single oversized %YAML directive header (or comment / document-marker line) makes the parser hang for an arbitrarily long time, denying service.
Source excerpt · OSVAffected packages
Start with the recorded fix for your release branch. Check your installed version and test compatibility before upgrading. Fixing this advisory does not rule out other vulnerabilities in the release.
| Affected range | Recorded fix |
|---|---|
| Earlier releases before 5.4.52Ecosystem versions | 5.4.52 |
| From 6.0.0 before 6.4.40Ecosystem versions | 6.4.40 |
| From 7.0.0 before 7.4.12Ecosystem versions | 7.4.12 |
| From 8.0.0 before 8.0.12Ecosystem versions | 8.0.12 |
Version evidence: OSV · GHSA-9frc-8383-795m
View original version evidence (649 explicit versions)
| Affected range | Recorded fix |
|---|---|
| Earlier releases before 5.4.52Ecosystem versions | 5.4.52 |
| From 6.0.0 before 6.4.40Ecosystem versions | 6.4.40 |
| From 7.0.0 before 7.4.12Ecosystem versions | 7.4.12 |
| From 8.0.0 before 8.0.12Ecosystem versions | 8.0.12 |
Version evidence: OSV · GHSA-9frc-8383-795m
View original version evidence (833 explicit versions)
Original source description
Description
Symfony\Component\Yaml\Parser::cleanup() strips the optional %YAML directive header, leading comments, and document start/end markers before parsing. The original regexes contained overlapping quantifiers, most notably '#^%YAML[: ][\d.]+.*\n#u', whose [\d.]+ and .* overlap on the dot, that exhibit catastrophic backtracking on crafted input. A single oversized %YAML directive header (or comment / document-marker line) makes the parser hang for an arbitrarily long time, denying service.
Resolution
The four regexes in Parser::cleanup() (YAML directive header, leading comments, document-start marker, document-end marker) have been rewritten with possessive quantifiers and unambiguous character classes so backtracking cannot occur.
The patch for this issue is available here for branch 5.4.
Credits
Symfony would like to thank Pietro Tirenna (Shielder) for reporting the issue and Nicolas Grekas for fixing it.
References
- Security advisory github.com/symfony/symfony/security/advisories/GHSA-9frc-8383-795m
- Patch github.com/symfony/symfony/commit/9749cd43c5e09b3735093623670b21b9d8a056cb
- Security advisory github.com/FriendsOfPHP/security-advisories/blob/master/symfony/symfony/CVE-2026-45305.yaml
- Security advisory github.com/FriendsOfPHP/security-advisories/blob/master/symfony/yaml/CVE-2026-45305.yaml
- Source reference github.com/symfony/symfony
- Security advisory symfony.com/cve-2026-45305