SYMFONY/JSON-PATH · GHSA-cpww-5vpx-72x7 · Package
FIX → 8.1.11 · 7.4.23
The JsonPath component in Symfony still lets a crafted query with search(), match() or chained filters burn CPU far beyond its size, after an earlier fix for the same class of flaw. An application that evaluates an attacker-influenced JSONPath expression can have a PHP worker held for minutes, a denial of service.
first public Nov 4, 2026 · 1 source
Could this affect your app?
Free first check from your website. Connect your repo for the full answer.
Applications that evaluate JSONPath expressions which an attacker can influence, such as a query string or request field passed to JsonPath filters. Applications that only use fixed, developer-written JSONPath queries on trusted data are not exposed. The sources do not say whether default configurations are reachable from the internet.
Not affected if auth-required, static-queries, trusted-input
Who cares json-path, php, self-hosted, symfony
composer show symfony/json-path and composer show symfony/symfony to read the installed versions.The fix for CVE-2026-45756 lowers pcre.backtrack_limit to 10000 around each preg_match() call of the match() and search() filter functions. That limit applies to one starting position, not to one call. PCRE resets its counter at every position it tries a match from. So an unanchored pattern that stays just under the limit is paid once per byte of the subject. Each call also starts from a fresh limit, so chaining clauses in one filter multiplies the work.
Two other paths made the cost of a query grow faster than its size, without any regular expression:
$ inside a filter, like @.x == $.limit or length($.items), were evaluated again for every node the filter visits.An application that evaluates an attacker-influenced JSONPath expression can therefore still be made to hold a PHP worker. A document of 2 MB and a query of 2.5 KB take 3.5 minutes of CPU.
JsonCrawler::find() now bounds the total regex work of one call, and throws an exception when that budget is exhausted. Filter expressions are parsed once per query, and absolute queries inside filters are evaluated once per query.
Check it with your coding agent
It reads this page and tells you if your code is affected.
Are you affected?
Ask from here. InfraStack checks the affected versions against your stack and answers in your inbox.
InfraStack checks the affected versions against your stack and answers in Slack, with the evidence and the fix.
find()Upgrade to 8.1.11 · 7.4.23
symfony/json-path 7.x: 7.4.23symfony/json-path 8.x: 8.1.11symfony/symfony 7.x: 7.4.23symfony/symfony 8.x: 8.1.11The patches for this issue are available here, here and here for branch 7.4 (and forward-ported to 8.1 and 8.2).
We would like to thank Kamil Vavra for reporting the issue and Nicolas Grekas for finding the related ones and providing the fix.