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.
