
Element Web v1.12.29 — высокий — удалённый — XSS — ссылка navigation.json в Univention ICS становится href меню javascript:
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 — нет. Предпросмотр 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: токен доступа, криптохранилище, сессия. Это не RCE в ОС. В десктопной версии по-прежнему отключён nodeIntegration и есть песочница.
| Привилегия | Метод / сток | Разведка / целостность / доступность | Доказано в лаборатории или выведено |
|---|---|---|---|
Отрисовка <a href="javascript:…"> меню баннера в origin 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-портала по-прежнему отрисовывалась |
| Выполнение скрипта в origin Element после клика | Жертва нажимает на элемент меню (UI:R) | Целостность | Выведено из стока href. Лаборатория не выполняла клик в браузере и не похищала живой токен Matrix |
| Чтение токена доступа Matrix / криптохранилища (захват учётной записи) | Скрипт в origin против localStorage / сессии IndexedDB | Разведка / целостность | Выведено из XSS в origin 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 (Desktop nodeIntegration: false, sandbox, contextIsolation). Timeline HTML XSS. URL-preview javascript: (GHSA-9r5h previewFromBundle требует http:/https:). HTML export XSS (GHSA-wqmv). Widget media token (GHSA-3jm3). Static banner 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 preview уже усвоил http:/https: на собственном горьком опыте. Univention ICS link по-прежнему z.string(). Конфигурация статического меню использует z.url(). Путь fetch никогда не проходит через эту проверку.
Уже зафиксированные неверные повороты: считать default app.element.io жертвой (Univention закрыт шлюзом); считать z.url() allowlist схем (конструктор URL принимает javascript:); раздувать click XSS до OS RCE. Обратная оболочка. Театр.
Гаджет функций пина плюс mock ICS navigation.json. Не живой контейнер Element Web. how=gadget. Применение allowlist http/https для URL-preview (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: для ICS link так же, как это делает previewFromBundle. Отклонять javascript:, data: и другие схемы до href=. Изолировать скрытый iframe (sandbox="" или как минимум без allow-top-navigation). Не считать z.url() списком разрешённых схем.
navigation.tsMenu.tsxSilentLogin.tsxpreviewFromBundleGNU Affero GPL v3.0. См. LICENSE. Только для лаборатории на loopback. Без гарантий.