
Auditando a Segurança do MarketNow: Um Relato Aberto
Lançamos o MarketNow há 2 semanas. Depois, fizemos um teste de penetração. Este é o relatório honesto do que encontramos, o que corrigimos e o que ainda está pendente.
Por que fizemos isso
O MarketNow lida com dinheiro real — pagamentos em USDC na Base para habilidades de agentes de IA. Antes de promovê-lo amplamente, queríamos saber: é realmente seguro?
Realizamos 4 auditorias paralelas:
- Pentest de segurança — vulnerabilidades prontas para exploração
- Teste de carga de desempenho — usuários simultâneos
- Auditoria funcional/i18n — traduções e UX
- Auditoria de SEO — descobribilidade
Descobertas CRÍTICAS (4) — todas corrigidas
C1: Falha silenciosa no gasto do mandato
O que: Quando um agente comprou uma habilidade, chamamos recordMandateSpend() para debitar o mandato. Mas a chamada não incluía o segredo interno, então foi rejeitada com 403. A licença foi emitida de qualquer forma.
Impacto: Um agente com um mandato de $10 poderia comprar 100 habilidades a $5 cada = $500 gastos, limite de $10 nunca aplicado.
Correção: Passar _internal: true, _secret: process.env.MANDATES_INTERNAL_SECRET. Lançar em caso de falha — fail-closed: sem licença se o gasto falhar.
C2: Repetição de txHash
O que: O mesmo txHash USDC poderia ser usado para emitir licenças ilimitadas.
Impacto: Pague $1 uma vez, obtenha todas as habilidades de $1 gratuitamente.
Correção: Deduplicar armazenamento via GitHub _data/used_txs/. Verificar se o txHash já foi usado antes de emitir a licença.
C3: Desvio de valor
O que: Verificamos received >= expected em vez de received === expected.
Impacto: Pague $50 uma vez, resgate cada habilidade com preço ≤ $50.
Correção: Correspondência exata: if (value !== BigInt(expectedAmountRaw)).
C4: Redenção de txHash roubado
O que: Verificamos se o txHash era válido e se o valor estava correto, mas nunca verificamos QUEM o enviou.
Impacto: Raspagem do Basescan para transferências USDC para nossa carteira, resgatá-las antes do verdadeiro comprador.
Correção: Validar se a carteira from corresponde ao walletAddress do chamador.
Descobertas ALTAS (5) — todas corrigidas
| # | Problema | Correção |
|---|---|---|
| H1 | CORS * em todos os endpoints |
Lista de permissões (apenas marketnow.site) |
| H2 | PII do mandato (emails) expostos na API de lista | Redigir: hasEmail: true em vez de email |
| H3 | Limitador de taxa por instância (não global) | Limitação documentada; Upstash Redis no roadmap |
| H4 | Webhook do Stripe sem idempotência | Verificar se o arquivo existe antes de escrever |
| H5 | Segredos padrão de fallback | Falhar rapidamente se STRIPE_SECRET_KEY não estiver definido |
Descobertas MÉDIAS (7) — todas corrigidas
- As chaves de licença agora usam
crypto.randomBytes(nãoMath.random) - Lista de permissões de URL de webhook (anti-SSRF: apenas Slack, Discord, Telegram, Zapier)
- Headers de segurança em
/api/*(nosniff, no-referrer, DENY) - Header CSP em rotas SPA
- Mensagens de erro não vazam mais internos do RPC
-
perPurchaseCapUsdpadrão paramin($50, limit)não limite total -
INTERNAL_SECRETfalha fechada se não definido
Resultados de desempenho
| Teste | Resultado |
|---|---|
| 200 simultâneos /api/search | 0% de erro, p95=1.09s |
| 50 simultâneos homepage | 0% de erro, p95=853ms |
| Sustentado 5 req/s × 30s | 100% de sucesso, p95=291ms |
| Memória (700+ requisições) | 0 crescimento (92MB → 92MB) |
| Efetividade do cache | 1 carga fria + 700+ acertos |
| vulnerabilidades npm | 0 |
O que ainda está pendente de forma honesta
Não afirmamos que tudo está perfeito:
- Auditoria independente de terceiros — Cure53 / Trail of Bits adiada até termos receita. Revisão por pares voluntária aberta.
- Limitador de taxa — em memória por instância, não global. Correção do Upstash Redis no roadmap.
- Escrow on-chain — USDC é irreversível. Processo de disputa manual por enquanto. Escrow de contrato inteligente visando Q1 2027.
- HTML duplicado de SPA — todas as rotas servem o mesmo HTML. Migração SSG no roadmap.
O relatório completo
Tudo está documentado em:
- Roteiro de confiança — resposta pública de 7 pontos
- Metodologia de segurança — Sentinel L1.5/L1.6/L2
- Código fonte — cada correção é um commit
Lições
- Fail-closed > fail-open. Se algo der errado, não emita a licença.
-
Correspondência exata > verificação de intervalo.
===não>=para valores de pagamento. - Validar o remetente. Um txHash válido não significa que SEU cliente pagou.
- Armazenamento de deduplicação é essencial. Cache é para desempenho, dedup é para segurança.
- Pentest antes do lançamento, não depois. Tivemos sorte — encontramos 4 críticos antes de qualquer dinheiro real fluir.
MarketNow — camada de confiança para comércio de agentes. 8.560 habilidades MCP, segurança Sentinel L2, x402 + USDC na Base. AliceLabs LLC (Wyoming, EUA). Experimente.
A segurança em plataformas que lidam com transações financeiras é crucial, especialmente para empresas brasileiras que buscam integrar agentes de IA. O relatório de auditoria pode servir como um guia para práticas de segurança em serviços similares.


