Hire Lovable Xperts
Security

The Lovable Security Breach, Explained: Are You Exposed?

The 'Lovable breach' refers to CVE-2025-48757, a critical flaw (NVD base score 9.3) where Lovable-generated apps shipped without proper Row-Level Security, letting remote, unauthenticated attackers read or write arbitrary database tables. It is not one hacked company — it is a structural class of exposure affecting any Lovable app whose Supabase tables lack correct RLS policies. Here is how to tell if yours is one of them, and what to do today.

By Hire Lovable Xperts · Last verified: 2026-07-19

What actually is the Lovable security breach?

The 'Lovable breach' is CVE-2025-48757, a critical vulnerability (NVD base score 9.3) describing an insufficient Row-Level Security policy in Lovable-generated sites that lets remote, unauthenticated attackers read or write arbitrary database tables. It is not a single hacked company. It is a structural class of exposure: apps built through 2025-04-15 could ship with their Supabase database effectively open to the internet.

The flaw is catalogued under CWE-863 (Incorrect Authorization) and was published on 29 May 2025. Lovable disputes the CVE, arguing that customers are responsible for securing their own application data. Both things can be true at once: the platform generated the exposure by default, and closing it is still the app owner's job. That is exactly why this page exists — to help you check and fix your own app.

Because the fix lives inside your own Supabase project, publicity around the CVE does not retroactively protect any app. Every affected project has to be checked and corrected individually — there is no platform-side switch that adds the right policies to your specific tables.

Related: How to lock down cross-account data access

How does the RLS data-exposure vulnerability work?

Lovable apps talk to the Supabase database directly from the browser using a public 'anon' key, and rely exclusively on Row-Level Security to decide what each request may see. When RLS is missing — or enabled with a policy that does not filter by the logged-in user — an attacker can call the Supabase REST API directly, skip your UI entirely, and read or write whole tables.

The anon key is meant to be public; it ships in every client bundle by design. Its safety depends entirely on correct RLS. Security researcher Matt Palmer, who reported the CVE, describes Lovable apps as making 'direct REST API calls against the database from the client, using a public and unprivileged anon key, while relying exclusively on RLS.' The moment a policy is absent or too permissive, the data behind it is public.

This is why the exposure is invisible in the editor. The preview runs as a single user, so a missing policy never returns someone else's rows. The hole only becomes observable once a second real account — or an attacker with a script — queries the REST API directly.

Is my Lovable app exposed?

You are potentially exposed if your app was built with Lovable, stores user data in Supabase, and you never explicitly verified Row-Level Security in the Supabase dashboard. The only way to know for certain is to check RLS status and policy conditions directly — a green preview and a working login prove nothing about database-level access control.

  1. Open your Supabase project's SQL Editor (reach it from the Lovable Supabase integration).
  2. List RLS status for every table: SELECT relname AS table_name, relrowsecurity AS rls_enabled FROM pg_class WHERE relkind = 'r' AND relnamespace = 'public'::regnamespace ORDER BY relname;
  3. Any user-data table showing rls_enabled = false has no row filtering at all — treat its contents as already public.
  4. For tables where RLS is on, read the policy conditions: SELECT tablename, policyname, cmd, qual, with_check FROM pg_policies WHERE schemaname = 'public';
  5. If any policy's qual shows true (rather than an auth.uid() comparison), that table is exposed despite RLS being enabled.
Exposure indicators — is your Lovable app affected?
SignalWhat it meansExposure level
Built before 2025-04-15, RLS never checkedMatches the CVE-2025-48757 windowHigh — verify immediately
rls_enabled = false on a user-data tableNo row filtering; anon key reads everythingCritical — data is public
RLS on, but policy qual = truePermissive policy; every user sees all rowsCritical — data is public
Only SELECT scoped, writes left openUsers can edit or delete others' rows via the APIHigh — data integrity risk
auth.uid() = user_id on all four commandsCorrectly scoped per ownerLow — verify with two accounts

Related: RLS is on but users still see each other's data

What should I do right now if I'm exposed?

Treat an exposed table as a live incident, not a backlog item. The priority order is: stop new sensitive data from being written to the open table, enable RLS with correct owner-scoped policies, then verify with two separate accounts. If regulated data — payments, health, personal identifiers — was readable, document what was exposed and for how long, because that determines your disclosure obligations.

  1. Contain: if the table holds sensitive data and you cannot fix it within minutes, take the app offline or block writes rather than leave it collecting more exposed records.
  2. Enable RLS: ALTER TABLE public.your_table ENABLE ROW LEVEL SECURITY; (this default-denies until you add policies).
  3. Add owner-scoped policies for SELECT, INSERT, UPDATE, and DELETE using auth.uid() = user_id — never USING (true).
  4. Rotate any secret that may have been reachable, and assume the anon key's data was public for the entire exposure window.
  5. Verify adversarially: sign in as user A and try to fetch a row you know belongs to user B by ID; a correct policy returns nothing.
  6. Assess disclosure: if real user data was exposed in production, record the affected tables and time window to inform any breach-notification duty.
A policy that makes the data reappear is not the same as a policy that is secure. If enabling RLS empties a view and you 'fix' it with USING (true), you have reopened the hole. Scope every policy to auth.uid() instead.

Related: Step-by-step RLS lockdown · Move exposed keys into edge functions

Did Lovable fix the breach, or is it still my responsibility?

Both. Lovable added a Security Scan that flags tables with RLS disabled and has improved its scaffolding — but the CVE is disputed by the vendor precisely because securing each app's data remains the owner's responsibility. No platform-side change can retroactively add the correct policies to your specific tables; that work happens in your Supabase project, and only you can confirm it is done.

There is an important limit to the built-in scan, documented by the CVE reporter: it helps ensure RLS policies are enabled and notifies you when they are not, but 'doesn't necessarily indicate if they are sufficient.' A table can pass the scan and still be public if its policy is permissive. That nuance is common enough that we cover it in a dedicated guide.

Related: RLS is on but users still see each other's data

When should I get a professional breach response or audit?

Bring in help immediately if sensitive data was readable in production, if you are unsure how long a table was exposed, or if multiple tables and storage buckets are involved. A breach-response engagement contains the exposure, quantifies what was reachable, and produces the written timeline you need for user or regulator notification; a security audit then confirms every remaining table, key, and policy is closed.

Self-fixing is reasonable for a small app with one or two clearly owned tables and no regulated data, where you can run the verification above with two accounts. Escalate when the blast radius is unclear or the data is sensitive — the cost of a single missed exposed table far exceeds the cost of a review.

Related: Lovable Breach Response service · Lovable Security Audit service · Book a free security call

Frequently asked questions

What is the Lovable breach / CVE-2025-48757?
The 'Lovable breach' refers to CVE-2025-48757, a critical vulnerability (NVD CVSS 9.3) describing an insufficient Row-Level Security policy in Lovable-generated sites. It let remote, unauthenticated attackers read or write arbitrary database tables. It is not a single hacked company — it is a class of exposure affecting any Lovable app whose Supabase tables lack correct RLS policies. It was published on 29 May 2025 under CWE-863, Incorrect Authorization.
Was my Lovable app affected by the breach?
Possibly. The CVE covers Lovable through 2025-04-15, but the underlying pattern — apps that query Supabase from the browser with the public anon key and rely on RLS — is not limited to one version. Check directly: list RLS status with a pg_class query and read policy conditions with pg_policies. Any user-data table with RLS off, or a policy whose condition is simply true, is exposed regardless of when the app was built.
Can attackers really read my data without logging in?
Yes, if RLS is missing or permissive. Lovable apps make direct REST API calls to Supabase using a public anon key that ships in the browser bundle. Row-Level Security is the only control deciding what that key can read. With no policy — or a USING (true) policy — an attacker can call the Supabase REST endpoint directly, bypass your UI, and read or write whole tables without authenticating.
Did Lovable patch the vulnerability?
Lovable disputes the CVE, arguing that securing application data is the customer's responsibility, and it has added a Security Scan that flags tables with RLS disabled. But no platform-side change can retroactively add correct policies to your specific tables. The fix lives in your Supabase project, and only you can confirm each table has owner-scoped RLS policies. Publicity about the CVE does not protect any individual app.
What data was exposed in the Lovable breach?
That depends entirely on the app. The vulnerability describes the mechanism — arbitrary table reads and writes — not a fixed list of stolen records. For a to-do app the impact is minor; for an app storing payment details, health data, or private messages, an exposed table is a reportable incident. To know what was reachable in your app, check which tables had RLS off or a permissive policy, and what those tables contain.
How do I check if my Lovable app is still exposed?
Run two SQL queries in the Supabase SQL Editor. First, SELECT relname, relrowsecurity FROM pg_class WHERE relkind = 'r' AND relnamespace = 'public'::regnamespace — any user-data table with relrowsecurity = false is exposed. Second, query pg_policies and read the qual column; if it shows true instead of an auth.uid() comparison, that table is public even though RLS is technically enabled.
Do I need to notify users if my app was exposed?
If real user data was readable in production, likely yes — but the specifics depend on your jurisdiction and the data type. Personal, health, or payment data usually triggers a notification duty. Before deciding, document which tables were exposed and for how long; that timeline determines your obligations. If you are unsure, a breach-response engagement can quantify what was reachable and produce the written record regulators expect.

App down or leaking data? Get an expert on it within 24–48h.

Book a free 30-minute audit call. We'll diagnose what's wrong and tell you exactly what it costs to fix.

Get emergency help