SOGo: Übernahme der Webmail-Sitzung über eine Kalendereinladung

Ein Angreifer ohne Konto schickt eine Kalendereinladung per Mail, deren Beschreibungstext beim Öffnen als AngularJS-Ausdruck ausgeführt wird.

Advisory-ID: TP-2026-081
Produkt: SOGo (Groupware mit Webmail, Kalender und Adressbuch)
Schwachstellentyp: Client-Side Template Injection (CWE-1336)
CVE: beantragt (MITRE CNA-LR), Vergabe ausstehend
CVSS 3.1: 9.6 (Kritisch) · CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:C/C:H/I:H/A:H
Betroffene Versionen: <= 5.12.9
Hersteller-Advisory: SOGo 5.12.10 Release Notes
Behoben in: 5.12.10
Gemeldet: 15. Juni 2026

Zusammenfassung

SOGo ist eine Groupware, deren Webmail eingehende Termineinladungen als Karte im Postfach darstellt. Diese Karte wird im Browser durch AngularJS kompiliert, und der Beschreibungstext der Einladung landet unmaskiert in ihr. Ein AngularJS-Ausdruck in geschweiften Klammern wird dadurch nicht angezeigt, sondern ausgewertet, und weil AngularJS 1.8.3 keine Sandbox für Ausdrücke mehr besitzt, führt er beliebiges JavaScript aus. Der Angreifer braucht kein Konto auf dem Server, er schickt dem Opfer eine gewöhnliche Kalendereinladung per Mail. Öffnet das Opfer die Nachricht, läuft fremder Code in seiner angemeldeten Webmail-Sitzung.

Ursache

Die Karte einer eingehenden Einladung wird im Client über $compile gerendert, weil die Direktive sg-imip eine kompilierte Vorlage voraussetzt (UI/Templates/MailerUI/UIxMailViewTemplate.wox:428-433). Der Server schreibt den Beschreibungstext des Termins unmaskiert in genau diese Karte (UI/Templates/MailPartViewers/UIxMailPartICalViewer.wox:243 und :304, beide mit const:escapeHTML="NO"). Die dort verwendete Methode stringByDetectingURLs erzeugt nur Links und maskiert <, > und & nicht (SoObjects/SOGo/NSString+Utilities.m:206). AngularJS 1.8.3 hat seit Version 1.6 keine Sandbox für Ausdrücke mehr, deshalb wertet $compile den Inhalt geschweifter Klammern aus, und eine HTML-Maskierung hätte daran nichts geändert, weil geschweifte Klammern in HTML nicht sonderbehandelt werden. SOGo liefert in der Standardkonfiguration keine Content-Security-Policy, sodass die Ausführung nicht eingegrenzt wird.

Proof of Concept

Content-Type: text/calendar; method=REQUEST

BEGIN:VCALENDAR
BEGIN:VEVENT
SUMMARY:Projekt-Update
DESCRIPTION:{{1337*1337}}
END:VEVENT
END:VCALENDAR

-> die geoeffnete Einladung zeigt 1787569 statt des Ausdrucks

Die ausgerechnete Zahl belegt, dass der Feldinhalt als AngularJS-Ausdruck ausgewertet wird und nicht als Text erscheint. An derselben Stelle liefert ein Ausdruck über den Funktionskonstruktor statt einer Multiplikation beliebigen JavaScript-Code, der ohne weitere Interaktion beim Öffnen der Nachricht läuft.

Auswirkung

  • Lesen, Versenden und Löschen von Nachrichten in der angemeldeten Sitzung des Opfers.
  • Auslesen des nicht als HttpOnly gesetzten XSRF-Tokens über document.cookie, womit der vorhandene CSRF-Schutz wirkungslos wird.
  • Selbstverbreitung, weil der ausgeführte Code dieselbe Einladung aus dem Postfach des Opfers an dessen Kontakte schickt.
  • Zugriff auf sämtliche Postfächer der Instanz, wenn das Opfer in SOGoSuperUsernames eingetragen ist.

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.