VibeGuard

Detection rules

9 rules ship today. This page is generated from the running catalog, so it is exhaustive — anything not listed here is not detected.

Catalog rules

Run against a connected project, reading pg_catalog and storage.buckets metadata only.

criticalRow Level Security disabledaccess-control

Any table reachable through PostgREST with RLS disabled is world-readable to anyone holding the anon key — which ships in your client bundle and is public by design. Every row is exposed.

RLS_DISABLED
highRLS enabled but no policiesaccess-control

With RLS on and zero policies, Postgres denies every row to non-owner roles. Data is safe but the table is functionally unreachable from the client, which usually means the setup was left half-finished.

RLS_NO_POLICIES
criticalPolicy always evaluates to trueaccess-control

A permissive policy whose expression is a constant true grants the whole table to every role it targets. RLS is enabled, so the dashboard reports the table as protected while it is wide open.

RLS_TAUTOLOGY
highWrite policy without WITH CHECKaccess-control

INSERT and UPDATE policies need a WITH CHECK clause to constrain the rows being written. Without one an attacker can write rows attributed to other users, even when reads are correctly restricted.

MISSING_WITH_CHECK
mediumRLS predicate column is not indexedperformance

RLS predicates run on every candidate row. When the predicate column has no index, each query degrades into a sequential scan — the single most common cause of Supabase bills growing faster than traffic.

UNINDEXED_RLS_PREDICATE
highStorage bucket is publicexposure

Objects in a public bucket are served to anyone with the URL, with no auth check. Object paths are frequently guessable, so "public" means "published" for anything stored there.

PUBLIC_BUCKET_EXPOSURE
mediumauth.uid() not wrapped in a subqueryperformance

A bare auth.uid() inside a policy is re-evaluated once per candidate row. Wrapping it as (SELECT auth.uid()) lets the planner hoist it into an InitPlan evaluated once per statement — routinely a 10-100x speedup on large tables, with identical semantics.

RLS_UNWRAPPED_AUTH_CALL

Probe rules

Run against a public URL with no credential, using the same access an attacker has.

Not covered

SECURITY DEFINER views, anon-callable SECURITY DEFINER functions and function search_path mutability are not analysed. The Supabase Security Advisor covers those; the queries to check them by hand are documented.