Skip to content
KitploitKITPLOIT
ToolsExploitsBlog
Log in
Submit
ToolsExploitsBlog
Submit

Hacking, PenTest, and Cybersecurity Tools for Your Security Arsenal!

Kitploit is a directory of hacking, cybersecurity, and pentesting tools. Discover the latest project updates to find vulnerabilities, analyze systems, automate testing, and strengthen your security.

FeedsContactPrivacy© 2026 Kitploit

Tool Directory

Categories

View all categories
Loading categories
element-fragment-guest — Element Web v1.12.29 - High - Remote - Session - fragment guest creds wipe a real session before whoami | Kitploit
Tools/GitHubGitHub/abraxas/element-fragment-guest
Vulnerability AnalysisExploitationWeb Application ExploitationWeb SecurityAuthenticationLabs & Practice
GitHubabraxas/element-fragment-guest

element-fragment-guest

Element Web v1.12.29 - High - Remote - Session - fragment guest creds wipe a real session before whoami

View Repository
73 days agoNot yet reviewed

Most Popular

View all →

Discover the most used tools by our community.

Explore all tools

Browse our collection of tools

View all tools →
Share

Abraxas Labs - element-fragment-guest

abraxaslabs.tech  ·  github.com/abraxas  ·  @abraxas_null  ·  [email protected]  ·  element-fragment-guest

element-fragment-guest

Element Web v1.12.29 - Element / New Vector

Class: Session destruction Reach: Remote

Lifecycle.loadSession prefers guest_user_id and guest_access_token from the URL hash over restoreSessionFromStorage. Guests are on by default (enableGuest={!config.disable_guests}). app.element.io config.json does not set disable_guests. onTokenLoginCompleted strips SSO and OIDC params only. It never strips the guest keys. url_utils.ts already comments that these fragment params look unused. They still win.

Anyone who can get a signed-in user to open a hash URL with guest fragment params logs them out and wipes local crypto. A garbage token is enough. whoami is never called.

IDno CVE yet
CWECWE-384 / CWE-352 / CWE-613
CVSSHigh: 7.1 CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:U/C:N/I:H/A:H
ProductElement Web
Affectedv1.12.29 tag v1.12.29 (2d90d6b7b601ecb9ccdf81239a43b4396b4b0c9e). Guests enabled (default).
Authunauthenticated attacker. Victim must open (or reload) a URL.
LicenseGNU Affero GPL v3.0
Lab127.0.0.1 only

What an attacker can do

Get a signed-in user to open a hash URL with guest fragment params. The client logs them out, wipes local crypto, and may park them on an attacker guest. This is logout and crypto wipe. It is not steal-the-real-token. It is not OS RCE.

PrivilegeMethod / sinkRecon / integrity / availabilityLab-proven or inferred
Parse guest creds from the hashurl_utils.ts guest: { keys: ["guest_user_id", "guest_access_token"], location: "fragment" }Integrity of session selectionLab-proven. #/home?guest_user_id=...&guest_access_token=... became guest_params. Query-string only did not.
Prefer guest over a stored non-guest sessionLifecycle.loadSession guest-first branch, log Using guest access credentialsIntegrityLab-proven. Seeded @victim:example.org was not restored.
Wipe localStorage, IndexedDB account, sessionStorage, cryptodoSetLoggedIn(..., clearStorageEnabled=true) then clearStorage()Integrity / availability of the local sessionLab-proven. crypto_empty=yes, prior token gone.
Skip token validationGuest path never calls /_matrix/client/v3/account/whoamiIntegrityLab-proven. whoami_called=no. Garbage token not-a-real-token still wiped.
Persist attacker guest credspersistCredentials after the wipeIntegrityLab-proven. after_user=@x:example.org, after_token=not-a-real-token, mx_is_guest=true.
Fixate onto a real guest on the default HSSame persist if the guest token is validIntegrityInferred. Lab used a garbage token, so no live HS login.
Keep doing this on reloadGuest keys stay in the hash; onTokenLoginCompleted does not delete themIntegrityInferred from pin app.tsx. Lab opened the URL once.

Closed on this leftover: steal the real access token (it is deleted, not exfiltrated). OS RCE / LPE (Desktop nodeIntegration: false, sandbox). Live Element SPA (how=gadget). Query-string ?guest_user_id= (fragment only). disable_guests: true keeps the non-guest session. A patched loadSession that ignores guest when a non-guest session exists also keeps it.

Same pin leftovers: vector: Windows drive-letter, Univention ICS javascript: href.

How I found it

I pinned Element Web v1.12.29 after the 22 Sep 2026 GitHub release. SSO loginToken is query-only and stripped after use. Guest keys still sit in the fragment and win over restore. The comment in url_utils.ts is the tell: they already doubted these keys were specified.

Wrong turns already recorded: treating query-string ?guest_user_id= as the vector (keys live in the hash); calling this token theft (the real token is deleted, not sent); expecting disable_guests on app.element.io config (it is unset). A reverse shell. Theatre.

Lab

Gadget of the pin functions. Not a live Element Web container. how=gadget.

python3 element-fragment-guest-Abraxas-Labs.py

or

cd lab
./run.sh

Target only http://127.0.0.1:19600. Compose project element-fragment-guest. Stack tears down after the run.

SUCCESS element-fragment-guest how=gadget guest-wipe=yes prior-kept=no garbage-token=yes disable-guests-keeps=yes ELEMENT-FRAGMENT-GUEST-WITNESS

The fix

Ignore guest fragment params when a non-guest session already exists. Validate the guest token with /_matrix/client/v3/account/whoami before clearStorage. Strip guest_user_id and guest_access_token the same way SSO tokens are stripped. Default disable_guests: true for hosted app.element.io.

References

  • github.com/element-hq/element-web tag v1.12.29
  • Lifecycle.ts (loadSession guest-first)
  • url_utils.ts
  • app.tsx (enableGuest={!config.disable_guests})
  • Same pin: element-vector-drive-letter · element-ics-javascript
  • CWE-384

License

GNU Affero GPL v3.0. See LICENSE. Loopback lab only. No warranty.

Download Tool