Chartbrew: Offenlegung privater Chart-Daten durch gefälschte Share-Tokens
Chartbrew signiert und verifiziert Share-Tokens mit demselben fest einkodierten Standardschlüssel, der auch für die Authentifizierung verwendet wird. Ein anonymer Angreifer fälscht ein Token und liest beliebige private Chart-Daten aus, auch per Aufzählung fortlaufender IDs ohne einen Share-Link zu kennen.
Advisory-ID: TP-2026-056
Produkt: Chartbrew (Open-Source-Business-Intelligence-Plattform für Datenvisualisierung, self-hosted)
Schwachstellentyp: Improper Verification of Cryptographic Signature (CWE-347)
CVE: CVE-2026-85708
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-3chp-cr6f-hp63
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 öffentliche Share- und Embed-Tokens mit settings.secret (CB_SECRET) als primärem Schlüssel signiert und verifiziert werden, ohne eine algorithms-Allowlist zu setzen (server/controllers/ChartController.js:1343 Signierung / :1208 Verifizierung; server/controllers/ProjectController.js:433). Der Chart-Zweig von findBySharePolicy prüft nur sub.type==="Chart" und sub.id===sharePolicy.entity_id, ohne ein project.public- oder Sichtbarkeits-Gate, und liefert chartData zurück. checkFilterAccess akzeptiert dasselbe gefälschte Token für POST /project/:project_id/chart/:chart_id/filter und verwendet dabei ausschließlich sequenzielle Integer-IDs. Da CB_SECRET den statischen Standardwert change_to_random_string hat (siehe CVE-2026-85295) und setUpEncryptionKeys.js ihn nie generiert, ist der Signaturschlüssel öffentlich bekannt. Ein anonymer Angreifer fälscht ein Token und liest beliebige private Chart-Daten aus, wobei Token-Ablauf und -Widerruf dauerhaft ausgehebelt sind, sobald das Secret bekannt ist.
Ursache
Share- und Embed-Tokens werden mit settings.secret (CB_SECRET) in server/controllers/ChartController.js:1343 signiert und mit jwt.verify(token, settings.secret) ohne algorithms-Allowlist in :1208 verifiziert. Der Chart-Zweig von findBySharePolicy erzwingt nur sub.type==="Chart" und sub.id===sharePolicy.entity_id, ohne eine project.public- oder Sichtbarkeitsprüfung, und gibt chartData zurück (server/api/ChartRoute.js:348 akzeptiert dasselbe gefälschte Token per sequenzieller Integer-ID ohne Sichtbarkeits-Gate). CB_SECRET ist der mitgelieferte Standardwert change_to_random_string, der von setUpEncryptionKeys.js nie generiert wird, sodass der Signaturschlüssel öffentlich bekannt ist. Die Token-Laufzeit von 99999 Tagen und das Fehlen einer Secret-Rotation bedeuten, dass ein privater Share nicht widerrufen werden kann, sobald das Secret bekannt ist. Sink und Fix sind vom Authentication-Forge-Advisory (CVE-2026-85295) verschieden.
Proof of Concept
# Share-Token faelschen, signiert mit CB_SECRET:
PAYLOAD {"sub":{"type":"Chart","id":5,"sharePolicyId":3}}
KEY change_to_random_string (HS256)
# Private Chart-Daten ueber Share-Route lesen, unauthentifiziert:
GET /chart/share/<share_string>?token=<forged> HTTP/1.1
HTTP/1.1 200 OK
{"chartData":{"SECRET_MARKER":"CB-VERIFY-DATA-7Q9x","revenue":987654}}
# Baseline ohne Token:
GET /chart/share/<share_string>
HTTP/1.1 400 "Token is missing"
# Lesen per Integer-ID-Enumeration, kein Share-Link noetig:
POST /project/26/chart/5/filter?token=<forged> HTTP/1.1
{"filters":[]}
HTTP/1.1 200 OK
{"chartData":{"secretds":{"data":[{"marker":"CB-VERIFY-DATA-7Q9x"}]}}}
Auswirkung
- Anonyme Offenlegung beliebiger privater Chart-Daten, einschließlich Werte, die über die Query des Charts erreichbar sind.
- Vollständig beliebiger Lesezugriff durch Integer-ID-Enumeration, ohne dass ein Share-Link benötigt wird.
- Token-Ablauf und -Widerruf dauerhaft ausgehebelt, sobald das Secret bekannt ist.
- Nur-Lese-Zugriff, einzelner Request, keine Nutzerinteraktion erforderlich.
Referenzen
- Hersteller-Advisory: GHSA-3chp-cr6f-hp63
- CVE-2026-85708
- Verwandtes Advisory: CVE-2026-85295 (Authentication-Forge über dasselbe Standard-CB_SECRET)
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.
