Zum Inhalt springen

RLS-Policy vertraut auf vom Nutzer setzbare Metadaten

Prüfregel · RSC-SEC-110

  • Sicherheit
  • Schweregrad: Kritisch
  • CWE-639
  • OWASP A01-2021

Findet Policies, die `user_metadata` bzw. `raw_user_meta_data` prüfen — direkt oder über eine Hilfsfunktion. Diese Werte setzt jeder Nutzer selbst.

Warum das zählt

Supabase speichert zu jedem Konto zwei Arten von Metadaten: `app_metadata` setzt nur der Server, `user_metadata` setzt der Nutzer selbst — mit einer Zeile im Browser, `supabase.auth.updateUser({ data: { role: 'admin' } })`. Eine Policy, die auf `auth.jwt() -> 'user_metadata' ->> 'role'` prüft, fragt also den Nutzer, ob er Admin ist.

Der Fehler entsteht fast immer beim Bau eines Admin-Bereichs: Die Rolle wird beim Registrieren in die Metadaten geschrieben, weil das ohne eigene Tabelle geht, und die Policy liest sie von dort. Im Test funktioniert alles, weil sich niemand selbst befördert.

Fix: Rollen in einer eigenen Tabelle führen (bei Lovable `user_roles` mit `has_role()`), deren Schreibrechte nur Admins haben, oder serverseitig in `app_metadata`. Danach jede Policy prüfen, die `user_metadata` oder `raw_user_meta_data` liest.

Prüfstufe

  • Repo-Zugang (Deep-Scan)

So behebt ihr es

Rollen in `app_metadata` (nur serverseitig setzbar) oder in einer eigenen Tabelle `user_roles` führen, die nur Admins beschreiben dürfen.

Eigene App kostenlos prüfen