Dokploy: Command-Injection als Host-Root durch eine Member-Rolle über destination.testConnection

Ein in eine Organisation eingeladenes Konto mit Member-Rolle sendet einen einzigen Request an destination.testConnection, bricht mit einem Anführungszeichen aus einem rclone-Kommando aus und führt über den eingehängten Docker-Socket beliebige Befehle als root auf dem Host aus.

Advisory-ID: TP-2026-039
Produkt: Dokploy (Selbst-gehostete Open-Source-PaaS zur Verwaltung von Deployments über Docker Swarm und Traefik)
Schwachstellentyp: OS-Command-Injection und fehlende Autorisierungsprüfung (CWE-78, CWE-862)
CVE: CVE-2026-72868
CVSS 3.1: 9.9 (Kritisch) · CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:C/C:H/I:H/A:H
Hersteller-Advisory: GHSA-f6x8-vfwh-8hjr
Betroffene Versionen: <= 0.29.12
Behoben in: 0.29.13
Gemeldet: 18. Mai 2026

Zusammenfassung

Dokploy ist eine selbst-gehostete PaaS, die Deployments mehrerer Organisationen über Docker Swarm und Traefik verwaltet. Die tRPC-Mutation destination.testConnection setzt aus den vom Nutzer gelieferten S3-Feldern ein rclone-Kommando zusammen und übergibt es an eine Shell, ohne die Werte zu maskieren, sodass ein Anführungszeichen aus dem String ausbricht und beliebige Befehle anhängt. Der Endpunkt ist eigentlich der Rolle vorbehalten, die Ziele verwalten darf, doch die zentrale Berechtigungsprüfung überspringt für Konten mit Member-Rolle die eigentliche Autorisierung. Da der Dienst als uid 0 läuft und den Docker-Socket des Hosts eingehängt hat, führt ein einziger authentifizierter Request eines gewöhnlichen Member-Kontos zu beliebiger Codeausführung als root auf dem Host und damit zur Kompromittierung aller Organisationen derselben Installation. turingpoint hat die Kette Ende-zu-Ende live verifiziert und an den Hersteller gemeldet, der sie in 0.29.13 behoben hat.

Ursache

destination.testConnection baut ein rclone-Kommando, indem es die Felder accessKey, secretAccessKey, region, endpoint, provider und bucket in eine Template-Zeichenkette einsetzt und diese über execAsync an child_process.exec weiterreicht (apps/dokploy/server/api/routers/destination.ts:47-93). Die Werte werden in doppelte Anführungszeichen gesetzt, aber nie maskiert, sodass ein " das Literal schließt und die Shell den Rest der Eingabe als Befehle ausführt. Der Endpunkt ist mit withPermission("destination", "create") versehen, und die Member-Rolle trägt für diese Ressource ausdrücklich ein leeres Rechte-Array (packages/server/src/lib/access-control.ts), die Prüfung wird jedoch umgangen. checkPermission kehrt vorzeitig zurück, ohne role.authorize() aufzurufen, sobald alle angefragten Ressourcen enterprise-only sind, und dieser Rückgabepfad greift auch für die Member-Rolle statt nur für Owner und Admin (packages/server/src/services/permission.ts:84-89). Das Standard-Docker-Image und install.sh starten den Dienst als uid 0 und binden den Host-Socket /var/run/docker.sock ein, sodass ein von einem Member eingeschleuster Befehl als root läuft und über den Docker-Socket den Host erreicht.

Proof of Concept

Schematisch:

# Bob wurde als Member in die Organisation eingeladen und meldet sich an.
POST /api/trpc/destination.testConnection?batch=1
Content-Type: application/json
Origin: https://<host>

{"0":{"json":{"name":"x","provider":"S3","region":"us-east-1",
  "endpoint":"https://s3.amazonaws.com","bucket":"b","secretAccessKey":"s",
  "accessKey":"X\";<befehl>; echo \""}}}

Der Wert in accessKey schließt das in Anführungszeichen gesetzte rclone-Flag und lässt die Shell <befehl> als uid 0 im Dokploy-Container ausführen. Weil der Container den Docker-Socket des Hosts eingehängt hat, kann der eingeschleuste Befehl einen weiteren Container mit gemountetem Host-Dateisystem starten und so root-Rechte auf dem Host erlangen; turingpoint hat diese Kette live bis zu einer als root geschriebenen Datei auf dem Host bestätigt.

Auswirkung

  • Beliebige Betriebssystembefehle als uid 0 im Dokploy-Container, ausgelöst durch einen einzigen authentifizierten Request eines Kontos mit Member-Rolle.
  • Übernahme des Host-Systems als root über den in den Container eingehängten Docker-Socket.
  • Zugriff auf die Deployments und Klartext-Secrets aller anderen Organisationen derselben Dokploy-Installation.
  • Kein Audit-Eintrag im kostenlosen Tier, da die Audit-Protokollierung der Enterprise-Stufe vorbehalten ist.

Referenzen

Steckt so etwas in Ihrer Software?

Diese Schwachstelle hat unser Team im Rahmen seiner Arbeit gefunden. Lassen Sie Ihre Anwendungen von denselben Spezialisten prüfen, mit einem Penetrationstest von turingpoint.