FixVibe
Covered by FixVibehigh

Protezione di Next.js + Supabase: prevenzione dei bypass della sicurezza a livello di riga (RLS)

Le applicazioni create con Next.js e Supabase spesso si affidano alla sicurezza a livello di riga (RLS) per proteggere i dati. La mancata abilitazione di RLS o la configurazione errata del client Supabase possono portare all'esposizione completa del database, consentendo a utenti non autorizzati di leggere o modificare record sensibili.

CWE-284

Impatto

Gli aggressori possono ignorare la logica dell'applicazione per leggere, aggiornare o eliminare i record nel database se la sicurezza a livello di riga (RLS) non è applicata correttamente [S1]. Ciò spesso comporta l'esposizione di informazioni di identificazione personale (PII) o dati sensibili dell'applicazione agli utenti che hanno accesso solo alla chiave pubblica anonima API.

Causa principale

Supabase utilizza Postgres Row Level Security per gestire l'accesso ai dati a livello di database, che è fondamentale per proteggere i dati [S1]. In un ambiente Next.js, gli sviluppatori devono creare un client Supabase che gestisca correttamente cookie e sessioni per mantenere la sicurezza durante il rendering lato server [S2]. Le vulnerabilità in genere sorgono quando:

  • Le tabelle vengono create senza RLS abilitato, rendendole accessibili tramite la chiave anon pubblica [S1].
  • Il client Supabase è configurato in modo errato in Next.js e non riesce a passare correttamente i token di autenticazione dell'utente al database [S2].
  • Gli sviluppatori utilizzano accidentalmente la chiave service_role nel codice lato client, che ignora tutte le policy RLS [S1].

Correzioni concrete

  • Abilita RLS: assicurati che la sicurezza a livello di riga sia abilitata per ogni tabella nel database Supabase [S1].
  • Definire le policy: Crea policy Postgres specifiche per le operazioni SELECT, INSERT, UPDATE e DELETE per limitare l'accesso in base all'UID [S1].
  • Utilizza client SSR: Implementa il pacchetto @supabase/ssr per creare client in Next.js che gestiscono correttamente l'autenticazione lato server e la persistenza della sessione [S2].

Come lo esegue il test FixVibe

FixVibe copre già questo problema tramite controlli delle app distribuite e dei repository. Il modulo passivo baas.supabase-rls rileva l'URL Supabase e le coppie di chiavi diverse dai bundle JavaScript della stessa origine, richiede a PostgREST i metadati della tabella pubblica ed esegue selezioni limitate di sola lettura per confermare l'esposizione di dati anonimi senza modificare i dati dei clienti. Le scansioni del repository eseguono anche repo.supabase.missing-rls per contrassegnare le migrazioni SQL che creano tabelle pubbliche senza ENABLE ROW LEVEL SECURITY e le scansioni segrete cercano l'esposizione della chiave del ruolo di servizio prima che raggiunga il browser.