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-34048 — Route di bootstrap del terminale solo per admin controllate solo per lo stato di login, che consentono a un normale membro del team di guidare il backend del terminale in tempo reale di Coolify ed eseguire comandi sui server del team. | Kitploit
Strumenti/GitHubGitHub/0xmrma/cve-2026-34048
Autenticazione e AutorizzazioneEscalation di PrivilegiAnalisi delle VulnerabilitàExploitSfruttamento di Applicazioni WebPenetration TestingSicurezza CloudCommand and ControlRed Teaming
GitHub0xmrma/cve-2026-34048

CVE-2026-34048

82 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

Route di bootstrap del terminale solo per admin controllate solo per lo stato di login, che consentono a un normale membro del team di guidare il backend del terminale in tempo reale di Coolify ed eseguire comandi sui server del team.

Vedi Repository

CVE-2026-34048

Le route di bootstrap del terminale riservate agli amministratori controllavano solo lo stato di login, permettendo a un normale membro del team di utilizzare il backend del terminale in tempo reale di Coolify ed eseguire comandi sui server del team.

Introduzione

Ho trovato questo problema mentre esaminavo Coolify, un PaaS self-hosted open-source, con una domanda di sicurezza molto diretta in mente:

L'accesso al terminale è effettivamente imposto al confine di fiducia del backend, o solo nell'interfaccia utente?

In questo caso, la risposta è stata negativa.

Coolify intendeva limitare l'accesso al terminale agli amministratori e proprietari del team, ma le route di bootstrap del terminale in tempo reale controllavano solo se l'utente era loggato. Ciò permetteva a un membro del team con privilegi bassi di soddisfare i controlli di fiducia del websocket del terminale e raggiungere l'esecuzione di comandi sui server del team.

Ho validato questo end-to-end in un laboratorio locale costruito dalla revisione vulnerabile e successivamente l'ho segnalato privatamente. Il problema ha ricevuto l'assegnazione CVE-2026-34048 con:

CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:C/C:H/I:H/A:H

Coolify: Coolify su GitHub
CVE: CVE-2026-34048

Questo ha interessato Coolify, un PaaS self-hosted open-source. Sul suo sito ufficiale, Coolify dichiara di avere 3.641+ clienti cloud, e si presenta come una piattaforma per distribuire siti web, database, applicazioni web e 280+ servizi con un clic. Il changelog ufficiale della v4.0 afferma inoltre che migliaia di aziende e persone hanno utilizzato Coolify in produzione per 1-2 anni.

photo0


Catena di Attacco

sessione membro del team con privilegi bassi -> /terminal/auth e /terminal/auth/ips controllano solo lo stato di login -> websocket in tempo reale si fida di queste risposte -> il membro enumera il server del team e l'UUID visibile della chiave SSH -> /terminal/ws accetta la sessione -> viene generato un PTY basato su SSH -> accesso shell sul server del team


Cosa Fa Coolify

Coolify è un PaaS self-hosted e una piattaforma di deployment.

Gestisce:

  • server
  • applicazioni
  • deployment
  • chiavi private
  • permessi del team
  • accesso al terminale dell'infrastruttura gestita

L'ultima capacità è quella importante qui.

Una volta che una piattaforma può aprire terminali su host gestiti, il suo modello di autorizzazione non è più solo logica applicativa. Diventa un confine di fiducia dell'infrastruttura.

La domanda importante non era se la pagina /terminal sembrasse riservata agli amministratori.

La vera domanda era:

Il percorso del terminale nel backend impone effettivamente lo stesso confine di autorizzazione quando viene creata la sessione websocket?

In questo caso, non lo faceva.


Perché Questo Bug Meritava Attenzione

Le funzionalità del terminale sono tra le superfici di maggior valore nel software per infrastrutture.

Perché?

Perché qualsiasi disallineamento tra:

  • autorizzazione UI
  • autorizzazione backend
  • logica di bootstrap websocket
  • esecuzione di comandi sull'host

può trasformare un normale utente dell'applicazione in un operatore con accesso shell.

È esattamente per questo che valeva la pena testare questa superficie.

Non cercavo crash casuali o bug di permessi estetici.

Cercavo una classe di fallimento più forte:

Una funzionalità riservata agli amministratori si basa su un controllo di fiducia del backend più debole di quanto suggerisca l'UI?

Quella era la domanda giusta.


Il Confine Su Cui Mi Sono Concentrato

Non ho affrontato Coolify fuzzando endpoint casuali sperando in qualcosa di interessante.

Il percorso più forte era identificare prima il confine a più alto rischio.

Per Coolify, quel confine era il flusso di lavoro del terminale:

  • l'UI dice che l'accesso al terminale è limitato
  • il servizio terminale è basato su websocket
  • i servizi websocket di solito hanno logiche di bootstrap separate per la fiducia
  • i comandi del terminale passano infine dallo stato dell'applicazione all'esecuzione sull'host

Questo rendeva le route di bootstrap il posto giusto dove guardare.

Ed è lì che si trovava il problema.


Causa Principale

La causa principale era un disallineamento di autorizzazione tra l'UI del terminale e le route di bootstrap del websocket del terminale.

Alla revisione vulnerabile:

  • GET /terminal era protetto da can.access.terminal
  • POST /terminal/auth controllava solo auth()->check()
  • POST /terminal/auth/ips controllava solo auth()->check()

Ciò significa che l'UI era bloccata dall'autorizzazione del terminale, ma il confine di fiducia del backend era bloccato dalla semplice presenza di una sessione autenticata.

Il servizio in tempo reale si fidava poi completamente di queste due route.

In docker/coolify-realtime/terminal-server.js:

  • verifyClient() inviava POST a /terminal/auth
  • la configurazione della sessione websocket inviava POST a /terminal/auth/ips
  • il gestore websocket accettava l'input di comando del terminale fornito dall'attaccante dopo aver controllato solo se l'host di destinazione appariva nell'elenco di host restituito

Questa è l'intera catena del bug.

Perché è sfruttabile

Perché un normale membro del team poteva costruire gli input necessari dalla superficie applicativa regolare:

  • /servers esponeva UUID di server visibili
  • /server/{uuid} esponeva ip, user e port in campi form renderizzati
  • /security/private-key esponeva UUID di chiavi private del team visibili
  • il percorso del terminale faceva riferimento alle chiavi tramite percorsi deterministici della forma:
/var/www/html/storage/app/ssh/keys/ssh_key@<uuid>

Quindi il percorso di sfruttamento era diretto:

  • accedi come membro del team non amministratore
  • chiama /terminal/auth
  • chiama /terminal/auth/ips
  • enumera un server visibile
  • enumera un UUID di chiave visibile
  • connettiti a /terminal/ws
  • invia la stessa forma di comando SSH che il backend si aspetta
  • ricevi output shell da un host del team

Non è un disallineamento teorico. È un fallimento pratico dell'autorizzazione del backend.


Cosa Rende Questo un Problema di Sicurezza, Non Solo un Disallineamento dell'UI

La distinzione importante è la fiducia del backend e l'esecuzione dei comandi.

Molti bug appaiono come:

  • "il pulsante è nascosto"
  • "la pagina è bloccata"
  • "l'UI dice che non dovresti essere qui"

Da solo non basta.

La vera domanda è:

L'utente con privilegi inferiori può comunque soddisfare i controlli di fiducia del backend che contano?

In questo caso, la risposta era sì.

Questo non era:

  • un menu rotto
  • un controllo frontend mancante
  • un problema di routing estetico

Era:

  • autorizzazione di bootstrap websocket troppo debole
  • autorizzazione dell'host del terminale derivata da quel confine di fiducia debole
  • accesso shell reale sull'infrastruttura gestita

Ecco perché era un vero problema di sicurezza.


PoC

Ho validato questo in un laboratorio locale controllato costruito da:

06f60c9a98bead0c932c6adf7fd43a45d9149048

Il laboratorio utilizzava:

  • URL base: http://127.0.0.1:18000
  • account membro con privilegi bassi: [email protected]
  • server di destinazione: localhost -> coolify-testing-host:22 as root
  • UUID chiave visibile: ssh
  • endpoint websocket: ws://127.0.0.1:6002/terminal/ws

Passo 1: conferma il confine UI

L'account membro non doveva avere accesso al terminale tramite la normale UI per amministratori.

Questo stabiliva il confine di sicurezza previsto.

Passo 2: chiama direttamente le route di bootstrap

Usando la sessione del membro, ho inviato:

  • POST /terminal/auth
  • POST /terminal/auth/ips

Entrambe hanno avuto successo.

/terminal/auth/ips ha restituito host autorizzati al terminale, inclusi:

Scarica lo strumento