Next.js + Supabase SaaS, pre-Series-A security review
Early-stage B2B SaaS. 8 engineers, seed-round funded. Customer data model involved multi-tenant isolation with RLS on every public-schema table. Next.js 15 on Vercel, Clerk for auth, Stripe for billing, Inngest for background jobs.
Four-week fixed-fee Supabase-focused security review, triggered by inbound due-diligence questionnaires from a lead investor for Series A.
- ›Row Level Security policy audit across all 14 tables in public schema
- ›SECURITY DEFINER RPC review for caller-controlled tenant IDs
- ›GraphQL Mutation surface enumeration + introspection control review
- ›Storage bucket policy audit for cross-tenant read / list exposure
- ›Realtime channel authorization (postgres_changes + broadcast)
- ›Next.js /api route handler CSRF, IDOR, mass-assignment probing
- ›Stripe webhook forgery + pre-auth billing portal enumeration
- ›Inngest signing-key enforcement on PUT/POST
- ›JS bundle grep for leaked service_role keys + secrets
- ›2 HIGH: SECURITY DEFINER RPC accepted caller-controlled account_id parameter → cross-tenant write
- ›2 HIGH: /api/me accepted DELETE without re-auth or CSRF defense → account wipe in a single HTTP request
- ›1 MEDIUM: Stripe portal session generation allowed on accounts without active subscription
- ›6 LOW: GraphQL introspection exposed full schema to authenticated role; PostgREST schema-hint oracle; stack trace in /api error response
- ›What they did well: RLS on accounts UPDATE was correctly locked to column-granular; Stripe webhook signature enforced; Inngest signing key enforced
All findings fixed within 14 days. Retest performed. Report accompanied their Series A diligence package. Series A closed on schedule.
