
Element Desktop v1.12.29 - Alto - Locale - File - vettore: il protocollo legge i file Windows al di fuori della jail asar
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · element-vector-drive-letter
Write-up: https://abraxaslabs.tech/research/element-vector-drive-letter
Element Desktop v1.12.29 - Element Creations Ltd
Classe: Lettura di file Portata: Locale
apps/desktop/src/electron-main.ts registra vector: come protocollo file privilegiato. La sandbox è solo relTarget.startsWith("..") dopo path.normalize(path.join(...pathname.split("/").slice(2))). Su Windows un join di C:, Windows, win.ini è già C:\Windows\win.ini. I percorsi assoluti non iniziano con .., quindi il controllo li lascia passare. Anche la nota di Electron sui protocolli personalizzati rifiuta path.isAbsolute. Il path.join POSIX non considera C: come assoluto, quindi Linux e macOS non sono interessati da questa svista. will-navigate consente il passaggio di vector:.
XSS nel renderer, DevTools o un altro processo locale possono eseguire fetch("vector://vector/webapp/C:/Windows/win.ini") e leggere i file che il processo Element può aprire.
| ID | nessuna CVE al momento |
| 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 |
| Prodotto | element-web Desktop (apps/desktop) |
| Affetto | v1.12.29 (2d90d6b7b601ecb9ccdf81239a43b4396b4b0c9e). Solo Windows. |
| Auth | renderer locale (DevTools / XSS) |
| Licenza | GNU Affero GPL v3.0 |
| Lab | solo 127.0.0.1 |
XSS nel renderer, DevTools o un altro processo locale in grado di raggiungere vector:. Element Desktop nativo per Windows non è stato eseguito. Il gadget copia il parser URL del pin e usa path.win32 di Node.
| Privilegio | Metodo / sink | Ricognizione / integrità / disponibilità | Dimostrato in lab o dedotto |
|---|---|---|---|
| Leggere un file che il processo Element può aprire | fetch("vector://vector/webapp/C:/Windows/win.ini"). La sandbox è solo relTarget.startsWith(".."). Il join con la lettera di unità è assoluto, quindi il controllo passa. path.win32.resolve(asar, relTarget) è C:\Windows\win.ini | Ricognizione | Dimostrato in lab sul gadget del parser URL. Il body è ELEMENT-VECTOR-DRIVE-LETTER-WITNESS. Desktop nativo non eseguito |
Stessa lettura di electron-config, profili, file di altri utenti sullo stesso ACL | Stesso fetch vector://vector/webapp/C:/... | Ricognizione | Dedotto. Il lab ha piazzato win.ini, non segreti reali |
| ATO di Matrix se il frame principale carica HTML dell'attaccante già presente su disco | will-navigate consente il passaggio di vector:. HTML ostile su vector://vector ottiene preload / window.electron (token, Seshat, clearStorage) | Integrità | Dedotto da webcontents-handler.ts e dal preload. Il lab non ha navigato una BrowserWindow |
Traversal ../ dell'albero asar | vector://vector/webapp/../ | n/d | Chiuso qui. L'URL WHATWG lo collassa; l'handler restituisce FILE_NOT_FOUND (-6) |
| Fetch con lettera di unità su POSIX / macOS / Linux | path.posix.join lascia C:/Windows/win.ini sotto asar | n/d | Chiuso qui. Gadget posix 404, nessun witness |
| RCE / LPE a livello OS | nodeIntegration: false, app.enableSandbox() | n/d | Chiuso. Non è questa svista |
Stessi residui del pin: fragment guest wipe, Univention ICS javascript: href.
Ho fissato element-hq/element-web v1.12.29 dopo la release GitHub del 22 set 2026. Timeline XSS, HTML-export XSS (GHSA-wqmv), homepage HTML (GHSA-wrcp), widget media token (GHSA-3jm3) e Element Call keys (GHSA-69q3) sono chiusi su questo tag. Il protocollo personalizzato di Desktop controlla ancora solo startsWith("..").
new URL("vector://vector/webapp/C:/Windows/win.ini") mantiene C: come segmento di percorso. path.win32.join("C:", "Windows", "win.ini") è C:\Windows\win.ini. Node path.win32.join(asar, abs) concatena; path.win32.resolve scarta la radice asar.
Vicoli ciechi già registrati: trattare ../ come il residuo (WHATWG lo collassa, l'handler restituisce 404); chiamare POSIX C: lo stesso bug (posix join resta sotto asar); gonfiare la lettura di file a RCE sul sistema operativo (sandbox e nodeIntegration: false restano attivi). Una reverse shell. Teatro.
Gadget del parser di URL. Node path.win32 vs path.posix. Nessun processo Windows di Element Desktop. Il /lab/oracle/win.ini piantato sostituisce C:\Windows\win.ini. /lab/asar/index.html è la gabbia asar.
python3 element-vector-drive-letter-Abraxas-Labs.py
o
cd lab
./run.sh
Prendi di mira solo http://127.0.0.1:19610. Componi il progetto element-vector-drive-letter. Lo stack viene smontato dopo l'esecuzione.
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
Dopo la normalizzazione, rifiutare path.isAbsolute(relTarget) e richiedere che path.resolve(baseDir, relTarget) rimanga sotto path.resolve(baseDir) (path.relative, rifiutare ..).
electron-main.ts (registerFileProtocol)webcontents-handler.ts (will-navigate)GNU Affero GPL v3.0. Vedi LICENSE. Solo laboratorio su loopback. Nessuna garanzia.