ZeroHour

CVE-2026-81892

large

Authorization bypass via route swap in EasyAdmin for Symfony

CVSS 3.1
8.1 high
EPSS
<1%p16
Published
()
Modified
AI analysis

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.

Affected
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
Estimated exposure
largetens of thousands of Symfony backend applications (estimate) — EasyAdmin is the de facto admin generator in the Symfony ecosystem with very large cumulative adoption, but only the subset of deployments that combine linkToRoute() custom actions with path-based access_control rules are actually…

Order-of-magnitude estimate by the model from install counts, market share and public scan data it knows; verify before quoting.

Description

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 news

No ingested article mentions this CVE yet.