
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
Element Desktop v1.12.29 - Element Creations Ltd
Klasse: Dateilesen Reichweite: Lokal
apps/desktop/src/electron-main.ts registriert vector: als privilegiertes Dateiprotokoll. Der Jail ist nur relTarget.startsWith("..") nach path.normalize(path.join(...pathname.split("/").slice(2))). Unter Windows ist ein Join von C:, Windows, win.ini bereits C:\Windows\win.ini. Absolute Pfade beginnen nicht mit .., also lässt die Prüfung sie durch. Electrons eigener Hinweis zu benutzerdefinierten Protokollen lehnt auch 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. 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 bewiesen oder abgeleitet |
|---|---|---|---|
| Eine Datei lesen, die der Element-Prozess öffnen kann | fetch("vector://vector/webapp/C:/Windows/win.ini"). Jail ist nur relTarget.startsWith(".."). Drive-Letter-Join ist absolut, also besteht die Prüfung. path.win32.resolve(asar, relTarget) ist C:\Windows\win.ini | Recon | Im Lab am URL-Parser-Gadget bewiesen. Body ist ELEMENT-VECTOR-DRIVE-LETTER-WITNESS. Native Desktop nicht ausgeführt |
Dasselbe Lesen von electron-config, Profilen, 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. Feindseliges 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 es; Handler gibt FILE_NOT_FOUND (-6) zurück |
| POSIX / macOS / Linux Drive-Letter-Fetch | path.posix.join lä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 |
Überbleibsel desselben Pins: 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 Desktop-Custom-Protokoll 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") ist C:\Windows\win.ini. Node path.win32.join(asar, abs) konkateniert; path.win32.resolve verwirft das asar-Root.
Bereits festgehaltene Irrwege: ../ als das Überbleibsel zu behandeln (WHATWG kollabiert es, Handler 404t); POSIX C: als denselben Bug zu bezeichnen (posix join bleibt unter asar); Dateilesen zu OS-RCE aufzublähen (Sandbox und nodeIntegration: false bleiben an). Eine Reverse Shell. Theater.
Gadget des URL-Parsers. Node path.win32 vs path.posix. Kein Windows-Element-Desktop-Prozess. Platziertes /lab/oracle/win.ini steht für C:\Windows\win.ini. /lab/asar/index.html ist der asar-Jail.
python3 element-vector-drive-letter-Abraxas-Labs.py
oder
cd lab
./run.sh
Ziel nur 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 dem Normalisieren path.isAbsolute(relTarget) ablehnen und verlangen, dass path.resolve(baseDir, relTarget) unter path.resolve(baseDir) bleibt (path.relative, .. verweigern).
electron-main.ts (registerFileProtocol)webcontents-handler.ts (will-navigate)GNU Affero GPL v3.0. Siehe LICENSE. Nur Loopback-Lab. Keine Gewährleistung.