Firebase-Nutzer kann sich selbst Rechte geben
Prüfregel · RSC-SEC-133
- Sicherheit
- Schweregrad: Hoch
- CWE-269
- OWASP A01-2021
Findet `match /users/{uid}` (bzw. Profil-Collection) mit `allow write: if request.auth.uid == uid` ohne Schutz des Rollen-/Rechte-Felds — gemeldet, wenn die Regeln ein solches Feld (`role`, `isAdmin`, `admin`, `plan`, `premium`) als Berechtigung lesen.
Warum das zählt
Das ist das Firebase-Gegenstück zur Selbst-Beförderung in Supabase (RSC-SEC-111). `allow write: if request.auth.uid == uid` sieht sauber aus und bindet an den Eigentümer — beantwortet aber nur, WESSEN Dokument geändert wird, nicht WELCHE Felder. Firestore kennt keinen Feldschutz von sich aus.
Trägt dasselbe Dokument die Rolle, den Tarif oder ein `isAdmin`-Flag — und die Regeln verraten das, weil sie es anderswo als Berechtigung lesen (`get(/…/users/$(uid)).data.role == 'admin'`) —, schreibt ein in Sekunden selbst angelegtes Konto sein eigenes `role` auf `admin` einfach mit.
Fix: In der Schreibregel das Rollen-Feld gegen den bisherigen Wert pinnen oder mit `request.resource.data.diff(resource.data).affectedKeys().hasOnly([...])` nur die harmlosen Felder zulassen. Sauberer ist, Rollen in einer eigenen Collection zu führen, die nur Admins bzw. der Server beschreiben.
Prüfstufe
- Repo-Zugang (Deep-Scan)
So behebt ihr es
Das Rollen-Feld in der Schreibregel gegen den Altwert pinnen (`request.resource.data.role == resource.data.role`) oder mit `affectedKeys().hasOnly([...])` nur harmlose Felder zulassen — am besten die Rolle gar nicht im Nutzer-Dokument führen.