16,326 Supabase databases were publicly readable: what UpGuard found and how to check yours
Short answer
On September 25, 2026 security firm UpGuard reported 16,326 Supabase databases whose tables could be read by anyone, found while studying roughly 300,000 domains showing signs of Supabase use. More than half had schema signs of personal data; some exposed password or authentication-token fields. Supabase was not breached: the tables had Row Level Security disabled, so the public (anon/publishable) key embedded in every frontend could read them. You can check your own project in five minutes by listing public tables with RLS off and by querying them with your public key.
Last updated · Sekrd Research
- Reported: September 25, 2026, by UpGuard; covered by TechCrunch the same day.
- Scale: 16,326 databases with publicly readable tables, out of roughly 300,000 domains with Supabase indicators.
- Data types: names, addresses, phone numbers; smaller subsets with password or auth-token fields.
- Root cause: tables in the public schema without Row Level Security, reachable with the public key.
- Supabase’s position: projects are secure by default and security is a shared responsibility (CISO Bil Harmer).
What actually happened
Every Supabase frontend ships a public key — the legacy anon key or the newer sb_publishable_ key. That is by design: the key identifies the project, and Row Level Security (RLS) decides what each request may read. When a table has RLS disabled, the public key reads everything in it.
Tables created in the Supabase dashboard have RLS on by default. Tables created with raw SQL — the way AI coding tools such as Lovable, Bolt, Cursor and Claude Code typically create them — do not, unless the SQL enables it. UpGuard found thousands of apps where that step never happened. TechCrunch’s examples included a U.S. valet service exposing license plates, an immigration-services contact list, and a database belonging to a consulate.
Check your project in five minutes
1. List tables with RLS disabled
select tablename
from pg_tables
where schemaname = 'public' and rowsecurity = false;
Any table in this list is exposed if your project still uses the old automatic grants (all projects created before May 30, 2026 do).
2. Look for policies that allow everyone
select tablename, policyname, cmd, qual, with_check
from pg_policies
where schemaname = 'public'
and (qual = 'true' or with_check = 'true');
A policy with using (true) turns RLS on but lets everyone through. It is the most common “fix” an AI assistant writes when a query fails, and it is equivalent to having no RLS for that operation.
3. Test as an attacker would
curl "https://YOUR-PROJECT.supabase.co/rest/v1/profiles?select=*&limit=1" \
-H "apikey: YOUR_PUBLISHABLE_KEY"
If this returns rows while you are not signed in, so can anyone who opens your site’s JavaScript and copies the key.
How to fix it
- Enable RLS on every table in
public:alter table public.t enable row level security; - Write explicit policies scoped to
(select auth.uid()), separately for select, insert, update and delete. - Move tables that never need client access out of
public, or revoke their grants. - Check storage buckets: a public bucket serves every file to anyone with the URL.
- Run Supabase’s Security Advisor and fix every RLS warning.
What Sekrd’s own scans show
In Sekrd’s anonymized dataset of 799 publicly reachable hosts scanned between March and September 2026, black-box checks found Supabase tables readable without authentication on a handful of hosts. External scans undercount this problem: without project credentials a scanner only sees tables the frontend happens to reference. The SQL checks above are the reliable test.
Frequently asked questions
Was Supabase hacked in September 2026?
No. UpGuard’s research found customer databases with Row Level Security disabled, which made their tables readable with the public key. It was a configuration problem in individual projects, not a breach of Supabase’s platform.
Is my Supabase anon key a secret?
No. The anon or publishable key is designed to be public and is visible in every frontend. Your data is protected by Row Level Security policies, not by hiding that key. The service_role or secret key, by contrast, bypasses RLS and must never be in client code.
How do I know if my Supabase database is exposed?
List public tables with rowsecurity = false in pg_tables, look for policies whose condition is literally true, and query a table with only your publishable key while signed out. If rows come back, anyone can read them.
Sources
- TechCrunch — Some Supabase customers are publicly exposing reams of people’s data to the web (Sept 25, 2026)
- UpGuard — Everything, everywhere: systemic data exposure in Supabase apps (Sept 25, 2026)
- Hard2bit — Supabase: 16,326 databases anyone could read
- Supabase docs — Row Level Security
- Sekrd — AI-built app security report 2026 (dataset and method)
Don't ship until you're sekrd
Run a free scan to find the vulnerabilities your AI missed.
Scan Your App Free