CVE-2026-81892
WysokieCVSS 8.1Prawdopodobieństwo exploitacji (EPSS)
Niskie ryzykoPercentyl 16 - wyżej niż 16% wszystkich znanych CVE
Streszczenie
W EasyAdmin (generatorze paneli administracyjnych dla Symfony) w wersjach od 4.0.0 do 4.29.16 oraz 5.5.1, istnieje podatność polegająca na tym, że kontrola dostępu oparta na ścieżce może zostać ominięta. Dzieje się tak, ponieważ zmiana kontrolera następuje po sprawdzeniu przez firewall, a parametr routeName nie jest walidowany. Użytkownik z niskimi uprawnieniami może wykonać kontroler innej trasy, jeśli zna jej nazwę, omijając zabezpieczenia oparte na ścieżce. Trasy, które same sprawdzają autoryzację (np. przez #[IsGranted]), pozostają chronione. Problem został naprawiony w wersjach 4.29.16 i 5.5.1.
Ocena ryzyka
Osoba atakująca z niskimi uprawnieniami w panelu administracyjnym może uzyskać dostęp do funkcji chronionych wyłącznie przez reguły oparte na ścieżce, co może prowadzić do nieautoryzowanych działań w aplikacji.
Rekomendacja
Zaktualizuj EasyAdmin do wersji 4.29.16 lub 5.5.1 (lub nowszej), która zawiera poprawkę tej podatności.
Inne podatności w EasyAdmin
Oryginalny opis (angielski, źródło NVD)
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.

