
Element Desktop v1.12.29 — высокий — локальный — файл — вектор: протокол читает файлы Windows за пределами asar-песочницы
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · element-vector-drive-letter
Разбор: https://abraxaslabs.tech/research/element-vector-drive-letter
Element Desktop v1.12.29 - Element Creations Ltd
Класс: чтение файлов Доступ: локальный
apps/desktop/src/electron-main.ts регистрирует vector: как привилегированный файловый протокол. Ограничение сводится лишь к relTarget.startsWith("..") после path.normalize(path.join(...pathname.split("/").slice(2))). В Windows объединение C:, Windows, win.ini уже даёт C:\Windows\win.ini. Абсолютные пути не начинаются с .., поэтому проверка их пропускает. Заметка Electron о пользовательских протоколах также отвергает path.isAbsolute. В POSIX path.join не считает C: абсолютным путём, поэтому Linux и macOS этой ошибкой не затронуты. will-navigate пропускает vector:.
XSS в рендерере, DevTools или другой локальный процесс может выполнить fetch("vector://vector/webapp/C:/Windows/win.ini") и прочитать файлы, которые может открыть процесс Element.
| ID | CVE пока нет |
| CWE | CWE-22 / CWE-73 |
| CVSS | Высокий: 8.3 CVSS:3.1/AV:L/AC:L/PR:N/UI:R/S:C/C:H/I:H/A:N |
| Продукт | element-web Desktop (apps/desktop) |
| Затронуто | v1.12.29 (2d90d6b7b601ecb9ccdf81239a43b4396b4b0c9e). Только Windows. |
| Аутентификация | локальный рендерер (DevTools / XSS) |
| Лицензия | GNU Affero GPL v3.0 |
| Лаборатория | только 127.0.0.1 |
XSS в рендерере, DevTools или другой локальный процесс, способный обратиться к vector:. Нативный Element Desktop для Windows не запускался. Гаджет копирует парсер URL из PoC и использует Node path.win32.
| Привилегия | Метод / точка срабатывания | Разведка / целостность / доступность | Доказано в лаборатории или выведено логически |
|---|---|---|---|
| Чтение файла, который может открыть процесс Element | fetch("vector://vector/webapp/C:/Windows/win.ini"). Ограничение сводится лишь к relTarget.startsWith(".."). Объединение с буквой диска даёт абсолютный путь, поэтому проверка проходит. path.win32.resolve(asar, relTarget) даёт C:\Windows\win.ini | Разведка | Доказано в лаборатории на гаджете парсера URL. Тело ответа — ELEMENT-VECTOR-DRIVE-LETTER-WITNESS. Нативный Desktop не запускался |
То же чтение electron-config, профилей, файлов других пользователей с теми же ACL | Тот же запрос vector://vector/webapp/C:/... | Разведка | Выведено логически. В лаборатории подложен win.ini, а не реальные секреты |
| Захват аккаунта Matrix, если главный фрейм загружает HTML атакующего, уже находящийся на диске | will-navigate пропускает vector:. Враждебный HTML по адресу vector://vector получает preload / window.electron (токены, Seshat, clearStorage) | Целостность | Выведено логически из webcontents-handler.ts и preload. В лаборатории переход BrowserWindow не выполнялся |
Обход ../ по дереву asar | vector://vector/webapp/../ | н/д | Закрыто здесь. WHATWG URL сворачивает его; обработчик возвращает FILE_NOT_FOUND (-6) |
| Запрос с буквой диска в POSIX / macOS / Linux | path.posix.join оставляет C:/Windows/win.ini внутри asar | н/д | Закрыто здесь. Гаджет в posix даёт 404, свидетеля нет |
| RCE / LPE в ОС | nodeIntegration: false, app.enableSandbox() | н/д | Закрыто. Это не данная ошибка |
Оставшиеся артефакты того же пина: fragment guest wipe, Univention ICS javascript: href.
Я закрепил element-hq/element-web v1.12.29 после релиза на GitHub 22 сентября 2026 года. XSS в таймлайне, XSS в HTML-экспорте (GHSA-wqmv), HTML главной страницы (GHSA-wrcp), токен медиа виджета (GHSA-3jm3) и ключи Element Call (GHSA-69q3) на этом теге закрыты. Пользовательский протокол Desktop по-прежнему проверяет только startsWith("..").
new URL("vector://vector/webapp/C:/Windows/win.ini") сохраняет C: как сегмент пути. path.win32.join("C:", "Windows", "win.ini") даёт C:\Windows\win.ini. Node path.win32.join(asar, abs) выполняет конкатенацию; path.win32.resolve отбрасывает корень asar.
Уже зафиксированные ошибочные пути: трактовка ../ как остаточного артефакта (WHATWG схлопывает его, обработчик возвращает 404); объявление POSIX-пути C: той же ошибкой (posix join остаётся внутри asar); раздувание чтения файла до RCE на уровне ОС (песочница и nodeIntegration: false остаются включёнными). Обратная оболочка. Театр.
Гаджет парсера URL. Node path.win32 против path.posix. Процесс Windows Element Desktop отсутствует. Подложенный /lab/oracle/win.ini заменяет C:\Windows\win.ini. /lab/asar/index.html — это тюрьма asar.
python3 element-vector-drive-letter-Abraxas-Labs.py
или
cd lab
./run.sh
Цель — только http://127.0.0.1:19610. Compose-проект element-vector-drive-letter. Стек удаляется после запуска.
SUCCESS element-vector-drive-letter how=gadget win32-drive-letter=200 posix-drive-letter=404 control-dotdot=404 patched-isabs=404 ELEMENT-VECTOR-DRIVE-LETTER-WITNESS
После нормализации отклоняйте path.isAbsolute(relTarget) и требуйте, чтобы path.resolve(baseDir, relTarget) оставался внутри path.resolve(baseDir) (path.relative, отклонять ..).
electron-main.ts (registerFileProtocol)webcontents-handler.ts (will-navigate)GNU Affero GPL v3.0. См. LICENSE. Только для лаборатории с loopback. Без гарантий.