Pular para o conteudo
↑↓ navegar · ↵ abrir Elaxi

Auditoria de segurança

Transparência total: toda vulnerabilidade descoberta em testes de segurança é documentada aqui — com a data de descoberta, a data da correção e como foi resolvida. Nada fica escondido.

Última auditoria: 08/10/2026 (revisão: vitrine/POS, webhooks, reembolsos, WhatsApp) · Metodologia: pentest manual dirigido + navegador virtual (Chromium/Playwright) + análise estática de dependências, mapeado no OWASP Top 10:2025

Achados

10

06/10: 8 · 08/10: 2

Corrigidos

9

todos no mesmo dia

Riscos aceitos

2

documentados no roadmap

Defesas verificadas

34

testes sem falha

Vulnerabilidades descobertas

XSS de DOM na tela "Minhas vendas" (item/cliente não escapados em innerHTML)

MÉDIA · OWASP A05

Ao montar a lista de vendas no cliente, sale.itemName, sale.customerName e sale.itemImage iam direto para innerHTML. Um nome de item com <img onerror=...> executaria script na tela de vendas do produtor.

Correção: escapamento HTML de todos os campos antes de concatenar na view; o JSON de bootstrap em <script type="application/json"> teve < mascarado como \u003c (bloqueia fechamento de </script> via nome de item). Recompilado e validado.

Descoberta: 08/10/2026 · Corrigida: 08/10/2026 · Status: CORRIGIDA

XSS via quebra de atributo no cartão do item (JSON cru em atributo)

MÉDIA · OWASP A05

O cartão do item carregava data-item='<%- JSON.stringify(...) %>': JSON.stringify não escapa aspa simples, então um nome com ' quebrava o atributo e injetava HTML na vitrine do produtor.

Correção: data-item="<%= JSON.stringify(...) %>" — EJS escapa as aspas/HTML na renderização. Recompilado e validado.

Descoberta: 08/10/2026 · Corrigida: 08/10/2026 · Status: CORRIGIDA

Postback do gateway sem re-verificação (cancelamento de pedidos)

ALTA · OWASP A08

Com o segredo do webhook em mãos, um postback forjado com status_id=7 (cancelado) cancelava e reembolsava qualquer pedido sem consultar a Vindi — o fluxo de aprovação (status 6) já re-verificava, mas o de cancelamento não. Comprovado em teste: um pedido pago foi cancelado por um postback fictício.

Correção: o cancelamento agora re-verifica a transação via get_by_token na Vindi antes de qualquer ação; sem confirmação do gateway, o postback é ignorado (unverified-canceled). Re-testado: pedido permanece paid.

Descoberta: 06/10/2026 · Corrigida: 06/10/2026 · Status: CORRIGIDA

XSS (cross-site scripting) na busca do menu

ALTA · OWASP A05

O texto digitado na paleta de busca entrava no HTML sem escape — digitar <img src=x onerror=...></img> executava script no navegador do próprio usuário.

Correção: todo o query agora passa por escape HTML antes de montar a lista; a sugestão de eventos remove caracteres perigosos. Re-testado no navegador virtual com payloads clássicos: nenhum script executou, nenhum elemento injetado.

Descoberta: 06/10/2026 · Corrigida: 06/10/2026 · Status: CORRIGIDA

Clickjacking: página embutível em sites de terceiros

MÉDIA · OWASP A02

A plataforma podia ser carregada dentro de um <iframe> de qualquer site — base para ataques de sobreposição de interface (ex.: clicar em "Solicitar saque" sem perceber).

Correção: X-Frame-Options: DENY + frame-ancestors 'self' na CSP. Re-testado: o navegador bloqueia o enquadramento externo.

Descoberta: 06/10/2026 · Corrigida: 06/10/2026 · Status: CORRIGIDA

Força bruta na ativação do 2FA sem bloqueio

MÉDIA · OWASP A07

O login com 2FA tinha bloqueio após 5 erros, mas a ativação do 2FA não: com uma sessão válida, era possível tentar os 6 dígitos do código de confirmação sem limite.

Correção: mesmo lockout do login (5 tentativas → 15 minutos de bloqueio). Re-testado: bloqueia após a 5ª tentativa.

Descoberta: 06/10/2026 · Corrigida: 06/10/2026 · Status: CORRIGIDA

Proxy de imagens aceitava qualquer host .pages.dev / .r2.dev

MÉDIA · OWASP A05 (SSRF)

A validação por sufixo permitia que qualquer pessoa registrasse attacker.pages.dev na Cloudflare e usasse o proxy de imagens da Elaxi como intermediário.

Correção: allowlist estrita — apenas hosts fixos e o bucket R2 desta instalação (via variável de ambiente). Re-testado: attacker.pages.dev e IPs internos (169.254.x) bloqueados com 400.

Descoberta: 06/10/2026 · Corrigida: 06/10/2026 · Status: CORRIGIDA

Dependência crítica: spoofing de IP (proxy-addr)

CRÍTICA (dep) · OWASP A03

A biblioteca usada pelo Express para interpretar o IP do cliente era vulnerável a spoofing via IPv4-mapped IPv6 — afetando rate limits e dados antifraude.

Correção: atualizada para a versão corrigida (2.0.8) via auditoria de dependências; 26 vulnerabilidades reduzidas a 15 (todas as críticas e a maioria das severas resolvidas; restantes são transitivas de baixo impacto, monitoradas).

Descoberta: 06/10/2026 · Corrigida: 06/10/2026 · Status: CORRIGIDA

CSP com 'unsafe-inline' e 'unsafe-eval'

RISCO ACEITO · OWASP A02

A Política de Segurança de Conteúdo permite script inline/eval — se um XSS passar de todas as outras barreiras, executa sem restrição. A remoção exige refatoração dos scripts inline para nonces/_hashes.

Mitigações atuais: escape em todas as renderizações EJS, XSS da busca corrigido, uploads validados por magic bytes (SVG bloqueado), segundas fontes de script restritas por allowlist. Roadmap: migração para CSP com nonces.

Descoberta: 06/10/2026 · Status: ACEITO — no roadmap

Chave de criptografia compartilhada entre AES e HMACs

CORRIGIDA · OWASP A04

A mesma chave mestra protegia a criptografia de dados sensíveis (CPF) e assinava tokens de sessão 2FA/dispositivos — violando o princípio de uma chave por finalidade.

Correção: criada uma chave dedicada para assinar tokens 2FA, dispositivos confiáveis e hashes de dispositivo — separada da chave que cifra dados sensíveis (CPF/telefone). Cada operação agora usa a sua própria chave, sem compartilhamento. Re-testado: 2FA, trusted device e CPF funcionam com as chaves separadas.

Descoberta: 06/10/2026 · Corrigida: 06/10/2026 · Status: CORRIGIDA

Telefone do produtor em texto puro (decisão de simplicidade)

RISCO ACEITO · OWASP A04

Por decisão do dono do produto, o telefone do produtor fica em texto puro em ev_shop_settings.phone (sem criptografia), ao contrário do CPF, que continua cifrado em AES-256-GCM. Risco aceitável: número de telefone comercial, raramente sensível, e a coluna não é exposta a outro tenant (apenas ao próprio produtor e ao admin).

Documentada: 08/10/2026 · Status: ACEITO — com justificativa

Bug Bounty — encontre e ganhe

Encontrou uma vulnerabilidade de verdade? Reporte pelo formulário abaixo e ganhe uma recompensa via PIX após validação. Reportes duplicados não são remunerados; vulnerabilidades já corrigidas nesta página também não.

Crítica

R$ 500

Alta

R$ 250

Média

R$ 100

Baixa

R$ 30

Ao reportar, você concorda em não explorar a vulnerabilidade além do necessário para demonstrá-la. Divulgação pública só após correção.

Defesas verificadas em teste (sem falha)

  • ✓ IDOR: carrinho, status, PIX e reembolso de pedidos alheios → 403
  • ✓ CSRF global em toda mutação (sem token → 403)
  • ✓ Open redirect bloqueado (//evil, javascript:, https://)
  • ✓ SQL injection: todas as queries parameterizadas; probes sem efeito
  • ✓ Prototype pollution: __proto__ ignorado nos bodies
  • ✓ Race de estoque: última unidade vende só 1× sob requisições simultâneas
  • ✓ Cookies de sessão: HttpOnly + Secure + SameSite=Lax
  • ✓ Uploads: SVG bloqueado, magic bytes validados (sem content-type do cliente)
  • ✓ 2FA: lockout de 5 tentativas no login, cookies de dispositivo não forjáveis (HMAC timing-safe)
  • ✓ Enumeração de contas: respostas uniformes (email vs senha errada)
  • ✓ Painel admin: sem claim admin → 403; segredos de webhook → 401
  • ✓ XSS refletido na busca de eventos: escapado (<img onerror> não executa)
  • ✓ API key: apenas header (não vaza em logs de acesso), rota autenticada
  • ✓ WebSocket (tempo real): conexões exigem cookie de sessão válido
  • ✓ IDOR em vendas POS: status/comprovante/contato/item de outro produtor → 404/erro (14 sondas 08/10)
  • ✓ CSRF também nas novas rotas de vitrine: POST sem token → 403
  • ✓ Admin: /adm/itens e taxa por produtor sem claim admin → 403
  • ✓ Webhook geral Vindi: secret errado → 401; token fake + status 6 → sem confirmação
  • ✓ Telefone do produtor: payload de SQL injection rejeitado pela validação (400)
  • ✓ Reversão de pagamento (webhook status 7) re-verificada via get_by_token — estorno forjado ignorado

Metodologia

Quando: 06/10/2026 e 08/10/2026 (atualização: vitrine/POS, webhooks, reembolsos, WhatsApp) · Escopo: plataforma Elaxi (web), gateway de pagamento (sandbox), autenticação, financeiro, uploads e APIs.

Como: pentest manual dirigido com navegador virtual headless (Chromium/Playwright) para XSS DOM, clickjacking e fluxos de 2FA; requisições HTTP diretas para controle de acesso, CSRF, injeção e lógica de negócio; auditoria estática de dependências (npm audit); revisão de código das superfícies críticas.

Referências: OWASP Top 10:2025 · OWASP API Security Top 10:2023 · testes executados em ambiente de desenvolvimento com dados sintéticos; produção verificada apenas passivamente (headers/cookies).

Encontrou uma vulnerabilidade? Reporte e ganhe — levamos qualquer reporte a sério.