Non-admin with administrateUsers permissions can mint an admin password reset URL
Beschreibung
`UsersController::actionGetPasswordResetUrl` lässt einen Nicht-Admin-Control-Panel-Benutzer, der die `administrateUsers`-Berechtigung besitzt, eine gültige Passwort-Reset-URL für jeden Benutzer, einschließlich Administratoren, prägen. Da "actionSetPassword" nur den in dieser URL eingebetteten Verifizierungscode validiert (ohne Verbindung zur Sitzung des Anrufers), kann der Angreifer ein neues Passwort für ein Admin-Konto festlegen und sich als dieser Admin anmelden. ## Root Cause `UsersController.php` (5.10.9, Zeilen 761-795): Die Aktion erzwingt `userActionChecks()` (editUsers + Team Edition + POST), `requirePermission('administrateUsers')` (Zeile 764) und ` verifyElevatedSession()` (Zeile 766). " verifyElevatedSession()" überprüft das eigene Passwort des Anrufers (Zeile 2666) - es schützt die Sitzung des Angreifers, nicht das Ziel. Die Aktion löst dann eine willkürliche "userId" (Zeile 771) auf und ruft "getPasswordResetUrl($user)" (Zeile 778) mit **no "if ($user->admin) requireAdmin()" guard** auf. Jede destruktive Geschwisteraktion WIRD den Admin schützen: `actionDeactivateUser` (Zeilen 2199-2200, mit dem Kommentar "Nur ein Admin sollte in der Lage sein, einen anderen Admin zu deaktivieren"), `actionDeleteUser` (Zeile 2237), `actionUnlockUser` und suspendieren/imitieren über `canSuspend`/`canImpersonate` (Zeile 542). "actionGetPasswordResetUrl" ist der Ausreißer, der den Wächter auslässt und beweist, dass die Admin-Zielgrenze das beabsichtigte Design ist. `getPasswordResetUrl` (`Users.php:534`) mints eine gültige set-password URL unabhängig vom Zielstatus. `actionSetPassword` (Zeile 855) validiert NUR `isVerificationCodeValidForUser($user, $code)` (Zeile 904) - ohne Link zur Sitzung des Anrufers - und setzt dann das neue Passwort über `saveElement($user)` (Zeile 911) fort. ## Proof of Concept 1. Melden Sie sich als Nicht-Admin mit `editUsers` + `administrateUsers` (Team+ Edition) an. 2. Erstellen Sie eine erhöhte Sitzung mit Ihrem eigenen Passwort. 3. `POST user/get-password-reset-url` mit `userId= ## Impact Ein Nicht-Administrator, der `administrateUsers` (eine Berechtigung, die ausdrücklich Nicht-Administratoren erteilt wird, verschachtelt unter `editUsers` in `UserPermissions.php:495`) hält, erhält eine Passwort-Reset-URL für einen Administrator, legt ein neues Passwort fest und authentifiziert sich als dieser Administrator → vollständige Übernahme des Kontrollpanels. ID des Berichts: 1562
Quellen & weiterführende Informationen
Hier werden ausschließlich tatsächlich zu dieser Schwachstelle gespeicherte Quellenbelege angezeigt.
Was ist zur Behebung zu tun?
Auf eine behobene Version aktualisieren: 5.10.11.
Empfohlene Schritte
- Betroffene Systeme identifizieren: Pixel & Tonic Craft CMS.
- Exposition prüfen: Internet-Erreichbarkeit, Admin-Oberflächen, VPN, Mail- oder Webdienste.
- Update/Rollout auf behobene Version vorbereiten und priorisiert einspielen.
- Nacharbeiten dokumentieren: betroffene Assets, Maßnahme, Zeitpunkt, Restrestrisiko.
Übergangsmaßnahmen
- Zugriff auf betroffene Dienste auf vertrauenswürdige Netze einschränken.
- WAF/IDS/EDR-Regeln und Hersteller-IOCs aktivieren, sofern verfügbar.
- Nicht benötigte Funktionen, Plugins oder Dienste temporär deaktivieren.
- Administrative Zugänge besonders absichern: MFA, Passwortrotation, Session-Invalidierung.