
Element Desktop v1.12.29 - Alta - Local - Archivo - vector: el protocolo lee archivos de Windows fuera de la jaula asar
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · element-vector-drive-letter
Análisis: https://abraxaslabs.tech/research/element-vector-drive-letter
Element Desktop v1.12.29 - Element Creations Ltd
Clase: Lectura de archivos Alcance: Local
apps/desktop/src/electron-main.ts registra vector: como un protocolo de archivo privilegiado. La jaula es solo relTarget.startsWith("..") después de path.normalize(path.join(...pathname.split("/").slice(2))). En Windows, una unión de C:, Windows, win.ini ya es C:\Windows\win.ini. Las rutas absolutas no comienzan con .., por lo que la comprobación las deja pasar. La propia nota de protocolo personalizado de Electron también rechaza path.isAbsolute. El path.join de POSIX no trata C: como absoluto, por lo que Linux y macOS no se ven afectados por este residuo. will-navigate permite el paso de vector:.
Un XSS en el renderer, DevTools u otro proceso local puede ejecutar fetch("vector://vector/webapp/C:/Windows/win.ini") y leer archivos que el proceso de Element puede abrir.
| ID | aún sin CVE |
| 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 |
| Producto | element-web Desktop (apps/desktop) |
| Afectado | v1.12.29 (2d90d6b7b601ecb9ccdf81239a43b4396b4b0c9e). Solo Windows. |
| Autenticación | renderer local (DevTools / XSS) |
| Licencia | GNU Affero GPL v3.0 |
| Laboratorio | solo 127.0.0.1 |
XSS en el renderer, DevTools u otro proceso local que pueda alcanzar vector:. No se ejecutó Element Desktop nativo de Windows. El gadget copia el analizador de URL del pin y usa path.win32 de Node.
| Privilegio | Método / sink | Reconocimiento / integridad / disponibilidad | Demostrado en laboratorio o inferido |
|---|---|---|---|
| Leer un archivo que el proceso de Element puede abrir | fetch("vector://vector/webapp/C:/Windows/win.ini"). La jaula es solo relTarget.startsWith(".."). La unión con letra de unidad es absoluta, por lo que la comprobación pasa. path.win32.resolve(asar, relTarget) es C:\Windows\win.ini | Reconocimiento | Demostrado en laboratorio con el gadget del analizador de URL. El cuerpo es ELEMENT-VECTOR-DRIVE-LETTER-WITNESS. No se ejecutó el Desktop nativo |
La misma lectura de electron-config, perfiles, archivos de otros usuarios en la misma ACL | La misma petición vector://vector/webapp/C:/... | Reconocimiento | Inferido. El laboratorio colocó win.ini, no secretos reales |
| ATO de Matrix si el marco principal carga HTML del atacante ya presente en disco | will-navigate permite el paso de vector:. El HTML hostil en vector://vector obtiene preload / window.electron (tokens, Seshat, clearStorage) | Integridad | Inferido a partir de webcontents-handler.ts y el preload. El laboratorio no navegó un BrowserWindow |
Recorrido ../ del árbol asar | vector://vector/webapp/../ | n/a | Cerrado aquí. La URL WHATWG lo colapsa; el manejador devuelve FILE_NOT_FOUND (-6) |
| Petición con letra de unidad en POSIX / macOS / Linux | path.posix.join deja C:/Windows/win.ini bajo asar | n/a | Cerrado aquí. El gadget posix devuelve 404, sin testigo |
| RCE / LPE del sistema operativo | nodeIntegration: false, app.enableSandbox() | n/a | Cerrado. No es este residuo |
Restos del mismo pin: fragment guest wipe, Univention ICS javascript: href.
Fijé element-hq/element-web v1.12.29 tras la release de GitHub del 22 de septiembre de 2026. El XSS de la línea de tiempo, el XSS de la exportación HTML (GHSA-wqmv), el HTML de la página de inicio (GHSA-wrcp), el token de medios del widget (GHSA-3jm3) y las claves de Element Call (GHSA-69q3) están cerrados en esta etiqueta. El protocolo personalizado de Desktop todavía solo comprueba startsWith("..").
new URL("vector://vector/webapp/C:/Windows/win.ini") mantiene C: como segmento de ruta. path.win32.join("C:", "Windows", "win.ini") es C:\Windows\win.ini. El path.win32.join(asar, abs) de Node concatena; path.win32.resolve descarta la raíz del asar.
Falsos caminos ya registrados: tratar ../ como el resto (WHATWG lo colapsa, el handler devuelve 404); llamar al C: POSIX el mismo bug (el join posix se queda bajo el asar); inflar la lectura de archivos a RCE del sistema operativo (el sandbox y nodeIntegration: false siguen activos). Una reverse shell. Teatro.
Gadget del parser de URL. path.win32 de Node frente a path.posix. Ningún proceso de Element Desktop en Windows. El /lab/oracle/win.ini plantado hace las veces de C:\Windows\win.ini. /lab/asar/index.html es la jaula del asar.
python3 element-vector-drive-letter-Abraxas-Labs.py
o
cd lab
./run.sh
Dirígete solo a http://127.0.0.1:19610. Compón el proyecto element-vector-drive-letter. El stack se desmonta después de la ejecución.
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
Después de normalizar, rechazar path.isAbsolute(relTarget) y exigir que path.resolve(baseDir, relTarget) permanezca bajo path.resolve(baseDir) (path.relative, rechazar ..).
electron-main.ts (registerFileProtocol)webcontents-handler.ts (will-navigate)GNU Affero GPL v3.0. Véase LICENSE. Solo laboratorio de loopback. Sin garantía.