Chartbrew: Beliebige Dateilöschung als Root über SSL/SSH-Pfadfelder in Datenverbindungen

Chartbrews Verbindungslöschung ruft fs.unlink auf vier vom Nutzer kontrollierbare Pfadfelder ohne Einschränkung auf. Ein authentifizierter Angreifer setzt einen absoluten Pfad in ein SSL- oder SSH-Feld, löscht die Verbindung und entfernt damit jede beliebige Datei auf dem Server einschließlich .env und Anwendungsquellcode.

Advisory-ID: TP-2026-058
Produkt: Chartbrew (Open-Source-Business-Intelligence-Plattform für Datenvisualisierung, self-hosted)
Schwachstellentyp: Externes Steuern von Dateinamen oder Pfad (CWE-73)
CVE: CVE-2026-85736
CVSS 3.1: 8.1 (Hoch) · CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:N/I:H/A:H
Hersteller-Advisory: GHSA-p5h6-f969-jpfv
Betroffene Versionen: <= 5.2.2
Behoben in: 5.2.3
Gemeldet: 16. Juli 2026

Zusammenfassung

Chartbrew ist eine self-hosted Open-Source-Business-Intelligence-Plattform für Datenvisualisierung, deren removeConnection-Funktion beim Löschen einer Datenverbindung fs.unlink auf die vier Pfadfelder sslCa, sslCert, sslKey und sshPrivateKey ohne Pfadeinschränkung aufruft (server/controllers/ConnectionController.js:159-176). Die Erstellungs- und Aktualisierungsendpunkte setzen diese vier Spalten direkt aus dem Request-Body: sanitizeConnectionWriteData entfernt nur allowPrivateHost und leere SSH-Secrets, nicht die Pfadfelder (ConnectionController.js:9-22). sslCa, sslCert und sslKey sind einfache String-Spalten; sshPrivateKey ist eine verschlüsselte Spalte, die den Pfad des Angreifers hin und zurück durchreicht. Jeder registrierte Nutzer ist teamOwner seines eigenen Teams und besitzt Erstellungs- und Löschrechte für eigene Verbindungen. Da der Container als Root läuft, löscht ein authentifizierter Angreifer jede beliebige Datei auf dem Server.

Ursache

removeConnection führt fs.unlink auf connection.sslCa, sslCert, sslKey und sshPrivateKey bei jeder Verbindungslöschung bedingungslos aus (server/controllers/ConnectionController.js:159-176). sanitizeConnectionWriteData filtert nur allowPrivateHost und leere SSH-Secrets und lässt die vier Pfadfelder per Mass-Assignment aus dem Request-Body beschreibbar (ConnectionController.js:9-22). sslCa, sslCert und sslKey sind einfache STRING-Spalten, und der Setter/Getter von sshPrivateKey reicht den Rohpfad durch, sodass POST und PUT /team/:team_id/connections einen vom Angreifer gewählten absoluten Pfad unverändert speichern. POST erfordert createOwn und DELETE erfordert deleteOwn, beides gehalten durch die teamOwner-Rolle, die jede Selbstregistrierung auf ihrem eigenen Team erhält. Der Container-Prozess läuft als uid 0, sodass das unlink jede Datei einschließlich /code/.env und Anwendungsquellcode trifft.

Proof of Concept

# Verbindung anlegen, deren sslCa auf eine Zieldatei zeigt:
POST /team/<T>/connections HTTP/1.1
Authorization: Bearer <user>
{"name":"x","type":"mysql","team_id":<T>,"sslCa":"/tmp/marker.txt"}

HTTP/1.1 200 OK
{"id":<C>,"sslCa":"/tmp/marker.txt", ...}

# Verbindung loeschen, um das fs.unlink auszuloesen:
DELETE /team/<T>/connections/<C> HTTP/1.1
Authorization: Bearer <user>

HTTP/1.1 200 OK
{"removed":true}

# /tmp/marker.txt ist geloescht.
# Das verschluesselte sshPrivateKey-Feld erreicht dasselbe unlink;
# ein Pfad auf Anwendungsquellcode loescht diese Datei.

Auswirkung

  • Beliebige Dateilöschung als Root: Integritäts- und Verfügbarkeitsbeeinträchtigung.
  • Löschung von /code/.env (Verschlüsselungsschlüssel und Datenbank-Credentials) oder Anwendungsquellcode bricht die Instanz.
  • Niedrigste legitime Rolle in der Standardkonfiguration; duplicateConnection bietet einen zweiten Auslöser.

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.