fix(security): hardening de grants anon + rate-limit no reset de senha (auditoria MCP rodada 2)#299
Conversation
…d via MCP Varredura do sistema em produção (promogifts.com.br) via navegador MCP, captura de rede e advisors do Supabase. Achado principal: dupla codificação UTF-8 (Latin-1) corrompendo texto visível em login, simulador de preços, Kit Maker e formulários admin (500 ocorrências). Reversão seletiva preserva caracteres legítimos; sem mudança estrutural de código. Relatório completo em audit/AUDITORIA_FRONTEND_MCP_2026-05-24.md (backend RLS, funções SECURITY DEFINER expostas a anon, Kit Maker em mock, price-freshness). https://claude.ai/code/session_01HjiGVkF3Df9GiFjDbfxDYn
…ed e adiciona rate-limit no reset de senha Rodada 2 da auditoria MCP. Verificação read-only confirmou RLS ativa em todas as 280 tabelas (0 desabilitadas) e que apenas 18 das 309 políticas anon/public são irrestritas — todas de dados não sensíveis. Sem vazamento ativo. Correções seguras: - REVOKE EXECUTE em cleanup_expired_webhook_request_nonces() e get_public_schema_signatures() para anon/authenticated (não usadas pelo cliente; postgres/service_role mantêm acesso p/ cron e edge functions). - Trigger BEFORE INSERT (SECURITY DEFINER) limita reset de senha a 3/e-mail/60min, fechando o abuso da política de INSERT irrestrita sem removê-la. SQL validado em transação com ROLLBACK. Relatório atualizado com a reclassificação dos demais achados (price-freshness e widget = não-defeitos; Kit Maker mock = decisão de produto). https://claude.ai/code/session_01HjiGVkF3Df9GiFjDbfxDYn
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
|
Warning Review limit reached
Your plan includes 5 reviews of capacity. Refill in 27 minutes and 40 seconds. Your organization has run out of usage credits. Purchase more in the billing tab. ⌛ How to resolve this issue?After more review capacity refills, a review can be triggered using the We recommend that you space out your commits to avoid hitting the rate limit. 🚦 How do rate limits work?CodeRabbit enforces hourly rate limits for each developer per organization. Our paid plans have higher rate limits than trial, open-source, and free plans. In all cases, review capacity refills continuously over time. Please see our FAQ for further information. ℹ️ Review info⚙️ Run configurationConfiguration used: Path: .coderabbit.yaml Review profile: CHILL Plan: Pro Run ID: 📒 Files selected for processing (2)
✨ Finishing Touches🧪 Generate unit tests (beta)
Comment |
|
Updates to Preview Branch (claude/epic-faraday-GQILK) ↗︎
Tasks are run on every commit but only new migration files are pushed.
❌ Branch Error • Sun, 24 May 2026 21:09:38 UTC View logs for this Workflow Run ↗︎. |
|
You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard. |
There was a problem hiding this comment.
Pull request overview
Note
Copilot was unable to run its full agentic suite in this review.
Hardens Supabase security posture by removing public API access to internal SECURITY DEFINER functions and adding rate limiting to password reset requests, with accompanying audit documentation updates.
Changes:
- Revokes
EXECUTEfromanon/authenticatedon two internalpublicfunctions. - Adds a
SECURITY DEFINERtrigger function to rate-limit inserts intopassword_reset_requests. - Updates the audit report with a “Rodada 2” validation summary and the applied fixes.
Reviewed changes
Copilot reviewed 2 out of 2 changed files in this pull request and generated 4 comments.
| File | Description |
|---|---|
| supabase/migrations/20260524210000_harden_anon_grants_and_password_reset_rate_limit.sql | Revokes risky function execution grants and introduces a per-email password reset insert rate limit via trigger. |
| audit/AUDITORIA_FRONTEND_MCP_2026-05-24.md | Documents the second audit pass, validated RLS posture, and the migration applied. |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
| SELECT count(*) INTO recent_count | ||
| FROM public.password_reset_requests | ||
| WHERE lower(email) = lower(NEW.email) | ||
| AND requested_at > now() - make_interval(mins => window_minutes); | ||
|
|
||
| IF recent_count >= max_requests THEN | ||
| RAISE EXCEPTION 'Muitas solicitações de redefinição de senha. Tente novamente mais tarde.' | ||
| USING ERRCODE = 'check_violation'; | ||
| END IF; |
| SELECT count(*) INTO recent_count | ||
| FROM public.password_reset_requests | ||
| WHERE lower(email) = lower(NEW.email) | ||
| AND requested_at > now() - make_interval(mins => window_minutes); |
| AND requested_at > now() - make_interval(mins => window_minutes); | ||
|
|
||
| IF recent_count >= max_requests THEN | ||
| RAISE EXCEPTION 'Muitas solicitações de redefinição de senha. Tente novamente mais tarde.' |
| | Métrica | Valor | | ||
| |---|---| | ||
| | Tabelas `public` com **RLS desabilitada** | **0** | | ||
| | Tabelas `public` com RLS habilitada | 280 | | ||
| | Políticas para os papéis `anon`/`public` | 309 | | ||
| | Dessas, com expressão **irrestrita** (`USING/CHECK = true`) | **18** | |
Rodada 2 da auditoria de segurança via MCP
Segue #294 (mojibake, já mergeado). Esta PR aplica as correções de backend seguras e verificadas e documenta a reclassificação honesta dos demais achados.
Verificação read-only antes de agir
publiccom RLS desabilitadaanon/publicUSING/CHECK = true)→ Não há vazamento de dados ativo. Os 373 avisos
anon_table_exposedsão superfície de API mitigada por RLS. Revogação em massa de grants foi descartada (alto risco, ganho nulo).Corrigido (migration
20260524210000)REVOKE EXECUTEemcleanup_expired_webhook_request_nonces()eget_public_schema_signatures()paraanon+authenticated(não usadas pelo cliente;postgres/service_rolemantêm acesso → cron e edge functions intactos).BEFORE INSERT(SECURITY DEFINER) → máx. 3 solicitações/e-mail/60min empassword_reset_requests. Fecha o abuso da política de INSERT irrestrita sem removê-la.ROLLBACK(sem erros, sem persistir).Reclassificado após investigação (NÃO são defeitos — não alterados)
get_quote_token_by_valuepor anon = lookup por token-segredo do orçamento público (não é enumeração). Mantido.price-freshness.tscorreto; preços do catálogo genuinamente > 30 dias. Remédio = atualização de preços na origem (data ops), não código. Mexer no threshold só mascararia o sinal.Requer decisão de produto (não executável com segurança aqui)
MOCK_BOXES/MOCK_ITEMS→ conectar a dados reais é feature + fonte de dados a definir.get_advisors(performance).Test plan
supabase startaplica a migration sem errocleanup_*e edge functions seguem operando; reset de senha bloqueia após 3 tentativas/e-mail/horahttps://claude.ai/code/session_01HjiGVkF3Df9GiFjDbfxDYn
Generated by Claude Code
Summary by cubic
Hardened database access by revoking client execution of internal functions and adding a rate limit to password reset requests. Verified RLS on all public tables; no sensitive data exposure found.
EXECUTEoncleanup_expired_webhook_request_nonces()andget_public_schema_signatures()foranonandauthenticated;postgres/service_rolekeep access for cron/edge.BEFORE INSERTtrigger (SECURITY DEFINER) to limit password resets to 3 requests per email per 60 minutes inpassword_reset_requests.Written for commit 5303358. Summary will update on new commits. Review in cubic