
Element Web v1.12.29 - عالي - عن بُعد - الجلسة - شظية بيانات اعتماد الضيف تمحو جلسة حقيقية قبل 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 يفضّل guest_user_id وguest_access_token من تجزئة URL على restoreSessionFromStorage. الضيوف مفعّلون افتراضيًا (enableGuest={!config.disable_guests}). ملف config.json الخاص بـ app.element.io لا يضبط disable_guests. onTokenLoginCompleted يزيل معاملات SSO وOIDC فقط. لا يزيل مفاتيح الضيف أبدًا. url_utils.ts يعلّق بالفعل بأن معاملات التجزئة هذه تبدو غير مستخدمة. ومع ذلك فهي لا تزال تفوز.
أي شخص يستطيع جعل مستخدم مسجّل الدخول يفتح رابط hash يحتوي على معاملات تجزئة الضيف سيؤدي إلى تسجيل خروجه ومحو التشفير المحلي. تكفي رمزية غير صالحة. لا يتم استدعاء whoami أبدًا.
| المعرّف | لا يوجد 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). الضيوف مفعّلون (افتراضيًا). |
| المصادقة | مهاجم غير مصادَق. يجب أن يفتح الضحية رابطًا (أو يعيد تحميله). |
| الترخيص | GNU Affero GPL v3.0 |
| المختبر | 127.0.0.1 فقط |
اجعل مستخدمًا مسجّل الدخول يفتح رابط hash يحتوي على معاملات تجزئة الضيف. يقوم العميل بتسجيل خروجه، ومحو التشفير المحلي، وربما يتركه على حساب ضيف تابع للمهاجم. هذا تسجيل خروج ومحو للتشفير. ليس سرقة الرمزية الحقيقية. وليس تنفيذ أوامر عن بُعد على نظام التشغيل.
| الصلاحية | الطريقة / نقطة الوصول | الاستطلاع / السلامة / التوافر | مُثبت مختبريًا أو مُستنتج |
|---|---|---|---|
| تحليل بيانات اعتماد الضيف من التجزئة | 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. |
| التثبيت على ضيف حقيقي على خادم المنزل الافتراضي | نفس الاستمرار إذا كانت رمزية الضيف صالحة | السلامة | مُستنتج. استخدم المختبر رمزية غير صالحة، لذا لا يوجد تسجيل دخول حي إلى خادم المنزل. |
| الاستمرار في فعل ذلك عند إعادة التحميل | تبقى مفاتيح الضيف في التجزئة؛ onTokenLoginCompleted لا يحذفها | السلامة | مُستنتج من تثبيت app.tsx. فتح المختبر الرابط مرة واحدة. |
أُغلق هذا الأمر المتبقي: سرقة رمز الوصول الحقيقي (فهو محذوف، لا مُستخرج). RCE/LPE على مستوى نظام التشغيل (سطح المكتب nodeIntegration: false، وضع الحماية sandbox). تطبيق Element SPA الحيّ (how=gadget). سلسلة الاستعلام ?guest_user_id= (الجزء fragment فقط). disable_guests: true يُبقي الجلسة غير الضيفية. كما أن loadSession المُرقّعة التي تتجاهل الضيف عند وجود جلسة غير ضيفية تُبقيها أيضًا.
بقايا التثبيت نفسها: vector: حرف محرك أقراص Windows، Univention ICS javascript: href.
ثبّتُّ Element Web v1.12.29 بعد إصدار GitHub في 22 سبتمبر 2026. رمز loginToken الخاص بـ SSO موجود في سلسلة الاستعلام فقط ويُزال بعد الاستخدام. لا تزال مفاتيح الضيف موجودة في الجزء fragment وتتغلب على الاستعادة. التعليق في url_utils.ts هو الدليل: فقد شكّوا بالفعل في أن هذه المفاتيح محددة في المواصفات.
المسارات الخاطئة المسجلة سلفًا: التعامل مع سلسلة الاستعلام ?guest_user_id= كمتجه الهجوم (فالمفاتيح موجودة في الـ hash)؛ ووصف هذا بأنه سرقة رمز (فالرمز الحقيقي محذوف، لا مُرسل)؛ وتوقع وجود disable_guests في إعدادات app.element.io (فهو غير مضبوط). صدفة عكسية. مسرح.
أداة gadget لوظائف التثبيت. وليس حاوية 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
تجاهل معاملات جزء الضيف (guest fragment params) عند وجود جلسة غير ضيف بالفعل. تحقّق من رمز الضيف باستخدام /_matrix/client/v3/account/whoami قبل clearStorage. أزل guest_user_id وguest_access_token بالطريقة نفسها التي تُزال بها رموز SSO. اجعل disable_guests: true هو الافتراضي لـ hosted app.element.io.
Lifecycle.ts (loadSession guest-first)url_utils.tsapp.tsx (enableGuest={!config.disable_guests})GNU Affero GPL v3.0. راجع LICENSE. مختبر loopback فقط. دون أي ضمان.