
Element Web v1.12.29 — высокий — удалённый — XSS — ссылка navigation.json в Univention ICS становится href меню javascript:
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · 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 — нет. Предпросмотр URL на том же пине уже отклоняет javascript: (previewFromBundle, GHSA-9r5h). Это не стандартный app.element.io. Требуется modules/banner с menu.type univention, а также ICS, которому доверяет развёртывание.
Любой, кто может изменить этот navigation.json, внедряет javascript: или data:. Аутентифицированный пользователь, открывающий меню баннера и кликающий по элементу, выполняет скрипт в origin Element.
| ID | 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. Поместить URL javascript: (или data:) в navigation.json. Дождаться, пока аутентифицированный пользователь откроет меню баннера и кликнет по элементу. Это захват учётной записи Matrix: токен доступа, криптохранилище, сессия. Это не OS RCE. В Desktop по-прежнему nodeIntegration отключён и есть песочница.
| Привилегия | Метод / sink | Разведка / целостность / доступность | Доказано в лаборатории или выведено |
|---|---|---|---|
Отрисовка <a href="javascript:…"> меню баннера в origin Element | ICS navigation.json entries[].link -> navigationToConfig link_url -> Menu.tsx LinkButton href={link.link_url} | Целостность DOM меню | Доказано в лаборатории. Ссылка mock ICS javascript:ELEMENT-ICS-JAVASCRIPT-WITNESS стала этим href. Ссылка https-портала по-прежнему отрисована |
| Выполнение скрипта в origin Element после клика | Жертва кликает по элементу меню (UI:R) | Целостность | Выведено из sink href. Лаборатория не выполняла клик в браузере и не похищала живой токен Matrix |
| Чтение токена доступа Matrix / криптохранилища (захват учётной записи) | Скрипт в origin против localStorage / IndexedDB сессии | Разведка / целостность | Выведено из XSS в origin Element. Свидетель лаборатории — строка href |
| Верхняя навигация вкладки Element на фишинговую страницу | SilentLogin.tsx iframe без песочницы src={new URL("silent", icsUrl)} | Целостность | Доказано в лаборатории, что iframe не имеет sandbox. Верхняя навигация не проверялась |
То же внедрение через data: | z.string() принимает любую схему | Целостность | Выведено. Лаборатория внедряла только javascript: |
Закрыто на этом пине: стандартный app.element.io (нет баннера Univention). OS RCE / LPE (Desktop nodeIntegration: false, песочница, contextIsolation). XSS в HTML Timeline. javascript: в предпросмотре URL (GHSA-9r5h previewFromBundle требует http:/https:). XSS в HTML-экспорте (GHSA-wqmv). Токен медиа виджета (GHSA-3jm3). Статический баннер link_url: z.url() — это конфигурация оператора, а не ICS; z.url() также не является allowlist http/https.
Остатки того же пина: fragment guest wipe, vector: Windows drive-letter.
Я зафиксировал Element Web v1.12.29 после релиза на GitHub 22 сентября 2026. Предпросмотр URL уже усвоил http:/https: на собственном опыте. Univention ICS link по-прежнему z.string(). Статическая конфигурация меню использует z.url(). Путь загрузки никогда не проходит эту проверку.
Уже зафиксированные ошибочные пути: считать жертвой стандартный app.element.io (Univention ограничен условием); считать z.url() allowlist схем (конструктор URL принимает javascript:); раздувать XSS по клику до OS RCE. Обратная оболочка. Театр.
Гаджет функций пина плюс mock ICS navigation.json. Не живой контейнер Element Web. how=gadget. Применение allowlist http/https предпросмотра URL (previewFromBundle) убрало javascript href и сохранило 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: в allowlist для ICS link так же, как это делает previewFromBundle. Отклонять javascript:, data: и другие схемы до href=. Поместить silent iframe в песочницу (sandbox="" или как минимум без allow-top-navigation). Не считать z.url() allowlist схем.
navigation.tsMenu.tsxSilentLogin.tsxpreviewFromBundleGNU Affero GPL v3.0. См. LICENSE. Только loopback-лаборатория. Без гарантий.