FixVibe
Covered by FixVibehigh

Sikring af Next.js + Supabase: Forhindring af Row Level Security (RLS) omgåelser

Applikationer bygget med Next.js og Supabase er ofte afhængige af Row Level Security (RLS) for at beskytte data. Manglende aktivering af RLS eller forkert konfiguration af Supabase-klienten kan føre til fuld databaseeksponering, hvilket giver uautoriserede brugere mulighed for at læse eller ændre følsomme poster.

CWE-284

Indvirkning

Angribere kan omgå applikationslogik for at læse, opdatere eller slette poster i databasen, hvis Row Level Security (RLS) ikke håndhæves korrekt [S1]. Dette resulterer ofte i eksponering af personligt identificerbare oplysninger (PII) eller følsomme applikationsdata til brugere, der kun har adgang til den offentlige anonyme API-nøgle.

Grundårsag

Supabase bruger Postgres Row Level Security til at administrere dataadgang på databaseniveau, hvilket er grundlæggende for at sikre data [S1]. I et Next.js-miljø skal udviklere oprette en Supabase-klient, der korrekt håndterer cookies og sessioner for at opretholde sikkerheden under rendering af [S2] på serversiden. Sårbarheder opstår typisk, når:

  • Tabeller oprettes uden RLS aktiveret, hvilket gør dem tilgængelige via den offentlige anon-nøgle [S1].
  • Supabase-klienten er forkert konfigureret i Next.js, idet den ikke kan sende brugergodkendelsestokens korrekt til databasen [S2].
  • Udviklere bruger ved et uheld nøglen service_role i kode på klientsiden, som omgår alle RLS-politikker [S1].

Konkrete rettelser

  • Aktiver RLS: Sørg for, at Row Level Security er aktiveret for hver tabel i din Supabase-database [S1].
  • Definer politikker: Opret specifikke Postgres-politikker for SELECT, INSERT, UPDATE og DELETE-operationer for at begrænse adgangen baseret på brugerens UID ZXCVZVIXBETOKEN.
  • Brug SSR-klienter: Implementer @supabase/ssr-pakken for at skabe klienter i Next.js, der korrekt administrerer server-side-godkendelse og sessionsvedholdenhed [S2].

Hvordan FixVibe tester for det

FixVibe dækker allerede dette gennem implementerede app- og repo-tjek. Det passive baas.supabase-rls-modul opdager Supabase URL- og anon-nøglepar fra JavaScript-bundter med samme oprindelse, beder PostgREST om offentlige tabelmetadata og udfører begrænsede skrivebeskyttede valg for at bekræfte anonym dataeksponering uden at mutere kundedata. Repo-scanninger kører også repo.supabase.missing-rls for at markere SQL-migreringer, der skaber offentlige tabeller uden ENABLE ROW LEVEL SECURITY, og hemmelige scanninger leder efter eksponering af servicerollenøgler, før den når browseren.