FixVibe
Covered by FixVibehigh

Nieautoryzowany dostęp do danych poprzez brak zabezpieczeń na poziomie wiersza Supabase (RLS)

W aplikacjach wspieranych przez Supabase bezpieczeństwo danych opiera się na zabezpieczeniach na poziomie wiersza (RLS). Jeśli RLS nie jest jawnie włączony i skonfigurowany z zasadami, każdy użytkownik posiadający publiczny klucz anonimowy może czytać, aktualizować lub usuwać dane w całej bazie danych. Jest to szczególnie istotne w środowiskach Next.js, gdzie klient Supabase jest często inicjowany przy użyciu publicznego klucza API.

CWE-284

Wpływ

Brak implementacji zabezpieczeń na poziomie wiersza (RLS) umożliwia nieuwierzytelnionym atakującym wysyłanie zapytań o dane z bazy danych Supabase, gdy tabele publiczne są ujawniane przez inną granicę [S1]. Ponieważ aplikacje Next.js zazwyczaj ujawniają klucz Supabase anon w kodzie po stronie klienta, osoba atakująca może użyć tego klucza do wykonania bezpośrednich wywołań REST API do bazy danych, omijając zamierzoną logikę aplikacji i uzyskując dostęp do poufnych informacji użytkownika [S2].

Główna przyczyna

Domyślnie tabele Postgres w Supabase wymagają jawnej aktywacji zabezpieczeń na poziomie wiersza, aby uniemożliwić publiczny dostęp [S1]. Gdy programista utworzy tabelę, ale zapomni włączyć RLS lub nie zdefiniuje restrykcyjnych zasad, baza danych może udostępnić dane każdemu, kto posiada klucz anon projektu [S1]. W aplikacjach Next.js renderowanie po stronie serwera i pobieranie po stronie klienta również wymagają starannej konfiguracji klienta Supabase, aby kontekst uwierzytelnionego użytkownika dotarł do warstwy bazy danych [S2].

Poprawki betonu

  • Włącz RLS: Wykonaj ALTER TABLE "your_table_name" ENABLE ROW LEVEL SECURITY; dla każdej publicznej tabeli przechowującej dane aplikacji [S1].
  • Określ zasady: Utwórz określone zasady ograniczające dostęp w oparciu o status uwierzytelnienia użytkownika, np. CREATE POLICY "Users can see their own data" ON your_table_name FOR SELECT USING (auth.uid() = user_id); [S1].
  • Bezpieczni klienci po stronie serwera: W przypadku korzystania z Next.js klienci z rolą usługi powinni działać tylko na serwerze i nadal stosować filtry własności przed zwróceniem danych użytkownikom [S2].

Jak FixVibe to testuje

FixVibe już uruchamia kontrolę Supabase RLS w trybie tylko do odczytu poprzez baas.supabase-rls. Skaner wykrywa adres URL projektu Supabase i publiczny klucz anonimowy z pakietów JavaScript tego samego pochodzenia, pyta PostgREST o metadane tabeli publicznej i podejmuje ograniczone selekcje tylko do odczytu, aby potwierdzić, czy dane są ujawniane bez sesji użytkownika. Nie wstawia, nie aktualizuje, nie usuwa ani nie używa poświadczeń roli usługi. Skanowanie repozytorium może również wykryć to wcześniej poprzez repo.supabase.missing-rls, który flaguje migracje SQL tworzące tabele publiczne bez ENABLE ROW LEVEL SECURITY.