
Element Web v1.12.29 – Hoch – Remote – XSS – Univention ICS navigation.json-Link wird zu einem javascript:-Menü-href
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · element-ics-javascript
Write-up: https://abraxaslabs.tech/research/element-ics-javascript
Element Web v1.12.29 – Element / New Vector
Klasse: XSS Reichweite: Remote
Das Univention-Banner-Modul ruft ICS navigation.json ab, akzeptiert das link jedes Eintrags als z.string() ohne Schema-Prüfung, und Menu.tsx setzt diesen String in ein gestyltes <a href>. Die statische Menü-Konfiguration verwendet z.url() für link_url. Der ICS-Pfad nicht. Die URL-Vorschau auf demselben Pin lehnt bereits javascript: ab (previewFromBundle, GHSA-9r5h). Dies ist nicht das Standard-app.element.io. Es erfordert modules/banner mit menu.type univention, plus ein ICS, dem das Deployment vertraut.
Jeder, der diese navigation.json ändern kann, pflanzt javascript: oder data: ein. Ein angemeldeter Benutzer, der das Banner-Menü öffnet und auf den Eintrag klickt, führt Skript auf der Element-Origin aus.
| ID | noch keine CVE |
| CWE | CWE-79 / CWE-20 |
| CVSS | Mittel: 6.8 CVSS:3.1/AV:N/AC:L/PR:H/UI:R/S:U/C:H/I:H/A:N |
| Produkt | Element Web |
| Betroffen | v1.12.29 Tag v1.12.29 (2d90d6b7b601ecb9ccdf81239a43b4396b4b0c9e). Gated: Univention-Banner + ICS. |
| Auth | ICS-Betreiber / ICS-Kompromittierung. Das Opfer ist ein angemeldeter Benutzer, der auf den Menüeintrag klickt. |
| Lizenz | GNU Affero GPL v3.0 |
| Lab | nur 127.0.0.1 |
Das ICS kompromittieren oder betreiben, dem das Element-Deployment vertraut. Eine javascript:- (oder data:) URL in navigation.json einfügen. Warten, bis ein angemeldeter Benutzer das Banner-Menü öffnet und auf den Eintrag klickt. Das ist Matrix-Kontoübernahme: Zugriffstoken, Crypto-Store, die Sitzung. Es ist kein OS-RCE. Desktop hat weiterhin nodeIntegration deaktiviert und eine Sandbox.
| Privileg | Methode / Sink | Recon / Integrität / Verfügbarkeit | Im Lab nachgewiesen oder abgeleitet |
|---|---|---|---|
Ein Banner-Menü-<a href="javascript:…"> auf der Element-Origin rendern | ICS navigation.json entries[].link -> navigationToConfig link_url -> Menu.tsx LinkButton href={link.link_url} | Integrität des Menü-DOM | Im Lab nachgewiesen. Mock-ICS-Link javascript:ELEMENT-ICS-JAVASCRIPT-WITNESS wurde zu diesem href. https-Portal-Link wurde weiterhin gerendert |
| Skript als Element-Origin nach einem Klick ausführen | Opfer klickt auf den Menüeintrag (UI:R) | Integrität | Abgeleitet aus dem href-Sink. Das Lab hat keinen Browser-Klick ausgelöst oder ein aktives Matrix-Token gestohlen |
| Das Matrix-Zugriffstoken / den Crypto-Store lesen (Kontoübernahme) | In-Origin-Skript gegen localStorage / IndexedDB-Sitzung | Recon / Integrität | Abgeleitet aus Element-Origin-XSS. Der Lab-Witness ist der href-String |
| Den Element-Tab auf eine Phishing-Seite top-navigieren | SilentLogin.tsx unsandboxed iframe src={new URL("silent", icsUrl)} | Integrität | Im Lab nachgewiesen, dass das iframe kein sandbox hat. Top-Navigation nicht ausgeführt |
Dieselbe Pflanzung via data: | z.string() akzeptiert jedes Schema | Integrität | Abgeleitet. Lab pflanzte nur javascript: |
Auf diesem Pin geschlossen: Standard-app.element.io (kein Univention-Banner). OS RCE / LPE (Desktop nodeIntegration: false, Sandbox, contextIsolation). Timeline-HTML-XSS. URL-Vorschau javascript: (GHSA-9r5h previewFromBundle erfordert http:/https:). HTML-Export-XSS (GHSA-wqmv). Widget-Media-Token (GHSA-3jm3). Statisches Banner link_url: z.url() ist Betreiberkonfiguration, nicht ICS; z.url() ist außerdem keine http/https-Allowlist.
Übrig geblieben vom selben Pin: Fragment-Guest-Wipe, vector: Windows-Laufwerksbuchstabe.
Ich habe Element Web v1.12.29 nach dem GitHub-Release vom 22. Sep. 2026 gepinnt. Die URL-Vorschau hat http:/https: bereits auf die harte Tour gelernt. Univention ICS link ist weiterhin z.string(). Die statische Menükonfiguration verwendet z.url(). Der Fetch-Pfad durchläuft diese Prüfung nie.
Bereits dokumentierte Irrwege: Standard-app.element.io als Opfer zu behandeln (Univention ist gated); z.url() als Scheme-Allowlist zu behandeln (der URL-Konstruktor akzeptiert javascript:); Click-XSS zu OS RCE aufzublähen. Eine Reverse Shell. Theater.
Gadget der Pin-Funktionen plus eine Mock-ICS-navigation.json. Kein Live-Element-Web-Container. how=gadget. Das Anwenden der URL-Vorschau-http/https-Allowlist (previewFromBundle) entfernte den javascript-href und behielt den https-Portal-Link bei.
python3 element-ics-javascript-Abraxas-Labs.py
oder
cd lab
./run.sh
Ziele ausschließlich auf http://127.0.0.1:19620. Compose-Projekt element-ics-javascript. Der Stack wird nach dem Lauf abgebaut.
SUCCESS element-ics-javascript how=gadget href-scheme=javascript menu-a-javascript=yes allowlist-rejects=yes silent-no-sandbox=yes ELEMENT-ICS-JAVASCRIPT-WITNESS
Erlaube http: und https: bei ICS-link auf dieselbe Weise wie previewFromBundle. Lehne javascript:, data: und andere Schemata vor href= ab. Binde das stille iframe in eine Sandbox ein (sandbox="" oder zumindest ohne allow-top-navigation). Behandle z.url() nicht als Schema-Allowlist.
navigation.tsMenu.tsxSilentLogin.tsxpreviewFromBundleGNU Affero GPL v3.0. Siehe LICENSE. Nur Loopback-Lab. Keine Gewährleistung.