
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
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 Scheme-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 javascript: bereits ab (previewFromBundle, GHSA-9r5h). Dies ist nicht das Standard-app.element.io. Es benötigt modules/banner mit menu.type univention, plus ein ICS, dem das Deployment vertraut.
Jeder, der diese navigation.json ändern kann, platziert javascript: oder data:. 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. 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 platzieren. Warten, bis ein angemeldeter Benutzer das Banner-Menü öffnet und auf den Eintrag klickt. Das ist Matrix-Account-Übernahme: Access Token, Crypto Store, die Session. Es ist kein OS-RCE. Desktop hat weiterhin nodeIntegration deaktiviert und eine Sandbox.
| Privileg | Methode / Sink | Recon / Integrität / Verfügbarkeit | Lab-bewiesen 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 | Lab-bewiesen. 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. Lab hat keinen Browser-Klick ausgelöst oder ein Live-Matrix-Token gestohlen |
| Das Matrix-Access-Token / den Crypto Store lesen (Account-Übernahme) | In-Origin-Skript gegen localStorage / IndexedDB-Session | Recon / Integrität | Abgeleitet aus Element-Origin-XSS. 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 | Lab-bewiesen, dass das iframe kein sandbox hat. Top-Navigation nicht ausgeführt |
Dieselbe Platzierung via data: | z.string() akzeptiert jedes Scheme | Integrität | Abgeleitet. Lab hat nur javascript: platziert |
Geschlossen auf diesem Pin: 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 Betreiber-Konfiguration, nicht ICS; z.url() ist auch keine http/https-Allowlist.
Übrig geblieben auf demselben 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 festgehaltene 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 ein 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.
python3 element-ics-javascript-Abraxas-Labs.py
oder
cd lab
./run.sh
Ziel nur 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
http: und https: auf ICS link genauso allowlisten, wie es previewFromBundle tut. javascript:, data: und andere Schemes vor href= ablehnen. Das Silent-iframe sandboxen (sandbox="" oder zumindest kein allow-top-navigation). z.url() nicht als Scheme-Allowlist behandeln.
navigation.tsMenu.tsxSilentLogin.tsxpreviewFromBundleGNU Affero GPL v3.0. Siehe LICENSE. Nur Loopback-Lab. Keine Gewährleistung.