SupaBased

Your Supabase Database Is Probably Wide Open

We scanned 5,371 Supabase-powered sites. We found 547 exposed databases.

Scanner Active
--
Targets Found
--
Credentials
--
Critical
--
Service Role Keys

The Default Is Dangerous

Supabase tells developers the anon key is "safe to use in a browser." It is — if you configure Row Level Security. But after scanning over 5,000 sites, we can confirm: almost nobody does.

RLS is disabled by default. The REST API is enabled by default. The anon key is designed to be public. The result is a database that is wide open by default and secure only by opt-in.

Every Supabase project exposes a PostgREST API at a predictable URL. With the anon key — which is embedded in every frontend bundle — anyone can query every table in the public schema unless Row Level Security policies explicitly prevent it.

This is not a bug in Supabase's code. It is a systemic design flaw in how security is communicated, defaulted, and enforced. The documentation says "enable RLS." The dashboard warns you. But the path of least resistance — the one every tutorial follows, the one every hackathon project ships — is the insecure one.

What We Found

Targets Scanned
--
Credentials Extracted
--
Unique Projects
--
Critical Severity
--
High Severity
--
Service Role Keys
--
Tables with PII
--
Storage Buckets Exposed
--
Largest Single DB
--
Waiting for data...

How to Know If You're Exposed

If you use Supabase and haven't explicitly enabled RLS on every table in your public schema, you are likely affected.

Quick test: Open your browser DevTools, go to the Network tab, and look for requests to supabase.co/rest/v1/. The apikey parameter is your anon key. Now try: curl "https://YOUR-PROJECT.supabase.co/rest/v1/YOUR-TABLE?select=*" -H "apikey: YOUR-ANON-KEY" -H "Authorization: Bearer YOUR-ANON-KEY" — if it returns data, RLS is not enabled on that table.

What Exposure Looks Like

No companies are named. Disclosure is in progress. These are real findings from real production applications.

Critical 7 service_role keys found in client-side HTML — granting full database admin access, including the ability to read, write, and delete any row in any table, bypass all RLS policies, and access auth.users directly.
Critical A mental health platform: 91 tables exposed — including AI-generated therapy chat sessions, billing records, insurance information, and therapist notes. Full read access with the public anon key.
Critical An e-signature platform: access tokens exposed — allowing retrieval of signed documents, signer identities, and the ability to forge document completion status.
Critical A financial services company: DELETE access on the users table — any anonymous user could delete all customer accounts. No authentication required.
High A school system: plaintext passwords, phone numbers, PINs — student and parent contact information, login credentials stored in cleartext, and administrative access codes all readable via the public API.

What Should Supabase Do

  1. 1 Enable RLS by default. Every new table should have Row Level Security enabled at creation. Developers who want to disable it can opt out explicitly. The current default puts every new developer one tutorial away from a data breach.
  2. 2 Detect service_role keys in browser contexts. If a service_role key is sent from a browser User-Agent or a non-server IP, flag it immediately. This is always a misconfiguration and should trigger an alert.
  3. 3 Add a security dashboard. Show developers a real-time view of which tables have RLS disabled, which have no policies, and which are accessible to the anon role. Make the insecure state visible and impossible to ignore.
  4. 4 Rate limit the OpenAPI spec endpoint. The /rest/v1/ endpoint returns a full schema description. This makes automated scanning trivial. Apply rate limiting and consider requiring authentication for schema introspection.