Skip to content
KitploitKITPLOIT
ToolsExploitsBlog
Log in
Einreichen
ToolsExploitsBlog
Einreichen

Hacking-, PenTest- und Cybersicherheits-Tools für Ihr Sicherheitsarsenal!

Kitploit ist ein Verzeichnis von Hacking-, Cybersicherheits- und Pentesting-Tools. Entdecken Sie die neuesten Projekt-Updates, um Schwachstellen zu finden, Systeme zu analysieren, Tests zu automatisieren und Ihre Sicherheit zu stärken.

··Feeds·Kontakt·Datenschutz·© 2026 Kitploit

Tool-Verzeichnis

Kategorien

Alle Kategorien anzeigen
Loading categories
CVE-2026-34048 — Nur für Administratoren vorgesehene Terminal-Bootstrap-Routen, die nur den Anmeldestatus prüfen, ermöglichen es einem normalen Teammitglied, das Echtzeit-Terminal-Backend von Coolify zu steuern und Befehle auf Teamservern auszuführen. | Kitploit
Tools/GitHubGitHub/0xmrma/cve-2026-34048
Authentifizierung & AutorisierungPrivilege EscalationSchwachstellenanalyseExploitationWebanwendungs-ExploitationPenetrationstestsCloud-SicherheitCommand and ControlRed Teaming
GitHub0xmrma/cve-2026-34048

CVE-2026-34048

8vor 2 MonatenNoch nicht geprüft

Beliebteste

Alle anzeigen →

Entdecken Sie die meistgenutzten Tools unserer Community.

Alle Tools erkunden

Durchsuchen Sie unsere Tool-Sammlung

Alle Tools anzeigen →
Teilen

Nur für Administratoren vorgesehene Terminal-Bootstrap-Routen, die nur den Anmeldestatus prüfen, ermöglichen es einem normalen Teammitglied, das Echtzeit-Terminal-Backend von Coolify zu steuern und Befehle auf Teamservern auszuführen.

Repository anzeigen

CVE-2026-34048

Administrator-exklusive Terminal-Bootstrap-Routen prüften nur den Anmeldestatus, sodass ein normales Teammitglied das Echtzeit-Terminal-Backend von Coolify ansteuern und Befehle auf Team-Servern ausführen konnte.

Intro

Ich fand dieses Problem bei der Überprüfung von Coolify, einer quelloffenen, selbst gehosteten PaaS, mit einer sehr direkten Sicherheitsfrage im Hinterkopf:

Wird der Terminalzugriff tatsächlich an der Backend-Vertrauensgrenze durchgesetzt oder nur in der UI?

In diesem Fall war die Antwort schlecht.

Coolify beabsichtigte, den Terminalzugriff auf Team-Administratoren und -Besitzer zu beschränken, aber die Echtzeit-Terminal-Bootstrap-Routen prüften nur, ob der Benutzer angemeldet war. Das erlaubte einem Teammitglied mit niedrigen Berechtigungen, die Websocket-Terminal-Vertrauensprüfungen zu erfüllen und die Befehlsausführung auf Team-Servern zu erreichen.

Ich habe dies Ende-zu-Ende in einem lokalen Labor validiert, das aus der anfälligen Revision erstellt wurde, und es später privat gemeldet. Das Problem wurde als CVE-2026-34048 zugewiesen mit:

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

Coolify: Coolify auf GitHub
CVE: CVE-2026-34048

Dies betraf Coolify, eine quelloffene, selbst gehostete PaaS. Auf seiner offiziellen Website gibt Coolify an, dass es 3.641+ Cloud-Kunden hat, und präsentiert sich als Plattform zum Bereitstellen von Websites, Datenbanken, Webanwendungen und 280+ One-Click-Diensten. Das offizielle v4.0-Changelog gibt außerdem an, dass Tausende von Unternehmen und Personen Coolify seit 1-2 Jahren in der Produktion nutzen.

photo0


Angriffskette

Sitzung eines Teammitglieds mit niedrigen Berechtigungen -> /terminal/auth und /terminal/auth/ips prüfen nur den Anmeldestatus -> Echtzeit-Websocket vertraut diesen Antworten -> Mitglied enumeriert Team-Server und sichtbare SSH-Key-UUID -> /terminal/ws akzeptiert die Sitzung -> SSH-gestützter PTY wird erzeugt -> Shell-Zugriff auf Team-Server


Was Coolify tut

Coolify ist eine selbst gehostete PaaS- und Bereitstellungsplattform.

Es verwaltet:

  • Server
  • Anwendungen
  • Bereitstellungen
  • Private Keys
  • Team-Berechtigungen
  • Terminalzugriff auf verwaltete Infrastruktur

Die letzte Fähigkeit ist hier die Wichtige.

Sobald eine Plattform Terminals auf verwalteten Hosts öffnen kann, ist ihr Autorisierungsmodell nicht mehr nur Anwendungslogik. Es wird zu einer Infrastruktur-Vertrauensgrenze.

Die wichtige Frage war nicht, ob die Seite /terminal nur für Administratoren aussah.

Die eigentliche Frage war:

Erzwingt der Backend-Terminalpfad tatsächlich dieselbe Autorisierungsgrenze, wenn die Websocket-Sitzung erstellt wird?

In diesem Fall tat er es nicht.


Warum dieser Bug einen Blick wert war

Terminal-Funktionen gehören zu den wertvollsten Oberflächen in Infrastruktursoftware.

Warum?

Weil jede Diskrepanz zwischen:

  • UI-Autorisierung
  • Backend-Autorisierung
  • Websocket-Bootstrap-Logik
  • Host-Befehlsausführung

einen normalen Anwendungsbenutzer in einen shell-fähigen Operator verwandeln kann.

Genau deshalb war diese Oberfläche einen Test wert.

Ich suchte nicht nach zufälligen Abstürzen oder kosmetischen Berechtigungsfehlern.

Ich suchte nach einer stärkeren Fehlerklasse:

Beruht eine Administrator-exklusive Funktion auf einer schwächeren Backend-Vertrauensprüfung als die UI vermuten lässt?

Das war die richtige Frage.


Die Grenze, auf die ich mich konzentrierte

Ich bin nicht an Coolify herangegangen, indem ich zufällige Endpunkte gefuzzt und auf etwas Interessantes gehofft habe.

Der stärkere Weg war, zuerst die risikoreichste Grenze zu identifizieren.

Für Coolify war diese Grenze der Terminal-Workflow:

  • die UI sagt, der Terminalzugriff sei eingeschränkt
  • der Terminaldienst ist websocket-basiert
  • Websocket-Dienste haben normalerweise separate Bootstrap-Vertrauenslogik
  • Terminalbefehle überschreiten letztlich die Grenze vom Anwendungszustand zur Host-Ausführung

Das machte die Bootstrap-Routen zum richtigen Ort zum Suchen.

Und dort war das Problem.


Grundursache

Die Grundursache war eine Autorisierungsdiskrepanz zwischen der Terminal-UI und den Terminal-Websocket-Bootstrap-Routen.

In der anfälligen Revision:

  • GET /terminal war durch can.access.terminal geschützt
  • POST /terminal/auth prüfte nur auth()->check()
  • POST /terminal/auth/ips prüfte nur auth()->check()

Das bedeutet, dass die UI durch die Terminal-Autorisierung abgeschirmt war, aber die Backend-Vertrauensgrenze durch die bloße Anwesenheit einer authentifizierten Sitzung abgeschirmt wurde.

Der Echtzeitdienst vertraute dann diesen beiden Routen vollständig.

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

  • verifyClient() POSTete an /terminal/auth
  • Der Websocket-Sitzungsaufbau POSTete an /terminal/auth/ips
  • Der Websocket-Handler akzeptierte vom Angreifer bereitgestellte Terminalbefehleingaben, nachdem er nur geprüft hatte, ob der Zielhost in der zurückgegebenen Hostliste erschien

Das ist die gesamte Bug-Kette.

Warum dies ausnutzbar ist

Weil ein normales Teammitglied die benötigten Eingaben aus der regulären Anwendungsoberfläche abgreifen konnte:

  • /servers zeigte sichtbare Server-UUIDs
  • /server/{uuid} zeigte ip, user und port in gerenderten Formularfeldern
  • /security/private-key zeigte sichtbare Team-Private-Key-UUIDs
  • Der Terminalpfad referenzierte Keys über deterministische Pfade der Form:
/var/www/html/storage/app/ssh/keys/ssh_key@<uuid>

Der Exploit-Pfad war also unkompliziert:

  • als Nicht-Admin-Teammitglied anmelden
  • /terminal/auth aufrufen
  • /terminal/auth/ips aufrufen
  • einen sichtbaren Server enumerieren
  • eine sichtbare Key-UUID enumerieren
  • mit /terminal/ws verbinden
  • dieselbe SSH-Befehlsform senden, die das Backend erwartet
  • Shell-Ausgabe von einem Team-Host empfangen

Das ist keine theoretische Diskrepanz. Das ist ein praktischer Backend-Autorisierungsfehler.


Was dies zu einem Sicherheitsproblem macht, nicht nur zu einer UI-Diskrepanz

Der wichtige Unterschied ist Backend-Vertrauen und Befehlsausführung.

Viele Bugs sehen so aus:

  • "der Button ist ausgeblendet"
  • "die Seite ist blockiert"
  • "die UI sagt, du solltest hier nicht sein"

Das allein reicht nicht.

Die eigentliche Frage ist:

Kann der Benutzer mit niedrigeren Berechtigungen trotzdem die relevanten Backend-Vertrauensprüfungen erfüllen?

Hier war die Antwort ja.

Dies war nicht:

  • ein kaputtes Menü
  • eine fehlende Frontend-Prüfung
  • ein kosmetisches Routing-Problem

Es war:

  • Websocket-Bootstrap-Autorisierung zu schwach
  • Terminal-Host-Autorisierung, abgeleitet von dieser schwachen Vertrauensgrenze
  • tatsächlicher Shell-Zugriff auf verwaltete Infrastruktur

Deshalb war dies ein echtes Sicherheitsproblem.


PoC

Ich habe dies in einem kontrollierten lokalen Labor validiert, das aus folgendem Commit erstellt wurde:

06f60c9a98bead0c932c6adf7fd43a45d9149048

Das Labor verwendete:

  • Basis-URL: http://127.0.0.1:18000
  • Konto eines Teammitglieds mit niedrigen Berechtigungen: [email protected]
  • Zielserver: localhost -> coolify-testing-host:22 as root
  • Sichtbare Key-UUID: ssh
  • Websocket-Endpunkt: ws://127.0.0.1:6002/terminal/ws

Schritt 1: Bestätige die UI-Grenze

Das Mitgliedskonto war nicht dazu bestimmt, über die normale Admin-UI Terminalzugriff zu haben.

Das legte die erwartete Sicherheitsgrenze fest.

Schritt 2: Rufe die Bootstrap-Routen direkt auf

Mit der Mitgliedssitzung sandte ich:

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

Beide waren erfolgreich.

/terminal/auth/ips gab terminal-autorisierte Hosts zurück, darunter:

coolify-testing-host
host.docker.internal
localhost
127.0.0.1

Das bewies, dass die Backend-Bootstrap-Routen der Mitgliedssitzung vertrauten.

Schritt 3: Enumeriere Server- und Key-Metadaten

Tool herunterladen