tine: Export-Vorlage wird ohne Sandbox durch Twig kompiliert

Der Export uebernimmt jede vom Aufrufer benannte Vorlage und kompiliert sie in einer Twig-Umgebung ohne Sandbox.

Advisory-ID: TP-2026-098
Produkt: tine (Groupware und CRM, PHP)
Schwachstellentyp: Server-Side Template Injection (CWE-1336)
CVE: beantragt (GitHub CNA), Vergabe ausstehend
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
Betroffene Versionen: <= 2025.11.12
Hersteller-Advisory: GHSA-cqm5-7q48-7wc7
Behoben in: 2024.11.23, 2025.11.13 und weekly-2026.35.1
Gemeldet: 21. August 2026

Zusammenfassung

Der Dokumentenexport von tine kompiliert eine Vorlage mit Twig. Welche Vorlage das ist, bestimmt der Aufrufer, denn die Exportmethoden reichen die Optionen aus der Anfrage weiter, und darin ueberschreibt das Feld template die Vorlage mit einer beliebigen Datei aus dem Dateimanager. Die Twig-Umgebung, die den Rumpf dieser Datei uebersetzt, bindet keine Sandbox ein, weshalb ein Platzhalter im Dokument als unbeschraenkter Twig-Ausdruck ausgewertet wird. Ueber ein bekanntes Muster in Twig 2 fuehrt dieser Ausdruck zu einem Aufruf von system() in PHP. Ein Rechtecheck fuer den Export existiert nicht, und die ausgelieferte Gruppe der Nutzer traegt sowohl das Adressbuch als auch den Dateimanager, sodass kein erhoehtes Konto noetig ist.

Ursache

Tinebase_Export_Abstract setzt die Exportvorlage aus der vom Aufrufer gelieferten Knotenkennung options.template (tine20/Tinebase/Export/Abstract.php:331), abgesichert allein durch eine Liste erlaubter Dateiendungen aus doc, docx, xls, xlsx, ods und odt (:340). Tinebase_Export_Doc::renderProcessorsTwigTemplate uebersetzt den Rumpf dieser Vorlage mit $this->_twig->load($twigName)->render(...) (tine20/Tinebase/Export/Doc.php:396). Die zugehoerige Twig-Umgebung wird ohne SandboxExtension und ohne SecurityPolicy gebaut, was sich unterhalb von Tinebase/Export/ und Tinebase/Twig* nirgends findet. Mitgeliefert ist twig/twig in Version 2.16.1pl1, in der das Muster mit einer Zeichenkette als Rueckruf zu system() in PHP fuehrt. Die Methode _export fuehrt keine exportbezogene Rechtepruefung durch, und die voreingestellte Gruppe der Nutzer besitzt Adressbuch und Dateimanager.

Proof of Concept

# 1. Als gewoehnlicher Nutzer eine Datei mit erlaubter Endung in den
#    Dateimanager laden, deren Rumpf den Platzhalter traegt:
${twig:['id']|filter('system')}

# 2. Export anstossen und die eigene Vorlage benennen:
Addressbook.exportContacts  mit  options.template = <knoten-id der datei>

# Die Vorlage wird ohne Sandbox kompiliert, der Ausdruck erreicht
# system() und fuehrt den Befehl als Anwendungsnutzer aus.

Es wird keine besondere Einstellung gebraucht; der Weg ist in einer Standardinstallation erreichbar, und Konten legt die Administration an, eine Selbstregistrierung gibt es nicht.

Auswirkung

  • Ausfuehrung beliebiger Shell-Befehle als Anwendungsnutzer durch jedes gewoehnliche Konto.
  • Zugriff auf die Konfiguration samt Datenbank-Zugangsdaten und damit auf die Daten aller Mandanten der Installation.
  • Dauerhafter Zugang zum Server, da der Angreifer eigene Dateien ablegen und Dienste starten kann.
  • Kein erhoehtes Recht noetig, da die ausgelieferte Gruppe der Nutzer bereits Adressbuch und 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.