Cross-tenant read proven: user A can read user B's bookings
public.bookings (RLS policy "read own bookings")
- Evidence
- On the stood-up stack, signed in as tenant A, a request to /rest/v1/bookings returned tenant B's rows. The policy uses USING (auth.role() = 'authenticated') — it checks that you're logged in, not that the row is yours.
- Impact
- Any signed-in customer can read every other customer's bookings, including names, dates, and contact details. This is a direct data-exposure incident, not a theoretical one.
- Fix
- Rewrite the policy to scope by owner: USING (user_id = auth.uid()). Re-run the cross-tenant matrix to confirm the boundary now holds.