
Element Desktop v1.12.29 - Alto - Local - Arquivo - vetor: protocolo lê arquivos do Windows fora da jaula asar
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · element-vector-drive-letter
Element Desktop v1.12.29 - Element Creations Ltd
Classe: Leitura de arquivo Alcance: Local
apps/desktop/src/electron-main.ts registra vector: como um protocolo de arquivo privilegiado. A jaula é apenas relTarget.startsWith("..") após path.normalize(path.join(...pathname.split("/").slice(2))). No Windows, um join de C:, Windows, win.ini já é C:\Windows\win.ini. Caminhos absolutos não começam com .., então a verificação os deixa passar. A própria nota de protocolo customizado do Electron também rejeita path.isAbsolute. O path.join do POSIX não trata C: como absoluto, então Linux e macOS não são este resquício. will-navigate permite vector: passar.
XSS no renderer, DevTools ou outro processo local pode fazer fetch("vector://vector/webapp/C:/Windows/win.ini") e ler arquivos que o processo do Element consegue abrir.
| ID | sem CVE ainda |
| CWE | CWE-22 / CWE-73 |
| CVSS | Alto: 8.3 CVSS:3.1/AV:L/AC:L/PR:N/UI:R/S:C/C:H/I:H/A:N |
| Produto | element-web Desktop (apps/desktop) |
| Afetado | v1.12.29 (2d90d6b7b601ecb9ccdf81239a43b4396b4b0c9e). Somente Windows. |
| Auth | renderer local (DevTools / XSS) |
| Licença | GNU Affero GPL v3.0 |
| Lab | somente 127.0.0.1 |
XSS no renderer, DevTools ou outro processo local que consiga acessar vector:. O Element Desktop nativo do Windows não foi executado. O gadget copia o parser de URL do pin e usa o path.win32 do Node.
| Privilégio | Método / sink | Recon / integridade / disponibilidade | Comprovado em lab ou inferido |
|---|---|---|---|
| Ler um arquivo que o processo do Element consegue abrir | fetch("vector://vector/webapp/C:/Windows/win.ini"). A jaula é apenas relTarget.startsWith(".."). O join com letra de unidade é absoluto, então a verificação passa. path.win32.resolve(asar, relTarget) é C:\Windows\win.ini | Recon | Comprovado em lab no gadget do parser de URL. O corpo é ELEMENT-VECTOR-DRIVE-LETTER-WITNESS. Desktop nativo não executado |
Mesma leitura de electron-config, perfis, arquivos de outros usuários na mesma ACL | Mesmo fetch vector://vector/webapp/C:/... | Recon | Inferido. O lab plantou win.ini, não segredos reais |
| ATO do Matrix se o frame principal carregar HTML do atacante já no disco | will-navigate deixa vector: passar. HTML hostil em vector://vector recebe preload / window.electron (tokens, Seshat, clearStorage) | Integridade | Inferido de webcontents-handler.ts e preload. O lab não navegou um BrowserWindow |
Travessia ../ da árvore do asar | vector://vector/webapp/../ | n/a | Fechado aqui. A URL WHATWG colapsa; o handler retorna FILE_NOT_FOUND (-6) |
| Fetch com letra de unidade em POSIX / macOS / Linux | path.posix.join deixa C:/Windows/win.ini sob o asar | n/a | Fechado aqui. Gadget posix 404, sem witness |
| RCE / LPE no SO | nodeIntegration: false, app.enableSandbox() | n/a | Fechado. Não é este resquício |
Resquícios do mesmo pin: fragment guest wipe, Univention ICS javascript: href.
Fiz o pin de element-hq/element-web v1.12.29 após o release do GitHub de 22 de setembro de 2026. XSS de timeline, XSS de exportação HTML (GHSA-wqmv), HTML da homepage (GHSA-wrcp), token de mídia de widget (GHSA-3jm3) e chaves do Element Call (GHSA-69q3) estão fechados nesta tag. O protocolo customizado do Desktop ainda só verifica startsWith("..").
new URL("vector://vector/webapp/C:/Windows/win.ini") mantém C: como segmento de caminho. path.win32.join("C:", "Windows", "win.ini") é C:\Windows\win.ini. O path.win32.join(asar, abs) do Node concatena; path.win32.resolve descarta a raiz do asar.
Caminhos errados já registrados: tratar ../ como o resquício (a WHATWG colapsa, o handler dá 404); chamar o C: do POSIX de mesmo bug (o join posix permanece sob o asar); inflar leitura de arquivo para RCE no SO (sandbox e nodeIntegration: false permanecem ativos). Um reverse shell. Teatro.
Gadget do parser de URL. path.win32 do Node vs path.posix. Sem processo do Element Desktop no Windows. /lab/oracle/win.ini plantado substitui C:\Windows\win.ini. /lab/asar/index.html é a jaula do asar.
python3 element-vector-drive-letter-Abraxas-Labs.py
ou
cd lab
./run.sh
Alvo somente http://127.0.0.1:19610. Projeto Compose element-vector-drive-letter. A stack é desmontada após a execução.
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
Após normalizar, rejeite path.isAbsolute(relTarget) e exija que path.resolve(baseDir, relTarget) permaneça sob path.resolve(baseDir) (path.relative, recuse ..).
electron-main.ts (registerFileProtocol)webcontents-handler.ts (will-navigate)GNU Affero GPL v3.0. Veja LICENSE. Somente lab em loopback. Sem garantia.