FixVibe
Covered by FixVibehigh

Accés a dades no autoritzat mitjançant la seguretat del nivell de fila Supabase (RLS)

A les aplicacions recolzades per Supabase, la seguretat de les dades es basa en la seguretat a nivell de fila (RLS). Si RLS no està activat i configurat explícitament amb polítiques, qualsevol usuari amb la clau anònima pública pot llegir, actualitzar o suprimir dades de tota la base de dades. Això és especialment crític en entorns Next.js on el client Supabase sovint s'inicia amb una clau pública API.

CWE-284

Impacte

La manca d'implementació de la seguretat a nivell de fila (RLS) permet als atacants no autenticats consultar dades d'una base de dades Supabase quan les taules públiques estan exposades a través del límit anon [S1]. Com que les aplicacions Next.js normalment exposen la clau Supabase anon al codi del costat del client, un atacant pot utilitzar aquesta clau per fer REST directe API trucades a la base de dades sensible, obviant la informació sensible de l'usuari i accedint a la lògica de l'usuari. [S2].

Causa arrel

De manera predeterminada, les taules de Postgres a Supabase requereixen l'activació explícita de Row Level Security per evitar l'accés públic [S1]. Quan un desenvolupador crea una taula però s'oblida d'habilitar RLS o no defineix polítiques restrictives, la base de dades pot exposar dades a qualsevol persona que tingui la clau anon [S1] del projecte. A les aplicacions Next.js, la representació del servidor i la recuperació del costat del client també requereixen una configuració acurada del client Supabase perquè el context d'usuari autenticat arribi a la capa de base de dades [S2].

Correccions concretes

  • Activeu RLS: Executeu ALTER TABLE "your_table_name" ENABLE ROW LEVEL SECURITY; per a cada taula pública que emmagatzemi dades de l'aplicació [S1].
  • Definiu polítiques: creeu polítiques específiques que restringeixin l'accés en funció de l'estat d'autenticació de l'usuari, com ara CREATE POLICY "Users can see their own data" ON your_table_name FOR SELECT USING (auth.uid() = user_id); [S1].
  • Clients del servidor segurs: quan utilitzeu Next.js, mantingueu els clients amb funció de servei només per al servidor i encara apliqueu filtres de propietat abans de tornar les dades als usuaris [S2].

Com ho prova FixVibe

FixVibe ja executa una comprovació de només lectura Supabase RLS mitjançant baas.supabase-rls. L'escàner descobreix l'URL del projecte Supabase i la clau pública anònima dels paquets de JavaScript del mateix origen, demana a PostgREST metadades de la taula pública i intenta seleccionar de només lectura limitada per confirmar si les dades s'exposen sense una sessió d'usuari. No insereix, actualitza, suprimeix ni utilitza credencials de funció de servei. Les exploracions de repo també poden detectar-ho abans mitjançant repo.supabase.missing-rls, que marca les migracions SQL que creen taules públiques sense ENABLE ROW LEVEL SECURITY.