← ClaudeAtlas

supabaselisted

Supabase / PostgREST Row-Level-Security playbook — pull the anon (or leaked service_role) key out of the frontend JS, map tables from the auto-generated OpenAPI spec, test anonymous RLS READ disclosures (PII/secret leaks), and anonymous RLS WRITE abuse (insert/update/delete — e.g. forging "certificate"/verification/entitlement rows the app trusts). Use when the target's frontend talks to *.supabase.co, ships an anon JWT, or you see /rest/v1/, /auth/v1/, /storage/v1/ requests.
Wulan234/agent · ★ 0 · API & Backend · score 75
Install: claude install-skill Wulan234/agent
# Supabase RLS playbook Supabase exposes PostgreSQL directly to the browser through **PostgREST** (`/rest/v1/`), **GoTrue** auth (`/auth/v1/`), and **Storage** (`/storage/v1/`). The browser authenticates with a public **anon** JWT, and the *only* thing standing between an anonymous attacker and the database is **Row-Level Security (RLS)** policies. Misconfigured or missing RLS is the entire bug class: - **RLS disclosure** — `SELECT` on a table returns rows it shouldn't (PII, tokens, other tenants). - **RLS write abuse** — `INSERT` / `UPDATE` / `DELETE` succeeds anonymously, so you can **forge records the application trusts** (a "certificate" / verification / license / entitlement row, an admin flag, a balance, someone else's data). > Authorized targets only. Treat the database as production: read a single marker row to prove > disclosure, write ONE clearly-labelled marker row to prove write, then clean up. Never dump > whole tables of real PII, never mass-modify, never `DELETE` real rows. The PoC is "I read/wrote > one row I shouldn't be able to", not "I exfiltrated the customer base". Execution rule: substitute the real Supabase project ref, anon key, table, and marker IDs before running commands. Never write literal placeholders such as `<ref>`, `<table>`, `<col>`, or `<returned-id>` to files; if a value is unknown, discover it first or ask once. --- ## 0. Find the project URL + anon key in the frontend JS The project ref and anon key are *meant* to be public — t