
Element Web v1.12.29 - عالي - عن بُعد - XSS - رابط Univention ICS navigation.json يصبح javascript: menu href
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · element-ics-javascript
تقرير: https://abraxaslabs.tech/research/element-ics-javascript
Element Web v1.12.29 - Element / New Vector
الفئة: XSS الوصول: عن بُعد
وحدة لافتة Univention تجلب ملف ICS navigation.json، وتقبل حقل link لكل مُدخل بصيغة z.string() دون التحقق من المخطط، ويضع ملف Menu.tsx تلك السلسلة في وسم <a href> منسّق. يستخدم إعداد القائمة الثابت z.url() لحقل link_url. أما مسار ICS فلا يفعل ذلك. معاينة الروابط على نفس الإصدار المثبّت ترفض بالفعل javascript: (previewFromBundle، GHSA-9r5h). هذا ليس الوضع الافتراضي لـ app.element.io. فهو يتطلب modules/banner مع menu.type بقيمة univention، إضافةً إلى ملف ICS يثق به النشر.
أي شخص يستطيع تعديل ملف navigation.json ذلك يمكنه زرع javascript: أو data:. المستخدم المسجّل الدخول الذي يفتح قائمة اللافتة وينقر على العنصر يشغّل سكربتًا على أصل Element.
| المعرّف | لا يوجد CVE بعد |
| CWE | CWE-79 / CWE-20 |
| CVSS | متوسط: 6.8 CVSS:3.1/AV:N/AC:L/PR:H/UI:R/S:U/C:H/I:H/A:N |
| المنتج | Element Web |
| المتأثر | وسم v1.12.29 v1.12.29 (2d90d6b7b601ecb9ccdf81239a43b4396b4b0c9e). مقيّد: لافتة Univention + ICS. |
| المصادقة | مشغّل ICS / اختراق ICS. الضحية مستخدم مسجّل الدخول ينقر على عنصر القائمة. |
| الترخيص | GNU Affero GPL v3.0 |
| المختبر | 127.0.0.1 فقط |
اختراق أو تشغيل ICS الذي يثق به نشر Element. ضع رابط javascript: (أو data:) في navigation.json. انتظر حتى يفتح مستخدم مسجّل الدخول قائمة اللافتة وينقر على العنصر. هذا يعني الاستيلاء على حساب Matrix: رمز الوصول، ومخزن التشفير، والجلسة. وهو ليس تنفيذ أوامر عن بُعد على مستوى نظام التشغيل. فلا يزال سطح المكتب يعمل مع تعطيل nodeIntegration ووجود صندوق عزل.
| الصلاحية | الطريقة / نقطة الوصول | الاستطلاع / السلامة / التوافر | مُثبت مختبريًا أو مُستنتج |
|---|---|---|---|
عرض <a href="javascript:…"> في قائمة اللافتة على أصل Element | ICS navigation.json entries[].link -> navigationToConfig link_url -> Menu.tsx LinkButton href={link.link_url} | سلامة DOM الخاصة بالقائمة | مُثبت مختبريًا. رابط ICS الوهمي javascript:ELEMENT-ICS-JAVASCRIPT-WITNESS أصبح ذلك الـ href. ولا يزال رابط بوابة https يُعرض |
| تشغيل سكربت بأصل Element بعد النقر | الضحية ينقر على عنصر القائمة (UI:R) | السلامة | مُستنتج من نقطة وصول href. لم يقُد المختبر نقرة متصفح أو يسرق رمز Matrix حيًّا |
| قراءة رمز وصول Matrix / مخزن التشفير (الاستيلاء على الحساب) | سكربت داخل الأصل مقابل localStorage / جلسة IndexedDB | الاستطلاع / السلامة | مُستنتج من XSS بأصل Element. شاهد المختبر هو سلسلة href |
| توجيه تبويب Element إلى صفحة تصيّد | إطار iframe غير معزول في SilentLogin.tsx src={new URL("silent", icsUrl)} | السلامة | مُثبت مختبريًا أن الإطار iframe لا يحتوي على sandbox. لم يُجرَّب التوجيه العلوي |
نفس الزرع عبر data: | z.string() يقبل أي مخطط | السلامة | مُستنتج. زرع المختبر javascript: فقط |
مغلق على هذا التثبيت: default app.element.io (بدون لافتة Univention). OS RCE / LPE (سطح المكتب nodeIntegration: false، sandbox، contextIsolation). Timeline HTML XSS. معاينة URL javascript: (GHSA-9r5h previewFromBundle يتطلب http:/https:). HTML export XSS (GHSA-wqmv). Widget media token (GHSA-3jm3). اللافتة الثابتة link_url: z.url() هي إعداد المشغّل، وليست ICS؛ كما أن z.url() ليست قائمة سماح لـ http/https.
بقايا نفس التثبيت: fragment guest wipe، vector: Windows drive-letter.
ثبّتت Element Web v1.12.29 بعد إصدار GitHub في 22 سبتمبر 2026. تعلّمت معاينة URL بالفعل http:/https: بالطريقة الصعبة. لا يزال link الخاص بـ Univention ICS هو z.string(). يستخدم إعداد القائمة الثابتة z.url(). مسار الجلب لا يمر أبدًا عبر ذلك الفحص.
مسارات خاطئة مسجّلة بالفعل: اعتبار default app.element.io هو الضحية (Univention محمي ببوابة)؛ اعتبار z.url() قائمة سماح للمخططات (مُنشئ URL يقبل javascript:)؛ تضخيم click XSS إلى OS RCE. reverse shell. مسرح.
أداة من دوال التثبيت بالإضافة إلى navigation.json وهمي لـ ICS. ليس حاوية Element Web حية. how=gadget. أدى تطبيق قائمة السماح http/https لمعاينة URL (previewFromBundle) إلى إسقاط href الخاص بـ javascript والإبقاء على رابط بوابة https.
python3 element-ics-javascript-Abraxas-Labs.py
أو
cd lab
./run.sh
استهدف فقط http://127.0.0.1:19620. مشروع Compose element-ics-javascript. تُفكَّك الحزمة بعد التشغيل.
SUCCESS element-ics-javascript how=gadget href-scheme=javascript menu-a-javascript=yes allowlist-rejects=yes silent-no-sandbox=yes ELEMENT-ICS-JAVASCRIPT-WITNESS
اسمح بـ http: وhttps: في link الخاص بـ ICS بالطريقة نفسها التي يفعلها previewFromBundle. ارفض javascript: وdata: والمخططات الأخرى قبل href=. ضع الـ iframe الصامت في وضع العزل (sandbox) (sandbox="" أو على الأقل بدون allow-top-navigation). لا تتعامل مع z.url() كقائمة سماح للمخططات.
navigation.tsMenu.tsxSilentLogin.tsxpreviewFromBundleGNU Affero GPL v3.0. راجع LICENSE. مختبر loopback فقط. دون أي ضمان.