
Element Web v1.12.29 - Alto - Remoto - XSS - Il link navigation.json di Univention ICS diventa un href javascript: nel menu
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · element-ics-javascript
Element Web v1.12.29 - Element / New Vector
Classe: XSS Portata: Remota
Il modulo banner di Univention recupera l'ICS navigation.json, accetta il link di ogni voce come z.string() senza controllo di schema, e Menu.tsx inserisce quella stringa in un <a href> stilizzato. La configurazione statica del menu usa z.url() per link_url. Il percorso ICS no. L'anteprima URL sullo stesso pin rifiuta già javascript: (previewFromBundle, GHSA-9r5h). Questo non è app.element.io predefinito. Richiede modules/banner con menu.type univention, più un ICS di cui il deploy si fida.
Chiunque possa modificare quel navigation.json inserisce javascript: o data:. Un utente autenticato che apre il menu del banner e clicca la voce esegue script sull'origine di Element.
| ID | nessuna CVE al momento |
| CWE | CWE-79 / CWE-20 |
| CVSS | Medio: 6.8 CVSS:3.1/AV:N/AC:L/PR:H/UI:R/S:U/C:H/I:H/A:N |
| Prodotto | Element Web |
| Affetto | v1.12.29 tag v1.12.29 (2d90d6b7b601ecb9ccdf81239a43b4396b4b0c9e). Vincolato: banner Univention + ICS. |
| Auth | Operatore ICS / compromissione ICS. La vittima è un utente autenticato che clicca la voce del menu. |
| Licenza | GNU Affero GPL v3.0 |
| Lab | solo 127.0.0.1 |
Compromettere o gestire l'ICS di cui il deploy di Element si fida. Inserire un URL javascript: (o data:) in navigation.json. Attendere che un utente autenticato apra il menu del banner e clicchi la voce. Si tratta di takeover dell'account Matrix: access token, crypto store, la sessione. Non è RCE a livello di OS. Il desktop ha ancora nodeIntegration disattivato e una sandbox.
| Privilegio | Metodo / sink | Recon / integrità / disponibilità | Provato in lab o dedotto |
|---|---|---|---|
Renderizzare un <a href="javascript:…"> del menu banner sull'origine di Element | ICS navigation.json entries[].link -> navigationToConfig link_url -> Menu.tsx LinkButton href={link.link_url} | Integrità del DOM del menu | Provato in lab. Il link ICS fittizio javascript:ELEMENT-ICS-JAVASCRIPT-WITNESS è diventato quell'href. Il link https del portale era comunque renderizzato |
| Eseguire script come origine di Element dopo un click | La vittima clicca la voce del menu (UI:R) | Integrità | Dedotto dal sink href. Il lab non ha simulato un click del browser né sottratto un token Matrix reale |
| Leggere l'access token Matrix / crypto store (takeover dell'account) | Script nell'origine contro localStorage / sessione IndexedDB | Recon / integrità | Dedotto dalla XSS sull'origine di Element. Il witness del lab è la stringa href |
| Navigare la tab di Element verso una pagina di phishing | iframe non sandboxed di SilentLogin.tsx src={new URL("silent", icsUrl)} | Integrità | Provato in lab che l'iframe non ha sandbox. Top-navigation non esercitata |
Stesso inserimento tramite data: | z.string() accetta qualsiasi schema | Integrità | Dedotto. Il lab ha inserito solo javascript: |
Chiuso su questo pin: app.element.io predefinito (nessun banner Univention). RCE a livello di OS / LPE (Desktop nodeIntegration: false, sandbox, contextIsolation). XSS HTML della timeline. javascript: nell'anteprima URL (GHSA-9r5h previewFromBundle richiede http:/https:). XSS nell'export HTML (GHSA-wqmv). Token media dei widget (GHSA-3jm3). Il banner statico link_url: z.url() è configurazione dell'operatore, non ICS; z.url() inoltre non è una allowlist http/https.
Residui dello stesso pin: fragment guest wipe, vector: Windows drive-letter.
Ho fissato Element Web v1.12.29 dopo la release GitHub del 22 settembre 2026. L'anteprima URL aveva già imparato http:/https: a sue spese. Il link ICS di Univention è ancora z.string(). La configurazione statica del menu usa z.url(). Il percorso di fetch non passa mai da quel controllo.
Vicoli ciechi già registrati: trattare app.element.io predefinito come vittima (Univention è vincolato); trattare z.url() come allowlist di schemi (il costruttore URL accetta javascript:); gonfiare la XSS da click a RCE a livello di OS. Una reverse shell. Teatro.
Gadget delle funzioni del pin più un ICS fittizio navigation.json. Non un container Element Web live. how=gadget. Applicando la allowlist http/https dell'anteprima URL (previewFromBundle) l'href javascript è stato eliminato e il link https del portale mantenuto.
python3 element-ics-javascript-Abraxas-Labs.py
oppure
cd lab
./run.sh
Target solo http://127.0.0.1:19620. Progetto Compose element-ics-javascript. Lo stack viene smontato dopo l'esecuzione.
SUCCESS element-ics-javascript how=gadget href-scheme=javascript menu-a-javascript=yes allowlist-rejects=yes silent-no-sandbox=yes ELEMENT-ICS-JAVASCRIPT-WITNESS
Applicare una allowlist http: e https: sul link ICS nello stesso modo in cui fa previewFromBundle. Rifiutare javascript:, data: e altri schemi prima di href=. Sandboxare l'iframe silenzioso (sandbox="" o almeno senza allow-top-navigation). Non trattare z.url() come allowlist di schemi.
navigation.tsMenu.tsxSilentLogin.tsxpreviewFromBundleGNU Affero GPL v3.0. Vedi LICENSE. Solo lab su loopback. Nessuna garanzia.