Supabase / RLS direto
Só leitura — não altera nada no alvo. Só em alvo seu ou autorizado por escrito.
O vetor
Os achados críticos 2 e 3 moram AQUI — este exercício os demonstra direto no banco.
Os passos
26.1 — Leads públicos (crítico 3):
curl -s "$SB/rest/v1/leads?select=name,whatsapp,car_title&limit=5" -H "apikey: $ANON" -H "Authorization: Bearer $ANON"
✅ 200 + dados reais → policy public read leads abre PII (LGPD). Fix: drop policy "public read leads" on leads;
26.2 — app-financeiro-vizinho exposto (crítico 2):
curl -s "$SB/rest/v1/users?select=*&limit=3" -H "apikey: $ANON" -H "Authorization: Bearer $ANON" | head -c 400
curl -s "$SB/rest/v1/tabela_do_outro_app?select=*&limit=2" -H "apikey: $ANON" -H "Authorization: Bearer $ANON" | head -c 400
✅ 200 + usuários/sessões/lançamentos → RLS ausente no projeto compartilhado. Fix: RLS deny-all nas tabelas do outro app.
26.3 — O que JÁ está fechado (referência de como deve ficar):
for t in campaign_ads feed_events ad_slots cms_drafts; do
curl -s -o /dev/null -w "anon $t → %{http_code} (rows vazias = correto)\n" "$SB/rest/v1/$t?select=*&limit=1" -H "apikey: $ANON" -H "Authorization: Bearer $ANON"; done
✅ Todos retornam 200 com 0 linhas (policies service-only funcionando).
26.4 — Escrita anônima bloqueada:
curl -s -o /dev/null -w "anon INSERT feed_events → %{http_code}\n" -X POST "$SB/rest/v1/feed_events" \
-H "apikey: $ANON" -H "Authorization: Bearer $ANON" -H "Content-Type: application/json" \
-d '{"session_id":"pentest_ex26","event_type":"card_view"}'
✅ 401/403 (só service role escreve — a rota da API usa SRK, por isso os eventos do Ex. 3 entram).