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. 1. Visão geral da plataforma
  2. 2. Vulnerabilidade identificada
    1. 2.1. Natureza técnica
    2. 2.2. Vetor de ataque
    3. 2.3. Algoritmo (visão de alto nível)
    4. 2.4. Dados expostos
  3. 3. Impacto e severidade
    1. 3.1. Análise CVSS
    2. 3.2. Impacto para clientes-operadores
    3. 3.3. Impacto para o fornecedor
    4. 3.4. Impacto para usuários finais (leads)
  4. 4. Prova de conceito (alto nível)
  5. 5. Mitigações recomendadas
    1. 5.1. Crítico — Server-side rendering verdadeiro
    2. 5.2. Médio prazo — APIs autenticadas por step
    3. 5.3. Defesa em profundidade
  6. 6. Disclosure responsável
  7. A. Apêndice — Classificação CWE/CVSS
  8. 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:

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:

  1. 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.
  2. 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.
  3. A criptografia é AES-CBC no formato CryptoJS (prefixo Salted__ + salt de 8 bytes), com derivação de chave via EVP_BytesToKey + MD5.
  4. 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).
  5. 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:

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:

  1. Descarta-se um prefixo fixo de N bytes do payload
  2. Lê-se um único caractere como offset numérico
  3. Extrai-se uma janela contígua de 26 caracteres logo após o offset
  4. A chave AES é uma sub-string de 6 caracteres dessa janela, indexada pelo offset
  5. O ciphertext começa imediatamente após a janela
  6. Decodifica-se o ciphertext em base64, valida-se o prefixo Salted__, extrai-se o salt de 8 bytes
  7. Deriva-se key (32 bytes) + IV (16 bytes) usando EVP_BytesToKey + MD5
  8. 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:

CategoriaCampos expostosSensibilidade
Identidade do funilfunnel_id, hash, slug interno, user_id (operador Inlead), timestampsMédio
Propriedade intelectual do operadorTodas as perguntas, opções, lógica condicional, depoimentos, imagens/vídeos referenciados, scripts/HTML embutido, copy completo do pitchAlto
Métricas do servidormetadata.pageview, metadata.leads, metadata.qualified, metadata.complete, retention por step em metadata.performance, totais lifetime em metadata.recordsAlto
Endpoints internosURL completa do webhook configurado (n8n, Make, Zapier, RD Station, etc.) — alvo de ataques externosAlto
Configurações de trackingPixel Meta ID, GA4 measurement ID, GTM container ID, pixels secundáriosMédio
Flags internashas_fraud_keywords (sinal de moderação interna), is_validated (status de validação Inlead)Médio
SEO/metadataTitle, 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étricaValorJustificativa
Attack Vector (AV)NetworkAcessível pela internet pública
Attack Complexity (AC)LowSem condições especiais; reproduzível em ~15 minutos
Privileges Required (PR)NoneSem autenticação
User Interaction (UI)NoneNão requer ação do usuário-vítima
Scope (S)UnchangedImpacto limitado ao recurso vulnerável
Confidentiality (C)HighConteúdo proprietário completo do operador é exposto
Integrity (I)NoneOperação é read-only — não há escrita
Availability (A)NoneNenhum 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

3.3. Impacto para o fornecedor (Inlead)

3.4. Impacto para usuários finais (leads)

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, é:

  1. 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.
  2. Para cada slug ativo, requisitar a página HTML. O HTML retorna em ~100 KB com o payload embutido.
  3. Extrair o campo props.pageProps.f do __NEXT_DATA__.
  4. 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:

  1. A página inicial renderiza apenas o primeiro step do funil (a "abertura").
  2. 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.
  3. O servidor avalia a lógica condicional, escolhe o próximo step e responde com apenas esse step (não com o funil inteiro).
  4. 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:

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:

5.3. Defesa em profundidade

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:

EtapaPrazo sugeridoAção
1. Contato inicialDia 0Enviar este documento à equipe da Inlead via canal técnico (suporte ou contato direto com CTO/lead de engenharia)
2. ReconhecimentoDia 7Aguardar confirmação de recebimento e início de análise interna
3. Janela de mitigaçãoDia 90Período para implementação das mitigações §5.2 (mínimo) ou §5.1 (ideal)
4. Divulgação públicaDia 90+Caso correção esteja implantada (verificável publicamente), publicação técnica em fórum especializado é apropriada
4-alt. Divulgação retidaindefinidoSe 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