tine: Die Dateivorschau zeigt HTML-Dateien in einem Rahmen gleicher Herkunft
QuickLook bindet eine gespeicherte HTML-Datei ohne sandbox ein, und der Auslieferungspfad sendet weder nosniff noch eine CSP.
Advisory-ID: TP-2026-099
Produkt: tine (Groupware und CRM, PHP)
Schwachstellentyp: Stored Cross-Site-Scripting (CWE-79)
CVE: beantragt (GitHub CNA), Vergabe ausstehend
CVSS 3.1: 8.0 (Hoch) · CVSS:3.1/AV:N/AC:L/PR:L/UI:R/S:U/C:H/I:H/A:H
Betroffene Versionen: <= 2025.11.12
Hersteller-Advisory: GHSA-f2cp-xjc8-5frq
Behoben in: 2024.11.23, 2025.11.13 und weekly-2026.35.1
Gemeldet: 21. August 2026
Zusammenfassung
Der Dateimanager von tine zeigt eine Schnellvorschau fuer gespeicherte Dateien, und fuer den Typ text/html baut er dafuer einen eingebetteten Rahmen ohne Sandbox-Attribut. Der Auslieferungspfad gibt die Datei mit ihrem gespeicherten Typ und zur unmittelbaren Anzeige aus, verlangt dafuer nur ein Leserecht und sendet weder X-Content-Type-Options noch eine Content-Security-Policy noch X-Frame-Options. Ein Nutzer mit geringen Rechten laedt also eine HTML-Datei hoch und teilt sie in einen Ordner, den das Opfer lesen darf. Oeffnet das Opfer die Vorschau, laeuft das hinterlegte Skript in der Herkunft von tine. Von dort liest es den Schutzschluessel gegen Cross-Site-Anfragen aus den Registrierungsdaten und ruft im Namen des Opfers privilegierte Methoden auf.
Ursache
QuickLookHTMLPanel meldet text/html fuer die Vorschau an und rendert die Datei in einem Rahmen gleicher Herkunft ohne das Attribut sandbox, wobei es disposition=inline an die Download-Adresse haengt (tine20/Filemanager/js/QuickLookHTMLPanel.js:20,29). Die Methode downloadFile nimmt disposition als Parameter vom Klienten entgegen (tine20/Filemanager/Frontend/Http.php:30), und fuer die unmittelbare Anzeige verlangt der Auslieferungspfad _downloadFileNode lediglich GRANT_READ (tine20/Tinebase/Frontend/Http/Abstract.php:351). Die Datei wird mit ihrem gespeicherten Inhaltstyp ausgeliefert, den der Server beim Hochladen aus dem Inhalt ableitet, und ohne X-Content-Type-Options: nosniff. Die Anwendung setzt zudem weder eine Content-Security-Policy noch X-Frame-Options, sodass zwischen der hochgeladenen Datei und der Herkunft von tine keine Trennung mehr besteht.
Proof of Concept
# 1. Als Nutzer mit geringen Rechten eine Datei hochladen, Inhalt:
<script>
const d = Tinebase.getAllRegistryData();
fetch('/index.php?method=Tinebase.getAllRegistryData&jsonKey=' + d.jsonKey);
</script>
# 2. Die Datei in einen Ordner teilen, den das Opfer lesen darf,
# etwa ueber eine Freigabe des persoenlichen Ordners oder einen Team-Ordner.
# 3. Opfer oeffnet im Dateimanager die QuickLook-Vorschau
# -> der Rahmen laedt die Datei als text/html ohne sandbox,
# das Skript laeuft in der Herkunft von tine.
Der ausgelesene jsonKey ist der einzige Schutz gegen Cross-Site-Anfragen, weshalb das Skript danach beliebige JSON-RPC-Aufrufe im Namen des Opfers stellt.
Auswirkung
- Uebernahme jedes Kontos, dessen Inhaber die geteilte Datei in der Vorschau oeffnet, bis hin zur Administration.
- Auslesen des Schutzschluessels gegen Cross-Site-Anfragen und damit beglaubigte Aufrufe im Namen des Opfers.
- Zugriff auf alle Daten, die das Opfer sehen darf, also Mail, Adressbuch, Kalender und Dateien.
- Erreichbar in einer Standardinstallation, da die ausgelieferte Gruppe der Nutzer den Dateimanager traegt.
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.
