Pentest 47.1/47.2/47.3: Re-Auth bei sensiblen Operationen + Provider.name-Strip

47.3 MEDIUM (Admin-Passwort-Reset ohne Re-Auth):
POST /api/users/:id/password verlangt jetzt currentPassword im
Body. Backend prüft per bcrypt.compare gegen den Hash des
aufrufenden Admins. Frontend (UserList-Modal): zusätzliches
Passwort-Feld wird eingeblendet, sobald für einen User ein neues
Passwort gesetzt werden soll. Gestohlener JWT allein reicht damit
nicht mehr.

47.1 MEDIUM (Open Redirect / Phishing via provider.portalUrl):
Selbes Re-Auth-Pattern für Provider-Endpoints. Nur wenn die
Portal-URL-Domain WIRKLICH gewechselt wird (Host-Vergleich)
oder beim Create mit URL, ist currentPassword Pflicht. Reine
Namens-/Tarif-Edits bleiben friction-frei.
Audit-Log bekommt die Portal-URL beim Ändern explizit mitgeloggt
(Forensik bei Vorfällen). Frontend ProviderModal zeigt amber-
farbenen Bestätigungs-Banner mit Passwort-Eingabe sobald der
Host wechselt.

47.2 INFO (provider.name ohne Backend-Sanitization):
Neuer Helper stripProviderStrings in provider.service, wendet
stripHtml auf name + usernameFieldName + passwordFieldName an –
Defense-in-Depth gegen neue Renderpfade (PDF, Mail-Templates).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-06-01 12:38:45 +02:00
parent d0d2715baa
commit 2c0166ed99
6 changed files with 193 additions and 16 deletions
+3 -2
View File
@@ -1344,8 +1344,9 @@ export const userApi = {
},
// Passwort eines Users zurücksetzen (Admin-Funktion). Separat vom generischen
// Update, damit der Vorgang einen eigenen Audit-Eintrag bekommt.
setPassword: async (id: number, password: string) => {
const res = await api.post<ApiResponse<void>>(`/users/${id}/password`, { password });
// Pentest 47.3: braucht currentPassword (eigenes Admin-Passwort) als Re-Auth.
setPassword: async (id: number, password: string, currentPassword: string) => {
const res = await api.post<ApiResponse<void>>(`/users/${id}/password`, { password, currentPassword });
return res.data;
},
delete: async (id: number) => {