
Element Web v1.12.29 - उच्च - रिमोट - सेशन - fragment guest creds whoami से पहले वास्तविक सेशन को मिटा देता है
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · element-fragment-guest
लेख: https://abraxaslabs.tech/research/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 | उच्च: 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 पर वास्तविक अतिथि पर फ़िक्सेट करें | यदि अतिथि टोकन वैध है तो वही persist | अखंडता | अनुमानित। लैब ने कचरा टोकन का उपयोग किया, इसलिए कोई लाइव HS लॉगिन नहीं। |
| पुनः लोड पर यह करते रहें | अतिथि कुंजियाँ हैश में बनी रहती हैं; onTokenLoginCompleted उन्हें नहीं हटाता | अखंडता | पिन app.tsx से अनुमानित। लैब ने URL एक बार खोला। |
इस बचे हुए मामले को बंद किया: असली एक्सेस टोकन चुराया गया (यह हटा दिया गया है, बाहर नहीं भेजा गया)। OS RCE / LPE (Desktop nodeIntegration: false, sandbox)। लाइव Element SPA (how=gadget)। Query-string ?guest_user_id= (केवल fragment)। disable_guests: true गैर-गेस्ट सत्र को बनाए रखता है। एक पैच किया गया loadSession जो गैर-गेस्ट सत्र मौजूद होने पर गेस्ट को अनदेखा करता है, वह भी इसे बनाए रखता है।
वही pin leftovers: vector: Windows drive-letter, Univention ICS javascript: href।
22 सितम्बर 2026 की GitHub रिलीज़ के बाद मैंने Element Web v1.12.29 को pin किया। SSO loginToken केवल query में होता है और उपयोग के बाद हटा दिया जाता है। गेस्ट कुंजियाँ अभी भी fragment में बैठी हैं और restore पर हावी हो जाती हैं। url_utils.ts में टिप्पणी ही संकेत है: उन्हें पहले से ही संदेह था कि ये कुंजियाँ specified थीं।
पहले से दर्ज गलत रास्ते: query-string ?guest_user_id= को vector मानना (कुंजियाँ hash में रहती हैं); इसे token theft कहना (असली टोकन हटा दिया जाता है, भेजा नहीं जाता); app.element.io config पर disable_guests की अपेक्षा करना (यह unset है)। एक reverse shell। नाटक।
pin functions का gadget। लाइव Element Web कंटेनर नहीं। how=gadget।
python3 element-fragment-guest-Abraxas-Labs.py
या
cd lab
./run.sh
केवल http://127.0.0.1:19600 को लक्षित करें। प्रोजेक्ट 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। केवल लूपबैक लैब। कोई वारंटी नहीं।