Chartbrew: Blinde NoSQL-Injection über nicht-escaped Datumsvariable in geteilten Charts

Chartbrew setzt Datumsvariablen ohne Escaping in MongoDB-Abfragen ein. Über die öffentliche Embed-Route für geteilte Charts injiziert ein anonymer Angreifer Filterbedingungen und extrahiert zeichenweise beliebige Felder der abgefragten Collection, einschließlich Passwort-Hashes.

Advisory-ID: TP-2026-057
Produkt: Chartbrew (Open-Source-Business-Intelligence-Plattform für Datenvisualisierung, self-hosted)
Schwachstellentyp: Unzureichende Neutralisierung spezieller Elemente in Datenabfrage-Logik / NoSQL Injection (CWE-943)
CVE: CVE-2026-85726
CVSS 3.1: 7.5 (Hoch) · CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:N/A:N
Hersteller-Advisory: GHSA-mr45-2r9x-cgwf
Betroffene Versionen: <= 5.2.2
Behoben in: noch nicht veröffentlicht (Fix auf master)
Gemeldet: 16. Juli 2026

Zusammenfassung

Chartbrew ist eine self-hosted Open-Source-Business-Intelligence-Plattform für Datenvisualisierung, deren geteilte Charts über die tokenlose Embed-Route GET /chart/:share_string/embedded anonym erreichbar sind. Die Funktion applyMongoVariables setzt Chart-Query-Variablen vom Typ date per String(runtimeValue) ohne Escaping in MongoDB-Query-Strings ein (server/sources/plugins/mongodb/mongodb.protocol.js:143-146), während die Typen string, number und boolean escaped oder konvertiert werden. Der nachgelagerte Validator validateMongoQuery (server/modules/validateMongoQuery.js) erlaubt MongoDB-Operatoren ($regex/$ne/$gt) als String-Schlüssel und einen //-Zeilenkommentar, sodass ein Angreifer aus dem Datums-Literal ausbricht und Filterbedingungen in denselben find()-Aufruf injiziert. Die Embed-Route leitet jeden nicht-speziellen Query-Parameter als Laufzeitvariable weiter, ohne Authentifizierung. Ergebnis: Ein anonymes blindes Boolean-Orakel extrahiert nicht-projizierte Felder (z.B. Passwort-Hashes) aus der Collection, die das geteilte Chart abfragt.

Ursache

Für eine Variablenbindung vom Typ date innerhalb eines zitierten Platzhalters setzt applyMongoVariables den Wert per String(runtimeValue) ohne Escaping ein (server/sources/plugins/mongodb/mongodb.protocol.js:143-146), anders als der String-Zweig, der Anführungszeichen escaped. Der nachgelagerte Validator validateMongoQuery verlangt eine einzelne db.collection().method()-Aufrufkette mit literalen Argumenten, erlaubt aber MongoDB-Operatoren als String-Schlüssel und //-Kommentare (server/modules/validateMongoQuery.js). Ein vom Angreifer gelieferter Datumswert bricht aus dem String-Literal aus, fügt $regex- oder $ne-Bedingungen in dasselbe find()-Argument ein und kommentiert den Template-Rest aus. ChartController.findByShareString prüft nur chart.public || chart.shareable mit user=null und leitet jeden nicht-speziellen Query-Parameter als Variable weiter (server/controllers/ChartController.js:1135-1188,1259), erreichbar anonym über GET /chart/:share_string/embedded (server/api/ChartRoute.js:754). Die zurückgegebene Zeilenanzahl des Charts ist ein Boolean-Orakel, das die zeichenweise Extraktion jedes Feldes der Collection ermöglicht.

Proof of Concept

# Injection einer $regex-Bedingung ueber die Datumsvariable d:
GET /chart/<share_string>/embedded?d=2020-01-01", "password": {"$regex":"^aSECRET"} })//

HTTP/1.1 200 OK
labels ["public1"], data [1]   (Treffer: TRUE)

GET /chart/<share_string>/embedded?d=2020-01-01", "password": {"$regex":"^z"} })//

HTTP/1.1 200 OK
labels ["No data"], data [0]   (kein Treffer: FALSE)

# Ohne bekannten Datumswert, das fixierte Feld neutralisieren:
GET /chart/<share_string>/embedded?d=ZZZ", "createdAt": {"$ne": null}, "password": {"$regex":"^a"} })//

HTTP/1.1 200 OK
labels ["public1"], data [1]

Auswirkung

  • Anonymes blindes Lesen jedes Feldes der Collection, die ein geteiltes Chart abfragt, einschließlich Geheimnisse die das Chart nie anzeigt.
  • Nur Lesezugriff, eine Collection pro Request.
  • Kein Account und kein bekannter Feldwert erforderlich.

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.