abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · element-fragment-guest
Element Web v1.12.29 - Element / New Vector
クラス: セッション破壊 到達範囲: リモート
Lifecycle.loadSession は、restoreSessionFromStorage よりも URL ハッシュ内の guest_user_id と guest_access_token を優先します。ゲストはデフォルトで有効です(enableGuest={!config.disable_guests})。app.element.io の config.json は disable_guests を設定していません。onTokenLoginCompleted は SSO と OIDC のパラメータのみを削除します。ゲストキーは決して削除しません。url_utils.ts には、これらのフラグメントパラメータは未使用に見えると既にコメントされています。それでもこれらが優先されます。
サインイン済みのユーザーに、ゲストフラグメントパラメータを含むハッシュ URL を開かせることができる者は誰でも、そのユーザーをログアウトさせ、ローカルの暗号を消去します。不正なトークンで十分です。whoami は決して呼び出されません。
| ID | CVE 未割当 |
| CWE | CWE-384 / CWE-352 / CWE-613 |
| CVSS | High: 7.1 CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:U/C:N/I:H/A:H |
| 製品 | Element Web |
| 影響範囲 | v1.12.29 タグ v1.12.29 (2d90d6b7b601ecb9ccdf81239a43b4396b4b0c9e)。ゲスト有効(デフォルト)。 |
| 認証 | 未認証の攻撃者。被害者は URL を開く(または再読み込みする)必要があります。 |
| ライセンス | GNU Affero GPL v3.0 |
| ラボ | 127.0.0.1 のみ |
サインイン済みのユーザーに、ゲストフラグメントパラメータを含むハッシュ URL を開かせます。クライアントはユーザーをログアウトさせ、ローカルの暗号を消去し、攻撃者のゲストに誘導する可能性があります。これはログアウトと暗号消去です。本物のトークンを盗むものではありません。OS の RCE でもありません。
| 権限 | メソッド / シンク | 偵察 / 完全性 / 可用性 | ラボ実証または推測 |
|---|---|---|---|
| ハッシュからゲスト資格情報を解析 | url_utils.ts guest: { keys: ["guest_user_id", "guest_access_token"], location: "fragment" } | セッション選択の完全性 | ラボ実証済み。#/home?guest_user_id=...&guest_access_token=... は guest_params になりました。クエリ文字列のみではなりませんでした。 |
| 保存された非ゲストセッションよりゲストを優先 | Lifecycle.loadSession のゲスト優先分岐、ログ Using guest access credentials | 完全性 | ラボ実証済み。シードされた @victim:example.org は復元されませんでした。 |
| localStorage、IndexedDB アカウント、sessionStorage、暗号を消去 | doSetLoggedIn(..., clearStorageEnabled=true) の後に clearStorage() | ローカルセッションの完全性 / 可用性 | ラボ実証済み。crypto_empty=yes、以前のトークンは消滅。 |
| トークン検証をスキップ | ゲストパスは /_matrix/client/v3/account/whoami を決して呼び出さない | 完全性 | ラボ実証済み。whoami_called=no。不正なトークン not-a-real-token でも消去されました。 |
| 攻撃者のゲスト資格情報を永続化 | 消去後の persistCredentials | 完全性 | ラボ実証済み。after_user=@x:example.org、after_token=not-a-real-token、mx_is_guest=true。 |
| デフォルト HS 上の実在するゲストに固定 | ゲストトークンが有効な場合、同じ永続化 | 完全性 | 推測。ラボでは不正なトークンを使用したため、ライブ HS ログインはなし。 |
| 再読み込み時にもこれを継続 | ゲストキーはハッシュに残る。onTokenLoginCompleted はそれらを削除しない | 完全性 | ピン app.tsx からの推測。ラボでは URL を一度開いた。 |
この残存物で除外されたもの: 本物のアクセストークンの窃取(削除されるのであり、外部送信ではない)。OS RCE / LPE(Desktop nodeIntegration: false、サンドボックス)。ライブ Element SPA(how=gadget)。クエリ文字列 ?guest_user_id=(フラグメントのみ)。disable_guests: true は非ゲストセッションを維持します。非ゲストセッションが存在する場合にゲストを無視するパッチ済み loadSession もそれを維持します。
同じピンの残存物: vector: Windows ドライブレター、Univention ICS javascript: href。
2026年9月22日の GitHub リリース後、Element Web v1.12.29 をピン留めしました。SSO loginToken はクエリのみで、使用後に削除されます。ゲストキーは依然としてフラグメント内にあり、復元より優先されます。url_utils.ts のコメントが手がかりです。彼らはこれらのキーが仕様化されていることを既に疑っていました。
既に記録された誤った道: クエリ文字列 ?guest_user_id= をベクターとして扱うこと(キーはハッシュ内に存在)。これをトークン窃取と呼ぶこと(本物のトークンは削除され、送信されない)。app.element.io の設定に disable_guests を期待すること(未設定)。リバースシェル。茶番。
ピンの関数のガジェット。ライブ Element Web コンテナではありません。how=gadget。
python3 element-fragment-guest-Abraxas-Labs.py
または
cd lab
./run.sh
対象は http://127.0.0.1:19600 のみ。Compose プロジェクト element-fragment-guest。スタックは実行後に破棄されます。
SUCCESS element-fragment-guest how=gadget guest-wipe=yes prior-kept=no garbage-token=yes disable-guests-keeps=yes ELEMENT-FRAGMENT-GUEST-WITNESS
非ゲストセッションが既に存在する場合、ゲストフラグメントパラメータを無視します。clearStorage の前に /_matrix/client/v3/account/whoami でゲストトークンを検証します。SSO トークンが削除されるのと同じ方法で guest_user_id と guest_access_token を削除します。ホストされた app.element.io では disable_guests: true をデフォルトにします。
Lifecycle.ts(loadSession ゲスト優先)url_utils.tsapp.tsx(enableGuest={!config.disable_guests})GNU Affero GPL v3.0。LICENSE を参照。ループバックラボのみ。無保証。