
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
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 son este remanente. will-navigate permite el paso de vector:.
XSS en el renderer, DevTools u otro proceso local puede hacer fetch("vector://vector/webapp/C:/Windows/win.ini") y leer archivos que el proceso de Element puede abrir.
| ID | sin CVE todavía |
| 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 el path.win32 de Node.
| Privilegio | Método / sink | Reconocimiento / integridad / disponibilidad | Probado 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 de letra de unidad es absoluta, por lo que la comprobación pasa. path.win32.resolve(asar, relTarget) es C:\Windows\win.ini | Reconocimiento | Probado en laboratorio con el gadget del analizador de URL. El cuerpo es ELEMENT-VECTOR-DRIVE-LETTER-WITNESS. Desktop nativo no ejecutado |
La misma lectura de electron-config, perfiles, archivos de otros usuarios en la misma ACL | El mismo fetch vector://vector/webapp/C:/... | Reconocimiento | Inferido. El laboratorio plantó 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:. HTML hostil en vector://vector obtiene preload / window.electron (tokens, Seshat, clearStorage) | Integridad | Inferido de webcontents-handler.ts y preload. El laboratorio no navegó un BrowserWindow |
Traversal ../ del árbol asar | vector://vector/webapp/../ | n/a | Cerrado aquí. La URL de WHATWG lo colapsa; el manejador devuelve FILE_NOT_FOUND (-6) |
| Fetch de letra de unidad en POSIX / macOS / Linux | path.posix.join deja C:/Windows/win.ini bajo asar | n/a | Cerrado aquí. Gadget posix 404, sin testigo |
| RCE / LPE del SO | nodeIntegration: false, app.enableSandbox() | n/a | Cerrado. No es este remanente |
Remanentes del mismo pin: fragment guest wipe, Univention ICS javascript: href.
Fijé element-hq/element-web v1.12.29 después del lanzamiento en GitHub del 22 de septiembre de 2026. El XSS de Timeline, el XSS de 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.
Giros equivocados ya registrados: tratar ../ como el remanente (WHATWG lo colapsa, el manejador da 404); llamar al C: de POSIX el mismo bug (la unión posix permanece bajo asar); inflar la lectura de archivos a RCE del SO (el sandbox y nodeIntegration: false siguen activos). Una reverse shell. Teatro.
Gadget del analizador de URL. path.win32 de Node frente a path.posix. Sin proceso de Element Desktop de Windows. El /lab/oracle/win.ini plantado sustituye a 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
Objetivo solo http://127.0.0.1:19610. Proyecto de Compose element-vector-drive-letter. El stack se desmonta tras 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. Ver LICENSE. Solo laboratorio en loopback. Sin garantía.