Element Web: Stored XSS im HTML-Chat-Export
Ein beliebiges Raummitglied platziert Skriptcode, der ausgeführt wird, sobald ein anderer Nutzer den HTML-Export des Raums öffnet.
Advisory-ID: TP-2026-108
Produkt: Element Web / Element Desktop (Matrix-Client für Browser und Desktop)
Schwachstellentyp: Stored Cross-Site Scripting im HTML-Export (CWE-79, CWE-116)
CVE: pending
CVSS 3.1: 6.3 (Mittel), eigene Bewertung; Hersteller-Einstufung: Moderate
Betroffene Versionen: <= 1.12.27
Hersteller-Advisory: GHSA-wqmv-r2qj-2j9p
Behoben in: 1.12.28
Gemeldet: 2. Juni 2026
Zusammenfassung
Element ist der verbreitetste Client für das Matrix-Protokoll und bietet einen Export ganzer Räume als HTML-Archiv. Der HTML-Export übernahm gerendertes Nachrichten-Markup und Dateinamen von Anhängen ohne erneute Bereinigung in die Datei messages.html, die keine Content Security Policy setzt. turingpoint meldete zwei Wege, auf denen ein beliebiges Raummitglied darüber ein ausführbares <script> in den Export eines anderen Nutzers bringt: eine in <xmp> verpackte Nachricht, die den damals gebündelten Sanitizer sanitize-html 2.17.3 passiert, und einen Anhang, dessen Dateiname aus dem href-Attribut ausbricht. Das Hersteller-Advisory nennt unbereinigte Anhang-Dateinamen und Matrix-IDs als Ursache; den <xmp>-Weg schloss bereits die Aktualisierung von sanitize-html auf 2.17.4 in Version 1.12.21. Öffnet das Opfer den Export, läuft das Skript des Angreifers im exportierten Dokument und liest den gesamten exportierten Chatverlauf.
Ursache
Der HTML-Export rendert Textnachrichten über die reguläre EventTile-Komponente in ein temporäres Element und übernimmt dessen innerHTML unverändert in das Archiv (apps/web/src/utils/exportUtils/HtmlExport.tsx:337-341), während der erzeugte <head> keine Content Security Policy enthält (HtmlExport.tsx:159). Nachrichten-HTML wird mit sanitize-html bereinigt (apps/web/src/HtmlUtils.tsx:136-155), und Version 2.17.3 gibt den Inhalt eines verworfenen <xmp>-Elements unescaped aus (CVE-2026-44990), sodass ein darin verpacktes <script> als echtes Element im Export landet. Bei aktivierter Option "Anhänge einschließen" bildet getFilePath den Dateipfad aus dem frei wählbaren body des Anhangs über splitFileName, ohne ihn zu escapen (apps/web/src/utils/exportUtils/Exporter.ts:283). Anschließend ersetzt HtmlExport.tsx:349 die mxc-URL im fertigen Markup per split(mxc).join(filePath) als reinen String, wodurch ein " im Dateinamen das href-Attribut schließt und beliebiges HTML folgt. Version 1.12.28 benennt exportierte Dateien nach Event-ID und MIME-Typ und escapt den aus der Matrix-ID gebildeten Avatar-Pfad (Fix-Commit).
Proof of Concept
PUT /_matrix/client/v3/rooms/<room>/send/m.room.message/<txn1>
{"msgtype": "m.text", "body": "x", "format": "org.matrix.custom.html",
"formatted_body": "<xmp><script>document.title='XSS'</script></xmp>"}
PUT /_matrix/client/v3/rooms/<room>/send/m.room.message/<txn2>
{"msgtype": "m.file", "url": "mxc://<server>/<media-id>",
"body": "x\"><script>document.title='XSS2'</script>y.png"}
Opfer: Raum-Info -> Chat exportieren -> Format HTML
(für Nachricht 2 zusätzlich "Anhänge einschließen")
-> messages.html öffnen -> document.title wechselt auf XSS / XSS2
Nachricht 1 passiert den Sanitizer wegen der <xmp>-Durchreichung, Nachricht 2 bricht beim Einsetzen des Dateipfads aus dem Link-Attribut aus. Weil messages.html keine CSP mitbringt, führt der Browser beide Skripte aus; die Payload muss frei von URLs sein, da der Export Links nachträglich verlinkt.
Auswirkung
- Ausführung von Angreifer-JavaScript im exportierten Dokument, sobald das Opfer den Export öffnet.
- Lesen und Ausleiten des gesamten exportierten Chatverlaufs, bei verschlüsselten Räumen im bereits entschlüsselten Klartext.
- Fälschen von Inhalten im Export, der häufig als Beleg oder Archiv aufbewahrt wird.
- Kein Zugriff auf die laufende Element-Sitzung: Das Dokument läuft in einem eigenen Ursprung ohne Session-Token.
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.
