
Element Web v1.12.29 - Alto - Remoto - Sessione - frammento credenziali guest cancellano una sessione reale prima di whoami
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · element-fragment-guest
Element Web v1.12.29 - Element / New Vector
Classe: Distruzione della sessione Portata: Remota
Lifecycle.loadSession preferisce guest_user_id e guest_access_token dall'hash dell'URL rispetto a restoreSessionFromStorage. Gli ospiti sono abilitati per impostazione predefinita (enableGuest={!config.disable_guests}). Il config.json di app.element.io non imposta disable_guests. onTokenLoginCompleted rimuove solo i parametri SSO e OIDC. Non rimuove mai le chiavi guest. url_utils.ts commenta già che questi parametri del fragment sembrano inutilizzati. Eppure vincono comunque.
Chiunque riesca a far aprire a un utente autenticato un URL con hash contenente parametri guest del fragment lo disconnette e cancella la crittografia locale. Basta un token spazzatura. whoami non viene mai chiamato.
| ID | nessuna CVE al momento |
| CWE | CWE-384 / CWE-352 / CWE-613 |
| CVSS | Alto: 7.1 CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:U/C:N/I:H/A:H |
| Prodotto | Element Web |
| Affetto | v1.12.29 tag v1.12.29 (2d90d6b7b601ecb9ccdf81239a43b4396b4b0c9e). Ospiti abilitati (predefinito). |
| Auth | attaccante non autenticato. La vittima deve aprire (o ricaricare) un URL. |
| Licenza | GNU Affero GPL v3.0 |
| Lab | solo 127.0.0.1 |
Far aprire a un utente autenticato un URL con hash contenente parametri guest del fragment. Il client lo disconnette, cancella la crittografia locale e può collocarlo su un ospite controllato dall'attaccante. Si tratta di logout e cancellazione della crittografia. Non è furto del token reale. Non è RCE sul sistema operativo.
| Privilegio | Metodo / sink | Ricognizione / integrità / disponibilità | Provato in laboratorio o dedotto |
|---|---|---|---|
| Analizzare le credenziali guest dall'hash | url_utils.ts guest: { keys: ["guest_user_id", "guest_access_token"], location: "fragment" } | Integrità della selezione della sessione | Provato in laboratorio. #/home?guest_user_id=...&guest_access_token=... è diventato guest_params. Solo la query string no. |
| Preferire il guest a una sessione non-guest memorizzata | Ramo guest-first di Lifecycle.loadSession, log Using guest access credentials | Integrità | Provato in laboratorio. Il @victim:example.org inserito non è stato ripristinato. |
| Cancellare localStorage, account IndexedDB, sessionStorage, crypto | doSetLoggedIn(..., clearStorageEnabled=true) poi clearStorage() | Integrità / disponibilità della sessione locale | Provato in laboratorio. crypto_empty=yes, token precedente sparito. |
| Saltare la validazione del token | Il percorso guest non chiama mai /_matrix/client/v3/account/whoami | Integrità | Provato in laboratorio. whoami_called=no. Il token spazzatura not-a-real-token ha comunque cancellato tutto. |
| Persistere le credenziali guest dell'attaccante | persistCredentials dopo la cancellazione | Integrità | Provato in laboratorio. after_user=@x:example.org, after_token=not-a-real-token, mx_is_guest=true. |
| Fissare su un guest reale sull'HS predefinito | Stessa persistenza se il token guest è valido | Integrità | Dedotto. Il laboratorio ha usato un token spazzatura, quindi nessun login su HS reale. |
| Continuare a farlo alla ricarica | Le chiavi guest restano nell'hash; onTokenLoginCompleted non le elimina | Integrità | Dedotto dal pin app.tsx. Il laboratorio ha aperto l'URL una volta. |
Escluso su questo residuo: rubare il token di accesso reale (viene eliminato, non esfiltrato). RCE / LPE sul sistema operativo (Desktop nodeIntegration: false, sandbox). SPA Element live (how=gadget). Query string ?guest_user_id= (solo fragment). disable_guests: true mantiene la sessione non-guest. Anche una loadSession corretta che ignora il guest quando esiste una sessione non-guest la mantiene.
Altri residui dello stesso pin: vector: lettera di unità Windows, Univention ICS javascript: href.
Ho fissato Element Web v1.12.29 dopo la release GitHub del 22 settembre 2026. Il loginToken SSO è solo nella query e viene rimosso dopo l'uso. Le chiavi guest restano nel fragment e vincono sul ripristino. Il commento in url_utils.ts è l'indizio: già dubitavano che queste chiavi fossero specificate.
Vicoli ciechi già registrati: trattare la query string ?guest_user_id= come il vettore (le chiavi vivono nell'hash); chiamarlo furto di token (il token reale viene eliminato, non inviato); aspettarsi disable_guests nella config di app.element.io (non è impostato). Una reverse shell. Teatro.
Gadget delle funzioni del pin. Non un container Element Web live. how=gadget.
python3 element-fragment-guest-Abraxas-Labs.py
oppure
cd lab
./run.sh
Target solo http://127.0.0.1:19600. Progetto Compose element-fragment-guest. Lo stack viene smontato dopo l'esecuzione.
SUCCESS element-fragment-guest how=gadget guest-wipe=yes prior-kept=no garbage-token=yes disable-guests-keeps=yes ELEMENT-FRAGMENT-GUEST-WITNESS
Ignorare i parametri guest del fragment quando esiste già una sessione non-guest. Validare il token guest con /_matrix/client/v3/account/whoami prima di clearStorage. Rimuovere guest_user_id e guest_access_token allo stesso modo in cui vengono rimossi i token SSO. Impostare disable_guests: true come predefinito per app.element.io ospitato.
Lifecycle.ts (loadSession guest-first)url_utils.tsapp.tsx (enableGuest={!config.disable_guests})GNU Affero GPL v3.0. Vedi LICENSE. Solo laboratorio su loopback. Nessuna garanzia.