CVE-2026-108082 — http-foundation
Fix: symfony/symfony#66048CVE-2026-108082 is a CWE-1333 vulnerability in symfony/http-foundation. A fix is available for symfony/http-foundation — see the affected versions and patch details below.
Symfony: ReDoS in HeaderUtils::split() Reachable Through the Cache-Control Request Header
Exploitation Status
No confirmed exploitation observed yet
- CISA assesses this as automatable — exploitation doesn’t require manual, per-target effort, which raises the odds of mass scanning and opportunistic attacks.
- CISA’s own triage has not observed active exploitation or public proof-of-concept code for this CVE as of its last assessment.
Exploitation and automatability from CISA’s SSVC triage for CVE-2026-108082.
EPSS Exploitation Probability
Probability of exploitation in the next 30 days, from FIRST.org EPSS.
Real-World Exposure
symfony/http-foundation🐘symfony/http-foundation🐘symfony/http-foundation🐘symfony/symfony🐘symfony/symfony🐘symfony/symfony🐘symfony/http-foundation🐘symfony/symfonyReal-time download stats are indexed for npm and PyPI packages. This vulnerability affects Packagist packages — download data is not available via public APIs for these ecosystems.
Description
Description
HeaderUtils::split() parsed header values with a pattern whose token alternative also matched whitespace, followed by a (?<!\s) lookbehind. A run of whitespace placed before a separator could be divided among the iterations of the enclosing repetition in exponentially many ways, and the engine tried all of them before settling. HeaderBag calls it for the Cache-Control header whenever a Request is built, so any application handling HTTP requests is reachable, with no authentication.
A single request carrying such a header costs close to a second of CPU (813 ms for a run of 17 spaces in an 8 KB header on PHP 8.5, doubling with each extra space). From 18 spaces on, preg_match_all() gives up at pcre.backtrack_limit and split() returns an empty array, so every directive of the header is silently dropped.
Resolution
The pattern now consumes whitespace only when more of the value follows it, so a value can no longer end on whitespace, nothing has to be given back, and every quantifier is possessive. The first release of this fix broke splitting on a whitespace separator: HeaderUtils::split('foo bar', ' ') returned a single value in 6.4.46 to 6.4.47, 7.4.19 to 7.4.20 and 8.1.7 to 8.1.8. Whitespace characters used as separators are now left out of the whitespace branch, which 6.4.48, 7.4.21 and 8.1.9 contain.
The patches for this issue are available here for branch 5.4 (and forward-ported to 6.4, 7.4, 8.1 and 8.2).
Credits
Symfony would like to thank r3verii for reporting the issue and Nicolas Grekas for providing the fix.
Symfony would also like to thank Bruno Dias from Checkmarx for his help getting a CVE assigned.
Affected Packages
| Ecosystem | Package | Vulnerable range | Fix |
|---|---|---|---|
| 🐘Packagist | symfony/http-foundation | ≥ 6.0.1&&< 6.4.46 | 6.4.46composer require symfony/http-foundation:^6.4.46 |
| 🐘Packagist | symfony/http-foundation | ≥ 7.0.0&&< 7.4.19 | 7.4.19composer require symfony/http-foundation:^7.4.19 |
| 🐘Packagist | symfony/http-foundation | ≥ 8.0.0&&< 8.1.7 | 8.1.7composer require symfony/http-foundation:^8.1.7 |
| 🐘Packagist | symfony/symfony | ≥ 6.0.1&&< 6.4.46 | 6.4.46composer require symfony/symfony:^6.4.46 |
| 🐘Packagist | symfony/symfony | ≥ 7.0.0&&< 7.4.19 | 7.4.19composer require symfony/symfony:^7.4.19 |
| 🐘Packagist | symfony/symfony | ≥ 8.0.0&&< 8.1.7 | 8.1.7composer require symfony/symfony:^8.1.7 |
Detection & mitigation playbook
Open-source dependencyDetect
Scan your dependency tree (package-lock.json, pnpm-lock.yaml, requirements.txt, go.sum, etc.) for symfony/http-foundation, including transitive dependencies — a direct dependency you never call can still pull in a vulnerable version.
Fix
Update symfony/http-foundation to 6.4.46 or later, then make sure no transitive (indirect) dependency still pins the vulnerable range — O3 confirms CVE-2026-108082 is resolved across your whole dependency graph.
Workarounds
If you can't upgrade right away: gate or disable the affected feature, validate untrusted input at the boundary, and avoid passing attacker-controlled data into the vulnerable path. O3's runtime protection blocks exploitation in production as an interim safeguard until the upgrade lands.
Frequently Asked Questions
Is CVE-2026-108082 in your dependencies?
Find it across Packagist, including transitive dependencies.