
Element Desktop v1.12.29 – Hoch – Lokal – Datei – Vektor: Protokoll liest Windows-Dateien außerhalb des asar-Jails
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
Klasse: Dateilesen Reichweite: Lokal
apps/desktop/src/electron-main.ts registriert vector: als privilegiertes Dateiprotokoll. Die Jail-Prüfung besteht nur aus relTarget.startsWith("..") nach path.normalize(path.join(...pathname.split("/").slice(2))). Unter Windows ist ein Join aus C:, Windows, win.ini bereits C:\Windows\win.ini. Absolute Pfade beginnen nicht mit .., daher lässt die Prüfung sie durch. Auch der Hinweis von Electron zu benutzerdefinierten Protokollen lehnt path.isAbsolute ab. POSIX-path.join behandelt C: nicht als absolut, daher sind Linux und macOS nicht von diesem Überbleibsel betroffen. will-navigate lässt vector: durch.
Renderer-XSS, DevTools oder ein anderer lokaler Prozess kann fetch("vector://vector/webapp/C:/Windows/win.ini") ausführen und Dateien lesen, die der Element-Prozess öffnen kann.
| ID | noch keine CVE |
| CWE | CWE-22 / CWE-73 |
| CVSS | Hoch: 8.3 CVSS:3.1/AV:L/AC:L/PR:N/UI:R/S:C/C:H/I:H/A:N |
| Produkt | element-web Desktop (apps/desktop) |
| Betroffen | v1.12.29 (2d90d6b7b601ecb9ccdf81239a43b4396b4b0c9e). Nur Windows. |
| Auth | lokaler Renderer (DevTools / XSS) |
| Lizenz | GNU Affero GPL v3.0 |
| Lab | nur 127.0.0.1 |
Renderer-XSS, DevTools oder ein anderer lokaler Prozess, der vector: erreichen kann. Das native Windows-Element-Desktop wurde nicht ausgeführt. Das Gadget kopiert den URL-Parser des Pins und verwendet Node path.win32.
| Privileg | Methode / Sink | Recon / Integrität / Verfügbarkeit | Im Lab nachgewiesen oder abgeleitet |
|---|---|---|---|
| Eine Datei lesen, die der Element-Prozess öffnen kann | fetch("vector://vector/webapp/C:/Windows/win.ini"). Die Jail-Prüfung besteht nur aus relTarget.startsWith(".."). Der Laufwerksbuchstaben-Join ist absolut, daher besteht die Prüfung. path.win32.resolve(asar, relTarget) ist C:\Windows\win.ini | Recon | Im Lab am URL-Parser-Gadget nachgewiesen. Body ist ELEMENT-VECTOR-DRIVE-LETTER-WITNESS. Natives Desktop nicht ausgeführt |
Derselbe Lesezugriff auf electron-config, Profile, Dateien anderer Benutzer mit derselben ACL | Derselbe vector://vector/webapp/C:/...-Fetch | Recon | Abgeleitet. Im Lab wurde win.ini platziert, keine echten Secrets |
| Matrix-ATO, wenn der Hauptframe bereits auf der Festplatte befindliches Angreifer-HTML lädt | will-navigate lässt vector: durch. Feindliches HTML unter vector://vector erhält Preload / window.electron (Tokens, Seshat, clearStorage) | Integrität | Abgeleitet aus webcontents-handler.ts und Preload. Im Lab wurde kein BrowserWindow navigiert |
../-Traversal des asar-Baums | vector://vector/webapp/../ | n/a | Hier geschlossen. WHATWG-URL kollabiert dies; Handler gibt FILE_NOT_FOUND (-6) zurück |
| POSIX-/macOS-/Linux-Laufwerksbuchstaben-Fetch | path.posix.join belässt C:/Windows/win.ini unter asar | n/a | Hier geschlossen. Gadget-POSIX 404, kein Witness |
| OS-RCE / LPE | nodeIntegration: false, app.enableSandbox() | n/a | Geschlossen. Nicht dieses Überbleibsel |
Gleiche Pin-Reste: Fragment-Guest-Wipe, Univention ICS javascript: href.
Ich habe element-hq/element-web v1.12.29 nach dem GitHub-Release vom 22. Sep. 2026 gepinnt. Timeline-XSS, HTML-Export-XSS (GHSA-wqmv), Homepage-HTML (GHSA-wrcp), Widget-Media-Token (GHSA-3jm3) und Element-Call-Keys (GHSA-69q3) sind auf diesem Tag geschlossen. Das benutzerdefinierte Protokoll der Desktop-App prüft weiterhin nur startsWith("..").
new URL("vector://vector/webapp/C:/Windows/win.ini") behält C: als Pfadsegment. path.win32.join("C:", "Windows", "win.ini") ergibt C:\Windows\win.ini. Node path.win32.join(asar, abs) verkettet; path.win32.resolve verwirft das asar-Root.
Bereits festgehaltene Irrwege: ../ als Rest zu behandeln (WHATWG kollabiert es, Handler liefert 404); POSIX C: als denselben Bug zu bezeichnen (posix join bleibt unter asar); Dateilesen zu OS-RCE aufzublähen (Sandbox und nodeIntegration: false bleiben aktiv). Eine Reverse Shell. Theater.
Gadget des URL-Parsers. Node path.win32 vs. path.posix. Kein Windows-Element-Desktop-Prozess. Eingepflanzte /lab/oracle/win.ini steht stellvertretend für C:\Windows\win.ini. /lab/asar/index.html ist das asar-Gefängnis.
python3 element-vector-drive-letter-Abraxas-Labs.py
oder
cd lab
./run.sh
Ziele ausschließlich auf http://127.0.0.1:19610. Compose-Projekt element-vector-drive-letter. Der Stack wird nach dem Lauf abgebaut.
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
Nach der Normalisierung path.isAbsolute(relTarget) ablehnen und verlangen, dass path.resolve(baseDir, relTarget) unterhalb von path.resolve(baseDir) bleibt (path.relative, .. ablehnen).
electron-main.ts (registerFileProtocol)webcontents-handler.ts (will-navigate)GNU Affero GPL v3.0. Siehe LICENSE. Nur Loopback-Lab. Keine Gewährleistung.