EasyAdmin custom-action dispatcher bypasses access_control on other routesGHSA-g2fm-8hr4-j82h
HIGHFix: EasyCorp/EasyAdminBundle@03be45cGHSA-g2fm-8hr4-j82h is a high-severity (CVSS 8.1) CWE-639 vulnerability in easycorp/easyadmin-bundle. A fix is available for easycorp/easyadmin-bundle — see the affected versions and patch details below.
Exploitation Status
No confirmed exploitation observed yet
- A successful exploit gives an attacker total control of the affected component, not partial access.
- 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 GHSA-g2fm-8hr4-j82h.
EPSS Exploitation Probability
Probability of exploitation in the next 30 days, from FIRST.org EPSS.
How urgent is this, really
GHSA-g2fm-8hr4-j82h by exploitation likelihood (EPSS) against impact (CVSS). Outside the shaded patch-first corner.
Where this sits among everything scored
Of 390,400 CVEs with a current EPSS score, this one falls in the < 10% band (highlighted). Counts from FIRST.org, log-scaled.
Real-World Exposure
easycorp/easyadmin-bundle🐘easycorp/easyadmin-bundleReal-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
Summary
EasyAdmin serves all backend requests through a single dashboard route and, for custom actions (Action::linkToRoute() / MenuItem::linkToRoute()), swaps the executed controller based on the routeName query parameter on the kernel.controller event.
That 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 could reach a more restricted route by name.
Impact
Any application where access_control (or another path-based Symfony security rule) protects some routes more strictly than the dashboard URL used to reach EasyAdmin. An attacker 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] / denyAccessUnlessGranted() remain protected, because those checks are recomputed against the swapped-in controller.
Patches
Fixed in 4.29.16 and 5.5.1. Before dispatching a custom-action route, EasyAdmin now re-evaluates the target route's access_control rule and denies the request if the current user is not granted access.
Workarounds
Add controller-level authorization (#[IsGranted] / denyAccessUnlessGranted()) to any sensitive route, since controller-level checks are still enforced. Upgrading is the recommended fix.
Credits
Reported by @TungNGo02.
Affected Packages
| Ecosystem | Package | Vulnerable range | Fix |
|---|---|---|---|
| 🐘Packagist | easycorp/easyadmin-bundle | ≥ 4.0.0&&< 4.29.16 | 4.29.16composer require easycorp/easyadmin-bundle:^4.29.16 |
| 🐘Packagist | easycorp/easyadmin-bundle | ≥ 5.0.0&&< 5.5.1 | 5.5.1composer require easycorp/easyadmin-bundle:^5.5.1 |
Detection & mitigation playbook
Open-source dependencyDetect
Scan your dependency tree (package-lock.json, pnpm-lock.yaml, requirements.txt, go.sum, etc.) for easycorp/easyadmin-bundle, including transitive dependencies — a direct dependency you never call can still pull in a vulnerable version.
Fix
Update easycorp/easyadmin-bundle to 4.29.16 or later, then make sure no transitive (indirect) dependency still pins the vulnerable range — O3 confirms GHSA-g2fm-8hr4-j82h is resolved across your whole dependency graph.
Workarounds
Put an independent control in front of the weakness: restrict the affected endpoint or interface to trusted networks, require an additional authentication factor or proxy-level check, and invalidate existing sessions and credentials in case the flaw has already been used.
Frequently Asked Questions
Is GHSA-g2fm-8hr4-j82h in your dependencies?
Find it across Packagist, including transitive dependencies.