CVE-2026-81892: EasyAdmin custom-action dispatcher bypasses access_control on other routes

Published Aug 31, 2026
·
Updated

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 accesscontrol against the original dashboard URL, and the routeName value was not validated. As a result, a path-based accesscontrol 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.

Affected Software

1 affected component
EasyCorp EasyAdmin>4.0.0<=4.29.16, =5.5.1

Remediation

Recommended actions to resolve this vulnerability, in priority order.

  1. Upgrade

    Upgrade EasyAdmin to a version that resolves this vulnerability.

    Fixed in 4.29.16
  2. Upgrade

    Upgrade EasyAdmin to a version that resolves this vulnerability.

    Fixed in 5.5.1

Event History

Aug 31, 2026
CVE Published
via MITRE·08:38 PM
Data Sourced
via MITRE·08:38 PM
DescriptionSeverityWeakness

Frequently Asked Questions

1

Which deployments are exposed to this bypass?

Deployments using EasyAdmin versions from 4.0.0 through 4.29.16, or version 5.5.1, are affected when they expose custom actions via Action::linkToRoute() or MenuItem::linkToRoute() and rely on path-based Symfony access_control rules for the target routes. A low-privilege backend user must be able to reach at least one EasyAdmin URL.

2

What does an attacker need to exploit the issue?

The attacker needs low-privilege access to the backend, access to a reachable EasyAdmin URL, and knowledge of the target route name. They can supply that name through the routeName query parameter to cause EasyAdmin to execute the target controller without Symfony evaluating the target path's access_control rule.

3

Are routes protected by controller-level authorization affected?

No. Authorization enforced by #[IsGranted] or denyAccessUnlessGranted() remains effective because those checks are evaluated against the controller that EasyAdmin swaps in.

4

What should be done if updating cannot happen immediately?

Do not rely solely on path-based access_control rules for routes reachable through EasyAdmin custom-action dispatch. Add controller-level authorization using #[IsGranted] or denyAccessUnlessGranted() for sensitive target routes until the fixed version can be deployed.

5

How can teams identify potentially affected routes?

Review EasyAdmin custom actions and menu items created with Action::linkToRoute() or MenuItem::linkToRoute(). Identify target routes protected only by path-based access_control and lacking controller-level authorization checks.

Contact

SecAlerts Pty Ltd.
132 Wickham Terrace
Fortitude Valley,
QLD 4006, Australia
info@secalerts.co
By using SecAlerts services, you agree to our services end-user license agreement. This website is safeguarded by reCAPTCHA and governed by the Google Privacy Policy and Terms of Service. All names, logos, and brands of products are owned by their respective owners, and any usage of these names, logos, and brands for identification purposes only does not imply endorsement. If you possess any content that requires removal, please get in touch with us.
© 2026 SecAlerts Pty Ltd.
ABN: 70 645 966 203, ACN: 645 966 203