Skip to content
KitploitKITPLOIT
StrumentiExploitsBlog
Log in
Invia
StrumentiExploitsBlog
Invia

Strumenti di Hacking, PenTest e Cybersecurity per il tuo Arsenale di Sicurezza!

Kitploit è una directory di strumenti di hacking, cybersecurity e pentesting. Scopri gli ultimi aggiornamenti dei progetti per trovare vulnerabilità, analizzare sistemi, automatizzare i test e rafforzare la tua sicurezza.

··Feed·Contatto·Privacy·© 2026 Kitploit

Directory degli strumenti

Categorie

Vedi tutte le categorie
Loading categories
CVE-2026-34207 — Il filtro SSRF controllava il testo dell'hostname, ma la destinazione effettiva veniva decisa successivamente dal DNS. Questo gap permetteva agli URL Webhook controllati dall'attaccante di raggiungere destinazioni di loopback, metadata e rete privata. | Kitploit
Strumenti/GitHubGitHub/0xmrma/cve-2026-34207
Analisi delle VulnerabilitàExploitSicurezza WebPenetration TestingPaper e RicercaApprendimento e Formazione
GitHub0xmrma/cve-2026-34207

CVE-2026-34207

Il filtro SSRF controllava il testo dell'hostname, ma la destinazione effettiva veniva decisa successivamente dal DNS. Questo gap permetteva agli URL Webhook controllati dall'attaccante di raggiungere destinazioni di loopback, metadata e rete privata.

Vedi Repository
63 mesi faNon ancora revisionato

Più Popolari

Vedi tutti →

Scopri gli strumenti più utilizzati dalla nostra community.

Esplora tutti gli strumenti

Sfoglia la nostra collezione di strumenti

Vedi tutti gli strumenti →
Condividi

CVE-2026-34207

Il filtro SSRF controllava il testo del nome host, ma la destinazione effettiva veniva decisa successivamente dal DNS. Questa lacuna permetteva agli URL Webhook controllati dall'attaccante di raggiungere destinazioni loopback, metadata e rete privata.

Introduzione

Ho trovato questo problema mentre esaminavo Typebot, un costruttore di chatbot open-source, con una semplice domanda di sicurezza in mente:

Cosa succede se la protezione SSRF convalida il testo del nome host, ma la destinazione reale viene decisa successivamente dal DNS?

In questo caso, quella domanda ha portato a un bug reale.

La protezione SSRF di Typebot per i blocchi Webhook / Richiesta HTTP convalidava solo:

  • la stringa URL,
  • i nomi host letterali bloccati,
  • e i formati IP letterali

Non risolveva i nomi host prima di autorizzare la richiesta.

Ciò significava che un nome host come ssrf-repro.example poteva sembrare innocuo durante la convalida, per poi risolversi in:

  • 127.0.0.1
  • 169.254.169.254
  • o spazio di rete RFC1918/privato

ed essere comunque recuperato dal client HTTP backend.

Questo problema è diventato CVE-2026-34207.

Typebot: Typebot su GitHub
CVE: CVE-2026-34207
Corretto in: 3.16.0

Questo ha interessato Typebot, una piattaforma chatbot open-source ampiamente utilizzata. Sul suo sito ufficiale, Typebot si presenta come affidabile per oltre 650 aziende in tutto il mondo. Il sito pubblicizza anche oltre 2 milioni di chat mensili e oltre 1,5 milioni di bot pubblicati.

photo0

Catena d'attacco

URL Webhook controllato dall'attaccante -> il nome host supera la convalida SSRF solo letterale -> nessuna risoluzione DNS prima della decisione di autorizzazione -> il client HTTP backend risolve il nome host in una destinazione interna -> la richiesta lato server raggiunge loopback / metadata / rete privata -> i dati della risposta diventano disponibili tramite i log di esecuzione


Cosa fa Typebot

Typebot è un costruttore di chatbot.

Permette agli utenti di creare flussi che possono:

  • fare domande
  • raccogliere input strutturati
  • chiamare servizi esterni
  • concatenare logiche di business
  • e attivare richieste HTTP in uscita tramite blocchi Webhook / Richiesta HTTP

Ciò significa che l'esecuzione di richieste in uscita è un vero e proprio confine di sicurezza.

La domanda importante qui non era se Typebot supportasse i blocchi Webhook.

La vera domanda era:

La protezione SSRF convalida la destinazione effettiva a cui il server si collegherà, o solo il testo del nome host che appare nell'URL?

In questo caso, convalidava solo prima la forma testuale.

Questo è stato l'errore.


Perché questa superficie valeva la pena di essere esaminata

Le difese SSRF falliscono in modi molto prevedibili.

La maggior parte delle volte, gli errori interessanti non sono:

  • "ti sei dimenticato di bloccare 169.254.169.254"
  • o "ti sei dimenticato di bloccare localhost"

Gli errori più forti sono errori di confine:

  • la convalida avviene prima della canonicalizzazione
  • la convalida avviene prima dei reindirizzamenti
  • la convalida avviene prima della risoluzione DNS
  • la convalida avviene su una rappresentazione, ma lo stack di rete ne usa un'altra

Qui era il posto giusto dove guardare.

Typebot aveva già una logica di hardening SSRF per IP metadata letterali, loopback, intervalli privati e trucchi IP codificati.

Questo rendeva ovvia la domanda successiva:

Cosa succede se il nome host non è letteralmente pericoloso, ma si risolve in una destinazione pericolosa successivamente?

Questo è esattamente ciò che è successo.


Causa principale

Il problema principale era la convalida della destinazione basata sul testo del nome host invece che sull'indirizzo IP risolto.

Nell'implementazione vulnerabile, validateHttpReqUrl():

  • analizzava l'URL
  • permetteva solo http: e https:
  • bloccava un breve elenco di nomi host letterali come metadata.google.internal, metadata.goog, metadata e localhost
  • rilevava trucchi IP decimali / esadecimali / ottali letterali
  • analizzava indirizzi IPv4 / IPv6 letterali
  • convalidava l'indirizzo solo se il nome host stesso era già un IP letterale

Questa è la parte importante.

Se il nome host era un valore normale come:

ssrf-repro.example

allora parseIPAddress(hostname) restituiva null, e il validatore si fermava lì.

Non avveniva alcuna risoluzione DNS prima dell'approvazione.

Quindi la logica vulnerabile si riduceva effettivamente a:

const ip = parseIPAddress(hostname);
if (ip) {
  validateIPAddress(ip);
}

Ciò significa che:

  • gli IP pericolosi letterali erano bloccati
  • gli IP pericolosi codificati erano bloccati
  • ma i nomi host che si risolvevano in IP pericolosi non lo erano

La seconda metà del bug era nel percorso di esecuzione.

In executeHttpRequest(), Typebot eseguiva prima la convalida e poi successivamente effettuava la richiesta effettiva con ky(request.url, ...).

Quindi la sequenza era:

  • convalidare la stringa URL
  • accettare il nome host
  • successivamente risolvere il nome host durante la richiesta in uscita reale
  • connettersi alla destinazione interna risolta

Questa è l'intera vulnerabilità.


Perché questo è un problema di sicurezza, non solo un filtraggio incompleto

La distinzione importante è dove è stata presa la decisione di fiducia.

Molti bug sembrano piccoli se li descrivi male.

Se descrivi questo come:

"il filtro del nome host era incompleto"

sembra un problema di qualità.

Questo non è il vero problema.

Il vero problema era:

  • il server prendeva una decisione di sicurezza prima di conoscere la destinazione reale
  • lo stack di rete si connetteva successivamente da qualche altra parte
  • e l'applicazione trattava quella richiesta come valida

Questa non è una debolezza di filtraggio estetica.

È un fallimento del confine di fiducia.

E poiché l'esecutore HTTP registrava i dati di risposta nei log di esecuzione, il problema non era nemmeno cieco nei casi più forti.

Quindi non era solo:

  • "si è verificato traffico interno inaspettato"

Era:

  • si è verificato traffico interno
  • e l'attaccante poteva spesso recuperare prove e contenuto della risposta attraverso il normale comportamento dell'applicazione

Questa è una vera vulnerabilità SSRF.


Prova di concetto

Ho usato due livelli di prova perché dimostravano due cose diverse.

PoC 1: demo locale autonoma del resolver

La prima PoC isolava pulitamente la causa principale.

Ho usato un piccolo harness locale che:

  • avviava un server HTTP loopback su 127.0.0.1
  • convalidava un URL come http://ssrf-repro.example:18080/...
  • usava un resolver controllato in modo che ssrf-repro.example si risolvesse in 127.0.0.1
  • poi eseguiva la richiesta

Questo dimostrava l'esatto difetto:

  • la convalida passava perché il nome host non era un valore letterale bloccato
  • la richiesta successiva raggiungeva comunque il loopback

L'output catturato mostrava:

  • risultato del validatore: passato
  • risultato dell'esecuzione della richiesta: loopback raggiunto
  • corpo della risposta restituito dal servizio loopback

Questo dimostrava direttamente la lacuna di convalida.


PoC 2: percorso di esecuzione reale di Typebot

La seconda PoC mostrava il bug attraverso il percorso di funzionalità effettivo che conta.

La riproduzione più semplice era:

  1. Mappare un nome host benigno sul loopback della macchina dove Typebot backend risolve il DNS
  2. Avviare un servizio HTTP locale
  3. Creare un blocco Webhook che punta a quel nome host benigno
  4. Attivare il blocco attraverso un normale percorso di anteprima autenticata o di esecuzione live
Scarica lo strumento