
Element Web v1.12.29 - Hoch - Remote - Session - Fragment-Gast-Anmeldeinformationen löschen eine echte Sitzung vor whoami
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · element-fragment-guest
Element Web v1.12.29 - Element / New Vector
Klasse: Session-Zerstörung Reichweite: Remote
Lifecycle.loadSession bevorzugt guest_user_id und guest_access_token aus dem URL-Hash gegenüber restoreSessionFromStorage. Gäste sind standardmäßig aktiviert (enableGuest={!config.disable_guests}). app.element.io config.json setzt disable_guests nicht. onTokenLoginCompleted entfernt nur SSO- und OIDC-Parameter. Die Guest-Schlüssel werden nie entfernt. url_utils.ts kommentiert bereits, dass diese Fragment-Parameter ungenutzt erscheinen. Sie gewinnen trotzdem.
Jeder, der einen angemeldeten Benutzer dazu bringt, eine Hash-URL mit Guest-Fragment-Parametern zu öffnen, meldet ihn ab und löscht lokale Krypto-Daten. Ein Müll-Token genügt. whoami wird nie aufgerufen.
| ID | noch keine CVE |
| CWE | CWE-384 / CWE-352 / CWE-613 |
| CVSS | Hoch: 7.1 CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:U/C:N/I:H/A:H |
| Produkt | Element Web |
| Betroffen | v1.12.29 Tag v1.12.29 (2d90d6b7b601ecb9ccdf81239a43b4396b4b0c9e). Gäste aktiviert (Standard). |
| Auth | nicht authentifizierter Angreifer. Opfer muss eine URL öffnen (oder neu laden). |
| Lizenz | GNU Affero GPL v3.0 |
| Lab | nur 127.0.0.1 |
Einen angemeldeten Benutzer dazu bringen, eine Hash-URL mit Guest-Fragment-Parametern zu öffnen. Der Client meldet ihn ab, löscht lokale Krypto-Daten und kann ihn auf einem Angreifer-Gast parken. Dies ist Logout und Krypto-Löschung. Es ist kein Stehlen-des-echten-Tokens. Es ist kein OS-RCE.
| Privileg | Methode / Sink | Recon / Integrität / Verfügbarkeit | Lab-bewiesen oder abgeleitet |
|---|---|---|---|
| Guest-Credentials aus dem Hash parsen | url_utils.ts guest: { keys: ["guest_user_id", "guest_access_token"], location: "fragment" } | Integrität der Session-Auswahl | Lab-bewiesen. #/home?guest_user_id=...&guest_access_token=... wurde zu guest_params. Nur Query-String nicht. |
| Guest gegenüber einer gespeicherten Nicht-Guest-Session bevorzugen | Lifecycle.loadSession Guest-First-Zweig, Log Using guest access credentials | Integrität | Lab-bewiesen. Geseedetes @victim:example.org wurde nicht wiederhergestellt. |
| localStorage, IndexedDB-Konto, sessionStorage, Krypto löschen | doSetLoggedIn(..., clearStorageEnabled=true) dann clearStorage() | Integrität / Verfügbarkeit der lokalen Session | Lab-bewiesen. crypto_empty=yes, vorheriges Token weg. |
| Token-Validierung überspringen | Guest-Pfad ruft nie /_matrix/client/v3/account/whoami auf | Integrität | Lab-bewiesen. whoami_called=no. Müll-Token not-a-real-token löschte trotzdem. |
| Angreifer-Guest-Credentials persistieren | persistCredentials nach der Löschung | Integrität | Lab-bewiesen. after_user=@x:example.org, after_token=not-a-real-token, mx_is_guest=true. |
| Auf einen echten Gast auf dem Standard-HS fixieren | Gleiches Persist, wenn das Guest-Token gültig ist | Integrität | Abgeleitet. Lab verwendete ein Müll-Token, also kein Live-HS-Login. |
| Dies bei Reload weiter tun | Guest-Schlüssel bleiben im Hash; onTokenLoginCompleted löscht sie nicht | Integrität | Abgeleitet aus Pin app.tsx. Lab öffnete die URL einmal. |
Ausgeschlossen bei diesem Leftover: das echte Access-Token stehlen (es wird gelöscht, nicht exfiltriert). OS-RCE / LPE (Desktop nodeIntegration: false, Sandbox). Live Element SPA (how=gadget). Query-String ?guest_user_id= (nur Fragment). disable_guests: true behält die Nicht-Guest-Session. Ein gepatchtes loadSession, das Guest ignoriert, wenn eine Nicht-Guest-Session existiert, behält sie ebenfalls.
Gleiche Pin-Leftovers: vector: Windows-Laufwerksbuchstabe, Univention ICS javascript: href.
Ich habe Element Web v1.12.29 nach dem GitHub-Release vom 22. Sep 2026 gepinnt. SSO loginToken ist nur Query und wird nach Gebrauch entfernt. Guest-Schlüssel sitzen weiterhin im Fragment und gewinnen gegenüber Restore. Der Kommentar in url_utils.ts ist der Hinweis: Sie zweifelten bereits, ob diese Schlüssel spezifiziert waren.
Bereits festgehaltene Irrwege: Query-String ?guest_user_id= als Vektor behandeln (Schlüssel leben im Hash); dies Token-Diebstahl nennen (das echte Token wird gelöscht, nicht gesendet); disable_guests in app.element.io config erwarten (es ist nicht gesetzt). Eine Reverse Shell. Theater.
Gadget der Pin-Funktionen. Kein Live-Element-Web-Container. how=gadget.
python3 element-fragment-guest-Abraxas-Labs.py
oder
cd lab
./run.sh
Ziel nur http://127.0.0.1:19600. Compose-Projekt element-fragment-guest. Stack wird nach dem Lauf abgebaut.
SUCCESS element-fragment-guest how=gadget guest-wipe=yes prior-kept=no garbage-token=yes disable-guests-keeps=yes ELEMENT-FRAGMENT-GUEST-WITNESS
Guest-Fragment-Parameter ignorieren, wenn bereits eine Nicht-Guest-Session existiert. Das Guest-Token mit /_matrix/client/v3/account/whoami validieren, bevor clearStorage. guest_user_id und guest_access_token genauso entfernen, wie SSO-Tokens entfernt werden. Standard disable_guests: true für gehostetes app.element.io.
Lifecycle.ts (loadSession Guest-First)url_utils.tsapp.tsx (enableGuest={!config.disable_guests})GNU Affero GPL v3.0. Siehe LICENSE. Nur Loopback-Lab. Keine Gewährleistung.