Skip to content
KitploitKITPLOIT
FerramentasBlog
Enviar
FerramentasBlog
Enviar

Ferramentas de Hacking, PenTest e Cibersegurança para o seu Arsenal de Segurança!

Kitploit é um diretório de ferramentas de hacking, cibersegurança e pentesting. Descubra as últimas atualizações de projetos para encontrar vulnerabilidades, analisar sistemas, automatizar testes e fortalecer sua segurança.

··Feeds·Contato·Privacidade·© 2026 Kitploit

Diretório de Ferramentas

Categorias

Ver todas as categorias
Loading categories
CVE-2026-34207 — O filtro SSRF verificava o texto do hostname, mas o destino real era decidido posteriormente pelo DNS. Essa lacuna permitia que URLs de Webhook controladas pelo atacante alcançassem alvos de loopback, metadados e rede privada. | Kitploit
Ferramentas/GitHubGitHub/0xmrma/cve-2026-34207
Análise de VulnerabilidadesExploraçãoSegurança WebTestes de PenetraçãoPapers e PesquisaAprendizado e Educação
GitHub0xmrma/cve-2026-34207

CVE-2026-34207

O filtro SSRF verificava o texto do hostname, mas o destino real era decidido posteriormente pelo DNS. Essa lacuna permitia que URLs de Webhook controladas pelo atacante alcançassem alvos de loopback, metadados e rede privada.

Ver Repositório
há 1 mêsAinda não revisado

Mais Populares

Ver todos →

Descubra as ferramentas mais usadas pela nossa comunidade.

Explore todas as ferramentas

Navegue pela nossa coleção de ferramentas

Ver todas as ferramentas →
Compartilhar

CVE-2026-34207

O filtro SSRF verificava o texto do hostname, mas o destino real era decidido mais tarde pelo DNS. Essa lacuna permitia que URLs de Webhook controladas pelo atacante alcançassem loopback, metadados e alvos de rede privada.

Introdução

Encontrei esse problema ao revisar Typebot, um construtor de chatbots open-source, com uma simples questão de segurança em mente:

O que acontece se a proteção SSRF valida o texto do hostname, mas o destino real é decidido mais tarde pelo DNS?

Neste caso, essa questão levou a um bug real.

A proteção SSRF do Typebot para blocos Webhook / HTTP Request validava apenas:

  • a string da URL,
  • hostnames literais bloqueados,
  • e formatos literais de IP

Ela não resolvia hostnames antes de permitir a requisição.

Isso significava que um hostname como ssrf-repro.example poderia parecer inofensivo durante a validação, mas depois resolver para:

  • 127.0.0.1
  • 169.254.169.254
  • ou espaço de rede RFC1918/rede privada

e ainda ser obtido pelo cliente HTTP do backend.

Esse problema se tornou CVE-2026-34207.

Typebot: CVE-2026-34207

Typebot no GitHub

CVE:

Corrigido em:
3.16.0

Isso afetou Typebot, uma plataforma de chatbot open-source amplamente utilizada. Em seu site oficial, o Typebot é apresentado como confiável por 650+ empresas mundialmente. O site também anuncia 2M+ chats mensais e 1.5M+ bots publicados.

photo0

Cadeia de Ataque

attacker-controlled Webhook URL -> hostname passes literal-only SSRF validation -> no DNS resolution before allow decision -> backend HTTP client resolves hostname to internal target -> server-side request reaches loopback / metadata / private network -> response data becomes available through execution logs


O Que o Typebot Faz

Typebot é um construtor de chatbots.

Ele permite que usuários criem fluxos que podem:

  • fazer perguntas
  • coletar entrada estruturada
  • chamar serviços externos
  • encadear lógica de negócios
  • e disparar requisições HTTP de saída através de blocos Webhook / HTTP Request

Isso significa que a execução de requisições de saída é uma fronteira de segurança real.

A questão importante aqui não era se o Typebot suportava blocos Webhook.

A verdadeira questão era:

A proteção SSRF valida o destino real ao qual o servidor se conectará, ou apenas o texto do hostname que aparece na URL?

Neste caso, ela validou apenas a forma textual primeiro.

Esse foi o erro.


Por Que Esta Superfície Valia a Pena Ser Examinada

Defesas SSRF falham de maneiras muito previsíveis.

Na maioria das vezes, os erros interessantes não são:

  • "você esqueceu de bloquear 169.254.169.254"
  • ou "você esqueceu de bloquear localhost"

Os erros mais fortes são erros de fronteira:

  • validação ocorre antes da canonicalização
  • validação ocorre antes de redirecionamentos
  • validação ocorre antes da resolução DNS
  • validação ocorre em uma representação, mas a pilha de rede usa outra

Esse era o lugar certo para olhar aqui.

O Typebot já possuía lógica de hardening SSRF para IPs de metadados literais, loopback, faixas privadas e truques de IP codificados.

Isso tornou a próxima pergunta óbvia:

E se o hostname não é literalmente perigoso, mas resolve para um destino perigoso mais tarde?

Foi exatamente o que aconteceu.


Causa Raiz

A raiz do problema foi validação de destino baseada no texto do hostname em vez do endereço IP resolvido.

Na implementação vulnerável, validateHttpReqUrl():

  • analisava a URL
  • permitia apenas http: e https:
  • bloqueava uma pequena lista de hostnames literais como metadata.google.internal, metadata.goog, metadata e localhost
  • detectava truques literais de IP decimal/hex/octal
  • analisava endereços IPv4/IPv6 literais
  • validava o endereço apenas se o próprio hostname já fosse um IP literal

Essa é a parte importante.

Se o hostname fosse um valor normal como:

ssrf-repro.example

então parseIPAddress(hostname) retornava null, e o validador parava por aí.

Nenhuma resolução DNS ocorria antes da aprovação.

Então a lógica vulnerável efetivamente se resumia a:

root@kitploit:~
const ip = parseIPAddress(hostname);
if (ip) {
  validateIPAddress(ip);
}

Isso significa que:

  • IPs literais perigosos eram bloqueados
  • IPs codificados perigosos eram bloqueados
  • mas hostnames que resolvem para IPs perigosos não eram

A segunda metade do bug estava no caminho de execução.

Em executeHttpRequest(), o Typebot primeiro executava a validação e depois realizava a requisição real com ky(request.url, ...).

Então a sequência era:

  • validar a string da URL
  • aceitar o hostname
  • mais tarde resolver o hostname durante a requisição de saída real
  • conectar ao destino interno resolvido

Essa é a vulnerabilidade completa.


Por Que Isso É um Problema de Segurança, Não Apenas Filtragem Incompleta

A distinção importante é onde a decisão de confiança foi tomada.

Muitos bugs parecem pequenos se descritos mal.

Se descrevermos este como:

"o filtro de hostname estava incompleto"

parece um problema de qualidade.

Esse não é o verdadeiro problema.

O verdadeiro problema era:

  • o servidor tomou uma decisão de segurança antes de saber o destino real
  • a pilha de rede depois se conectou a outro lugar
  • e a aplicação tratou essa requisição como válida

Isso não é uma fraqueza cosmética de filtragem.

Isso é uma falha na fronteira de confiança.

E porque o executor HTTP gravava dados de resposta nos logs de execução, o problema nem era cego nos casos mais fortes.

Então não era apenas:

  • "tráfego interno inesperado aconteceu"

Era:

  • tráfego interno aconteceu
  • e o atacante muitas vezes podia recuperar a prova e o conteúdo da resposta através do comportamento normal da aplicação

Isso é uma verdadeira vulnerabilidade SSRF.


Prova de Conceito

Usei duas camadas de prova porque demonstravam duas coisas diferentes.

PoC 1: demonstração autossuficiente com resolvedor local

A primeira PoC isolou a causa raiz de forma limpa.

Usei uma pequena estrutura local que:

  • iniciava um servidor HTTP de loopback em 127.0.0.1
  • validava uma URL como http://ssrf-repro.example:18080/...
  • usava um resolvedor controlado para que ssrf-repro.example resolvesse para 127.0.0.1
  • depois executava a requisição

Isso demonstrou a falha exata:

  • a validação passou porque o hostname não era um valor literal bloqueado
  • a requisição posterior ainda alcançou o loopback

A saída capturada mostrava:

  • resultado do validador: aprovado
  • resultado da execução da requisição: loopback alcançado
  • corpo da resposta retornado pelo serviço de loopback

Isso comprovou a lacuna de validação diretamente.


PoC 2: caminho de execução real do Typebot

A segunda PoC mostrou o bug através do caminho real do recurso que importa.

A reprodução mais simples era:

  1. Mapear um hostname benigno para loopback na máquina onde o backend do Typebot resolve DNS
  2. Iniciar um serviço HTTP local
  3. Criar um bloco Webhook apontando para esse hostname benigno
  4. Acionar o bloco através de um caminho normal de pré-visualização autenticada ou execução ao vivo

Um bloco representativo se parecia com:

root@kitploit:~
{
  "id": "blk-webhook",
  "type": "Webhook",
  "options": {
    "webhook": {
      "method": "GET",
      "url": "http://ssrf-repro.example:8000/"
    }
  }
}

Com uma entrada no arquivo hosts como:

root@kitploit:~
127.0.0.1 ssrf-repro.example

o validador ainda aceitava a URL porque:

  • ssrf-repro.example não estava em blockedHostnames
  • não era localhost
  • parseIPAddress("ssrf-repro.example") retornou null
  • nenhuma validação de IP de destino ocorreu

Então o cliente HTTP do backend resolveu o hostname para 127.0.0.1 e conectou de qualquer forma.

Isso estabeleceu a alegação completa:

  • a lógica de validação vulnerável era acessível no uso real do recurso
  • a requisição atingiu uma classe bloqueada de destinos
  • e a aplicação ainda tratou isso como uma requisição HTTP de saída bem-sucedida

Por Que as Duas PoCs Foram Escolhidas Dessa Forma

A primeira PoC prova a causa raiz.

A segunda PoC prova o impacto no produto.

Essa divisão é importante.

Se você mostra apenas:

"este filtro aceita um hostname"

você não mostrou o suficiente.

Se você mostra apenas:

"uma requisição interna aconteceu"

você não isolou o porquê.

O relatório mais forte é:

  • a validação baseada em hostname aceitou um valor que não deveria ser confiável
  • a resolução DNS depois mudou o significado real de segurança daquele valor
  • o backend se conectou a um destino bloqueado
  • e o caminho do recurso ainda foi concluído

Essa é a história completa.


Gravidade e Classificação

Este problema foi razoavelmente classificado como Alta.

A classificação do aviso foi:

  • CWE-918: Falsificação de Solicitação do Lado do Servidor (SSRF)
  • CWE-20: Validação de Entrada Incorreta
  • CVSS:
root@kitploit:~
CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:L/A:L

Isso faz sentido.

Isso não era um SSRF não autenticado em toda a internet por si só.

Os privilégios exigidos eram Baixos porque o bug independente exigia um ator que pudesse configurar ou acionar um bloco Webhook / HTTP Request.

Mas dentro desse limite, o impacto era sério:

  • acesso a loopback
  • acesso a rede privada
  • acesso a metadados
  • e exfiltração de resposta através de logs

Isso é um problema SSRF forte por si só.

E fica ainda mais perigoso quando combinado com outros bugs que ampliam a alcançabilidade.


Por Que Isso Ainda Valia a Pena Ser Reportado

Algumas pessoas veem SSRF autenticado e imediatamente o subestimam.

Isso é um erro.

A verdadeira questão não é:

"O atacante estava logado?"

A verdadeira questão é:

"Esse atacante poderia fazer o servidor se conectar a algum lugar que o modelo de segurança deveria proibir?"

Aqui, a resposta foi sim.

O validador afirmava proteger:

  • serviços de metadados
  • loopback
  • faixas privadas RFC1918
  • faixas locais IPv6

Mas uma lacuna de resolução de hostname permitiu que esses mesmos destinos voltassem através de uma representação diferente.

Esse é exatamente o tipo de bug que merece um CVE.


Análise da Correção

A correção foi sólida porque corrigiu a fronteira real, não apenas um sintoma.

Na implementação corrigida, validateHttpReqUrl() foi alterada para resolver hostnames antes de aprovar a requisição.

O validador agora:

  • importa lookup de node:dns/promises
  • trata a validação como assíncrona
  • resolve hostnames não literais antes de permiti-los
  • analisa cada endereço resolvido
  • valida cada endereço resolvido contra as mesmas faixas bloqueadas

Essa é a correção certa porque muda a decisão de confiança de:

  • "o texto do hostname parece ok?"

para:

  • "o destino real resolve para um endereço permitido?"

Essa é a propriedade de segurança que deveria ter existido desde o início.

A remediação também adicionou cobertura de regressão para:

  • hostnames resolvendo para loopback
  • hostnames resolvendo para espaço RFC1918
  • hosts internos na lista de permissões para auto-hospedagem
  • preservação de proteções não contornáveis para metadados e alvos de loopback

Esse é o tipo de hardening que você quer em uma correção SSRF real:

  • a fronteira é corrigida
  • o comportamento pretendido é documentado no código
  • e os testes travam a classe

O problema foi resolvido no Typebot 3.16.0.


Divulgação

Este problema foi reportado de forma privada através do fluxo de relatórios de segurança do GitHub.

O relatório incluía:

  • a causa raiz em validateHttpReqUrl()
  • o caminho de execução downstream em executeHttpRequest()
  • uma estratégia de reprodução realista usando resolução de hostname para loopback/alvos privados
  • e uma demonstração autossuficiente para isolar a lacuna de validação

Os mantenedores aceitaram o problema, corrigiram a lógica de validação, e a vulnerabilidade foi posteriormente publicada como:

CVE-2026-34207

com a correção lançada no Typebot 3.16.0.


O Que Esse Bug Realmente Ensina

A lição chave aqui é simples:

decisões de segurança devem ser tomadas na mesma representação que a pilha de rede realmente usará.

Isso parece óbvio.

Mas muitas proteções SSRF falham exatamente porque não seguem essa regra.

  • Uma string de hostname parece segura.
  • O DNS muda o que ela significa.
  • A requisição ainda sai.

Isso é suficiente.

Este bug também reforça algo importante sobre revisão SSRF em geral:

  • filtragem de IP literal não é suficiente
  • listas negras de hostname não são suficientes
  • verificações de IP codificado não são suficientes

Se você não resolver e validar o destino real, seu filtro SSRF ainda está incompleto.

Essa é a verdadeira lição.


Pontos-Chave

  • Defesas SSRF falham quando a validação ocorre antes da resolução do destino
  • validação de texto do hostname não é a mesma coisa que validação de IP do destino
  • recursos de Webhook / HTTP Request são fronteiras de segurança reais
  • SSRF autenticado ainda pode ser de alta gravidade quando atinge metadados e serviços internos
  • um relatório forte conecta causa raiz e impacto, não apenas um ou outro
  • a correção estava correta porque moveu a decisão para o destino real resolvido

Palavras Finais

Esta vulnerabilidade não era sobre um payload sofisticado.

Era sobre fazer a pergunta certa sobre a fronteira.

No Typebot, o validador SSRF verificava o texto do hostname primeiro. O destino real era decidido mais tarde pelo DNS. O cliente de rede seguia o endereço resolvido.

Essa lacuna era o bug.

É por isso que isso se tornou CVE-2026-34207.

Corrigido no Typebot 3.16.0.

Baixar ferramenta