CVE-2026-81892
largeAuthorization bypass via route swap in EasyAdmin for Symfony
EasyAdmin, the popular admin generator bundle for Symfony, serves all backend requests through one dashboard route and swaps the executed controller based on an unvalidated routeName query parameter for custom actions (Action::linkToRoute() and MenuItem::linkToRoute()), but the swap happens after Symfony's firewall has already evaluated access_control rules against the original dashboard URL. A low-privilege authenticated backend user who can reach any single EasyAdmin URL and knows a target route's name can therefore invoke that route's controller, bypassing the path-based access_control rule that protects it. The attacker gains unauthorized execution of backend routes with high confidentiality and integrity impact (CVSS 3.1 8.1), though only path-based protections are bypassed — controllers enforcing their own checks via #[IsGranted] or denyAccessUnlessGranted() remain protected. All EasyAdmin releases from 4.0.0 before 4.29.16 and 5.x releases before 5.5.1 are affected. No public proof of concept is known and there are no reports of in-the-wild exploitation; EPSS is a low 0.3% (16th percentile).
What to do: Upgrade to EasyAdmin 4.29.16 (4.x) or 5.5.1 (5.x). Until upgraded, review which custom actions and menu items use linkToRoute(), and enforce authorization inside the target controllers with #[IsGranted] or denyAccessUnlessGranted() rather than relying solely on path-based access_control rules. Also check which low-privilege roles can reach the EasyAdmin dashboard and what backend route names are guessable or discoverable.
| EasyAdmin project (easycorp) EasyAdmin (Symfony admin generator bundle) | 4.0.0 up to (excluding) 4.29.16 (4.x line) |
| EasyAdmin project (easycorp) EasyAdmin (Symfony admin generator bundle) | 5.x up to (excluding) 5.5.1 |
Order-of-magnitude estimate by the model from install counts, market share and public scan data it knows; verify before quoting.
EasyAdmin is a fast and modern admin generator for Symfony applications. From 4.0.0 until 4.29.16 and 5.5.1, EasyAdmin serves all backend requests through a single dashboard route and, for custom actions (Action::linkToRoute() and MenuItem::linkToRoute()), swaps the executed controller based on the routeName query parameter on the kernel.controller event. The swap happens after Symfony's security firewall has already evaluated access_control against the original dashboard URL, and the routeName value was not validated. As a result, a path-based access_control rule protecting the target route was never evaluated, so a low-privilege backend user who can reach a single EasyAdmin URL and knows a target route's name can execute that route's controller, bypassing the path-based rule. Only path-based protections are bypassed. Routes whose controller enforces its own authorization with #[IsGranted] or denyAccessUnlessGranted() remain protected because those checks are recomputed against the swapped-in controller. This issue is fixed in versions 4.29.16 and 5.5.1.
- Weakness
- CWE-639, CWE-862, CWE-863
- Vector
- CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:N
In the news0 stories
No ingested article mentions this CVE yet.