INL-2026-001 · SECURITY ADVISORY
Inlead Funnel Disclosure
Divulgação não autenticada do conteúdo completo dos funis hospedados na plataforma Inlead (inlead.digital), incluindo lógica condicional, métricas reais do servidor e endpoints internos.
ID internoINL-2026-001
ClassificaçãoInformation Disclosure (CWE-200, CWE-321)
SeveridadeHIGH (7.5)
FornecedorInlead Tecnologia · inlead.digital
ProdutoPlataforma de funis/quiz (SaaS)
StatusNão reportado ao fornecedor (este documento é a proposta de disclosure)
Data2026-05-23
Severidade estimada (CVSS v3.1)
7.5 HIGH
AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:N/A:N
Sumário Executivo
A plataforma Inlead (inlead.digital) é um SaaS brasileiro que permite a criação e hospedagem de funis de quiz/marketing. Cada funil é servido publicamente em URLs no formato inlead.digital/{slug} ou, opcionalmente, em domínio personalizado do cliente.
Durante uma análise técnica, identificamos que o conteúdo completo de cada funil — incluindo perguntas, lógica condicional, blocos de oferta, URLs de webhook, IDs de pixel Meta/GA4, flags internas de validação e métricas reais do servidor (pageviews, leads, conversões agregadas) — é enviado embutido na resposta HTML inicial, criptografado com AES-CBC.
O problema central: a chave de descriptografia é distribuída na mesma resposta HTTP que o ciphertext, embaralhada em um esquema reversível. O código JavaScript que faz a descriptografia no cliente também é servido publicamente como chunk Next.js. Em consequência, qualquer visitante pode extrair o conteúdo completo do funil em poucos minutos, sem autenticação, sem ferramentas especializadas e sem precisar interagir com o quiz.
Validamos a viabilidade técnica analisando 81 funis ativos em 29 nichos, e descobrimos 916 slugs históricos da plataforma indexados publicamente no Internet Archive — todos passíveis da mesma extração. O impacto direto é a perda de propriedade intelectual dos clientes-operadores da Inlead, que investem semanas/meses iterando copy, lógica e ofertas. Esse trabalho fica replicável por concorrentes em minutos.
Este documento descreve a vulnerabilidade em detalhe técnico, classifica seu impacto e propõe um plano de mitigação em três horizontes (crítico/médio prazo/defesa em profundidade), além de recomendações de disclosure responsável ao fornecedor.
Sumário
- 1. Visão geral da plataforma
- 2. Vulnerabilidade identificada
- 2.1. Natureza técnica
- 2.2. Vetor de ataque
- 2.3. Algoritmo (visão de alto nível)
- 2.4. Dados expostos
- 3. Impacto e severidade
- 3.1. Análise CVSS
- 3.2. Impacto para clientes-operadores
- 3.3. Impacto para o fornecedor
- 3.4. Impacto para usuários finais (leads)
- 4. Prova de conceito (alto nível)
- 5. Mitigações recomendadas
- 5.1. Crítico — Server-side rendering verdadeiro
- 5.2. Médio prazo — APIs autenticadas por step
- 5.3. Defesa em profundidade
- 6. Disclosure responsável
- A. Apêndice — Classificação CWE/CVSS
- B. Apêndice — Glossário técnico
1. Visão geral da plataforma
A Inlead é uma plataforma SaaS brasileira que permite a criação e hospedagem de funis interativos no formato quiz — uma alternativa nacional ao Typeform com foco em conversão (não coleta). Funis típicos têm 20–75 etapas e seguem o padrão metodológico de info-produto low-ticket: bloco de perguntas que qualificam e engajam → diagnóstico personalizado → captação de lead (nome + WhatsApp) → pitch de oferta com ancoragem.
Arquitetura observada:
- Aplicação Next.js servida via
Vercel (header x-vercel-id) com camada de borda Cloudflare
- Páginas geradas via Static Site Generation (SSG) ou Server-Side Rendering (SSR) — em ambos os casos, o conteúdo do funil vai embutido no HTML inicial
- Hospedagem padrão em
inlead.digital/{slug}; domínios personalizados disponíveis para planos superiores
- Assets servidos por
media.inlead.cloud (CDN próprio em CloudFront)
- Painel administrativo do cliente em
app.inlead.digital
O modelo de monetização é por assinatura mensal por usuário; quizzes públicos são identificados por user_id interno (campo user no payload do funil).
2. Vulnerabilidade identificada
2.1. Natureza técnica
A vulnerabilidade é classificada como Information Disclosure (CWE-200) agravada por distribuição insegura de chave criptográfica (CWE-321 / CWE-321-like). O comportamento técnico:
- Quando um usuário acessa
inlead.digital/{slug} (ou o domínio personalizado equivalente), a Inlead retorna um documento HTML com um bloco <script id="__NEXT_DATA__"> contendo o estado serializado do componente Next.js.
- Esse estado inclui um campo
props.pageProps.f — uma string de 10KB a 600KB — que contém todo o conteúdo do funil (perguntas, layers, lógica, ofertas, métricas, webhook, pixels) criptografado.
- A criptografia é AES-CBC no formato CryptoJS (prefixo
Salted__ + salt de 8 bytes), com derivação de chave via EVP_BytesToKey + MD5.
- A chave de criptografia é enviada na mesma string, embaralhada em um esquema posicional reversível (6 caracteres extraídos de uma janela predefinida do payload).
- O código JavaScript que executa a descriptografia no navegador é servido publicamente como um chunk Next.js (path
/_next/static/chunks/pages/[...all]-*.js) — qualquer um pode lê-lo via View Source ou requisição HTTP simples.
Equivalência prática a "chave hard-coded"
Embora a chave AES não esteja literalmente em uma constante, ela é trivialmente reconstruível a partir de informação que o próprio servidor disponibiliza. Para qualquer atacante moderado, o efeito é equivalente ao de uma chave fixa pública.
2.2. Vetor de ataque
Ataque é executável remotamente, sem autenticação, sem interação do usuário-vítima, e sem ferramentas especializadas. As capacidades necessárias resumem-se a:
- Fazer uma requisição HTTP GET para a URL pública do funil
- Parsear o HTML retornado (qualquer cliente HTTP)
- Executar um decifrador AES-CBC com derivação MD5 (suportado nativamente em qualquer linguagem moderna)
O esforço para descobrir e implementar o algoritmo a partir do chunk JS público foi de aproximadamente 15 minutos para um engenheiro com familiaridade básica em criptografia simétrica e ferramentas web.
2.3. Algoritmo (visão de alto nível)
Sem expor código copy-paste, o algoritmo segue o padrão:
- Descarta-se um prefixo fixo de N bytes do payload
- Lê-se um único caractere como offset numérico
- Extrai-se uma janela contígua de 26 caracteres logo após o offset
- A chave AES é uma sub-string de 6 caracteres dessa janela, indexada pelo offset
- O ciphertext começa imediatamente após a janela
- Decodifica-se o ciphertext em base64, valida-se o prefixo
Salted__, extrai-se o salt de 8 bytes
- Deriva-se key (32 bytes) + IV (16 bytes) usando EVP_BytesToKey + MD5
- AES-CBC decrypt + PKCS7 unpadding entrega o JSON cru do funil
O esquema é uma forma de security through obscurity. A literatura de segurança é unânime em desencorajar essa estratégia há mais de 130 anos (Princípio de Kerckhoffs, 1883).
2.4. Dados expostos
O JSON descriptografado contém:
| Categoria | Campos expostos | Sensibilidade |
| Identidade do funil | funnel_id, hash, slug interno, user_id (operador Inlead), timestamps | Médio |
| Propriedade intelectual do operador | Todas as perguntas, opções, lógica condicional, depoimentos, imagens/vídeos referenciados, scripts/HTML embutido, copy completo do pitch | Alto |
| Métricas do servidor | metadata.pageview, metadata.leads, metadata.qualified, metadata.complete, retention por step em metadata.performance, totais lifetime em metadata.records | Alto |
| Endpoints internos | URL completa do webhook configurado (n8n, Make, Zapier, RD Station, etc.) — alvo de ataques externos | Alto |
| Configurações de tracking | Pixel Meta ID, GA4 measurement ID, GTM container ID, pixels secundários | Médio |
| Flags internas | has_fraud_keywords (sinal de moderação interna), is_validated (status de validação Inlead) | Médio |
| SEO/metadata | Title, description, OG image (mas isso é público nas tags HTML padrão) | Baixo |
Achado mais crítico
A exposição de métricas reais de pageview/lead/complete por funil permite a qualquer concorrente medir o tamanho exato da operação de outro cliente. Em nossa análise, descobrimos funis com 675.000 pageviews lifetime e 150.000 leads capturados — informação que vale dezenas de milhares de reais em inteligência competitiva, exposta gratuitamente a qualquer visitante.
3. Impacto e severidade
3.1. Análise CVSS v3.1
| Métrica | Valor | Justificativa |
| Attack Vector (AV) | Network | Acessível pela internet pública |
| Attack Complexity (AC) | Low | Sem condições especiais; reproduzível em ~15 minutos |
| Privileges Required (PR) | None | Sem autenticação |
| User Interaction (UI) | None | Não requer ação do usuário-vítima |
| Scope (S) | Unchanged | Impacto limitado ao recurso vulnerável |
| Confidentiality (C) | High | Conteúdo proprietário completo do operador é exposto |
| Integrity (I) | None | Operação é read-only — não há escrita |
| Availability (A) | None | Nenhum impacto em disponibilidade |
Vetor: CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:N/A:N · Base Score: 7.5 (HIGH)
3.2. Impacto para clientes-operadores
- Perda de propriedade intelectual: meses de iteração em copy, ordem de perguntas, ofertas, ancoragem e timing são extraídos em minutos por concorrentes.
- Vazamento de inteligência operacional: volume real do funil, taxa de conversão por step e ROI são visíveis a qualquer terceiro.
- Endpoint do webhook exposto: URLs de n8n self-hosted ou serviços terceiros (Make, Zapier, ActiveCampaign) ficam acessíveis. Ataques de spam, descoberta de stack interno e tentativas de injeção tornam-se viáveis.
- Risco regulatório (LGPD): embora os leads em si não sejam expostos (apenas contagens agregadas), a exposição de pixels e webhooks pode complicar auditorias de fluxo de dados pessoais — especialmente se o webhook for hospedado em jurisdições com regimes distintos.
3.3. Impacto para o fornecedor (Inlead)
- Diferenciação competitiva comprometida: a propriedade intelectual que os clientes investem na plataforma é parte do que justifica a assinatura. Quando ela é facilmente replicável, a proposta de valor enfraquece.
- Risco reputacional: uma vez publicizada (em fóruns técnicos, redes sociais ou pela imprensa), a percepção de "plataforma vazada" é difícil de reverter.
- Sinais internos públicos: as flags
has_fraud_keywords e is_validated são expostas, dando a qualquer pessoa acesso ao critério de moderação interna do produto.
3.4. Impacto para usuários finais (leads)
- Indireto e baixo, mas existe. Como o webhook é exposto, leads capturados podem ser direcionados a sistemas terceiros sem que o usuário tenha forma trivial de verificar.
4. Prova de conceito (alto nível)
Por princípio de disclosure responsável, este documento não inclui código pronto para exploração. O processo, descrito de forma genérica, é:
- Identificar funis Inlead em escala. O Internet Archive (Wayback Machine) expõe, via API pública
CDX, todos os slugs já indexados no domínio inlead.digital/*. Em nossa análise, isso retornou ~916 slugs únicos.
- Para cada slug ativo, requisitar a página HTML. O HTML retorna em ~100 KB com o payload embutido.
- Extrair o campo
props.pageProps.f do __NEXT_DATA__.
- Aplicar o algoritmo descrito em §2.3 para obter o JSON cru.
Sem qualquer captcha, rate limiting agressivo ou bot detection observado durante a coleta. Foi possível processar 81 funis em ~3 minutos com paralelismo modesto (4 workers concorrentes).
Validação técnica
A extração foi validada comparando o JSON obtido contra um funil de referência conhecido (extraído manualmente via Chrome DevTools); resultado byte-a-byte idêntico.
5. Mitigações recomendadas
5.1. Crítico — Server-side rendering verdadeiro
A solução estrutural é não enviar o conteúdo completo do funil no HTML inicial. O fluxo recomendado:
- A página inicial renderiza apenas o primeiro step do funil (a "abertura").
- Quando o usuário responde, o cliente faz POST autenticado para
/api/funnel/{funnel_id}/next com a resposta e um token de sessão emitido na entrada.
- O servidor avalia a lógica condicional, escolhe o próximo step e responde com apenas esse step (não com o funil inteiro).
- A captação (nome + WhatsApp) também passa pelo servidor, que dispara o webhook do operador do lado do servidor — o webhook URL nunca é exposto no client.
Benefícios adicionais desse modelo:
- Permite rate limiting por sessão e detecção de scraping
- Permite A/B testing real (servidor escolhe variante por sessão)
- Permite enviar conteúdo personalizado por GEO/dispositivo sem expor toda a matriz
- Reduz dramaticamente o tamanho do HTML inicial (melhora Web Vitals)
5.2. Médio prazo — APIs autenticadas por step
Se a refatoração completa para SSR é inviável em curto prazo, mitigações intermediárias:
- Remover métricas do payload servido ao público.
metadata.pageview, metadata.records.*, metadata.performance e metadata.leads não têm razão de existir no JSON do funil servido a qualquer visitante. Essas métricas devem viver apenas na API do painel administrativo (app.inlead.digital).
- Remover webhook URL do payload. O webhook deve ser disparado pelo backend da Inlead após validação server-side da captação. O cliente apenas envia os dados; o servidor sabe qual webhook chamar.
- Remover flags internas (
has_fraud_keywords, is_validated) do JSON público. Esses são sinais operacionais, não de produto.
- Rotacionar a chave por sessão. Em vez de derivar a chave do próprio payload, gerar uma chave temporária no servidor, vincular à sessão (cookie HttpOnly) e exigir um handshake antes de servir o conteúdo. Não é solução definitiva — alguém pode automatizar o handshake — mas aumenta significativamente o custo do scraping em massa.
5.3. Defesa em profundidade
- Rate limiting agressivo por IP/ASN. Identificar padrões de scraping em massa (ex: requisições a vários slugs distintos do mesmo IP em curto intervalo).
- Bot detection. Integrar Cloudflare Bot Management, hCaptcha ou solução equivalente. Atualmente não há nenhuma camada visível.
- Honeypot slugs. Slugs que parecem funis reais mas são iscas; acessá-los gera alerta de auditoria.
- Watermark dinâmico no copy. Inserir identificadores únicos (invisíveis) por requisição que permitam rastrear de onde o conteúdo foi extraído se aparecer republicado.
- Política de exclusão do Internet Archive. A Inlead pode submeter
robots.txt ao Wayback Machine para impedir indexação histórica de novos slugs — não corrige o passado, mas limita exposição futura.
- Programa de bug bounty. Estabelecer canal formal (security@inlead.digital ou HackerOne) para receber reports de segurança, com SLA público.
Priorização sugerida
A mitigação mínima viável em sprint curta seria 5.2 — remover métricas, webhook URL e flags internas do payload. Isso elimina os achados mais críticos (perda de inteligência competitiva e exposição de endpoint) sem exigir refatoração arquitetural completa. A solução estrutural (§5.1) deve entrar no roadmap como item de médio prazo.
6. Disclosure responsável
Sugerimos o seguinte processo de divulgação ao fornecedor:
| Etapa | Prazo sugerido | Ação |
| 1. Contato inicial | Dia 0 | Enviar este documento à equipe da Inlead via canal técnico (suporte ou contato direto com CTO/lead de engenharia) |
| 2. Reconhecimento | Dia 7 | Aguardar confirmação de recebimento e início de análise interna |
| 3. Janela de mitigação | Dia 90 | Período para implementação das mitigações §5.2 (mínimo) ou §5.1 (ideal) |
| 4. Divulgação pública | Dia 90+ | Caso correção esteja implantada (verificável publicamente), publicação técnica em fórum especializado é apropriada |
| 4-alt. Divulgação retida | indefinido | Se a Inlead solicitar prazo adicional para correção, considerar caso a caso. Não divulgar antes da correção sem motivo forte. |
Sobre nossa análise
A análise descrita neste documento foi conduzida em escopo de pesquisa técnica para fins de modelagem de mercado. Nenhum acesso não autorizado foi obtido: o conteúdo extraído foi servido publicamente pelo próprio servidor da Inlead a qualquer navegador. Nenhum dado pessoal de leads foi coletado, nem foram acessadas áreas autenticadas da plataforma. A "extração" é tecnicamente equivalente a abrir o View Source de cada página — apenas automatizada e com pós-processamento criptográfico que segue o mesmo código JavaScript que o navegador do usuário executa.
Apêndice A — Classificação CWE/CVSS
- CWE primário
- CWE-200: Exposure of Sensitive Information to an Unauthorized Actor
- CWE secundário
- CWE-321: Use of Hard-coded Cryptographic Key (efeito equivalente)
- CWE terciário
- CWE-922: Insecure Storage of Sensitive Information (chave + cipher coabitam)
- CWE quaternário
- CWE-656: Reliance on Security Through Obscurity
- CVSS v3.1 Vector
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:N/A:N
- Base Score
- 7.5 (HIGH)
- Temporal Score
- 7.2 (HIGH) — assumindo exploit code disponível em chunk JS público (E:F = Functional)
- Environmental Score
- varia por cliente; tipicamente HIGH
Apêndice B — Glossário técnico
- SSG / SSR
- Static Site Generation / Server-Side Rendering — modelos de entrega de página Next.js onde o HTML é montado antes ou no momento da requisição
- AES-CBC
- Advanced Encryption Standard em modo Cipher Block Chaining — cifra de bloco simétrica padrão
- EVP_BytesToKey
- Função de derivação de chave da OpenSSL (compatível com CryptoJS), usa hash iterado a partir de senha + salt
- PKCS7 padding
- Padrão de preenchimento de bloco usado com cifras simétricas
- Princípio de Kerckhoffs
- Princípio de criptografia (1883) segundo o qual a segurança de um sistema deve depender apenas da chave, não da obscuridade do algoritmo
- Information Disclosure
- Categoria de vulnerabilidade onde um sistema revela informações que não deveriam ser acessíveis a um ator não autorizado
- Responsible Disclosure
- Prática de reportar vulnerabilidades ao fornecedor antes de divulgá-las publicamente, dando prazo para correção
- Wayback CDX
- API do Internet Archive que lista todas as URLs já capturadas para um domínio