
Element Desktop v1.12.29 - Élevé - Local - Fichier - vecteur : le protocole lit les fichiers Windows en dehors de la prison asar
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · element-vector-drive-letter
Element Desktop v1.12.29 - Element Creations Ltd
Classe : Lecture de fichier Portée : Locale
apps/desktop/src/electron-main.ts enregistre vector: comme protocole de fichier privilégié. La prison se limite à relTarget.startsWith("..") après path.normalize(path.join(...pathname.split("/").slice(2))). Sous Windows, une jointure de C:, Windows, win.ini donne déjà C:\Windows\win.ini. Les chemins absolus ne commencent pas par .., donc la vérification les laisse passer. La propre note d'Electron sur les protocoles personnalisés rejette également path.isAbsolute. Le path.join POSIX ne traite pas C: comme absolu, donc Linux et macOS ne sont pas concernés par ce reliquat. will-navigate laisse passer vector:.
Un XSS dans le renderer, les DevTools, ou un autre processus local peut faire fetch("vector://vector/webapp/C:/Windows/win.ini") et lire les fichiers que le processus Element peut ouvrir.
| ID | pas encore de CVE |
| CWE | CWE-22 / CWE-73 |
| CVSS | Élevé : 8.3 CVSS:3.1/AV:L/AC:L/PR:N/UI:R/S:C/C:H/I:H/A:N |
| Produit | element-web Desktop (apps/desktop) |
| Affecté | v1.12.29 (2d90d6b7b601ecb9ccdf81239a43b4396b4b0c9e). Windows uniquement. |
| Auth | renderer local (DevTools / XSS) |
| Licence | GNU Affero GPL v3.0 |
| Lab | 127.0.0.1 uniquement |
Un XSS dans le renderer, les DevTools, ou un autre processus local capable d'atteindre vector:. Element Desktop natif sous Windows n'a pas été exécuté. Le gadget copie le parseur d'URL du pin et utilise le path.win32 de Node.
| Privilège | Méthode / sink | Reconnaissance / intégrité / disponibilité | Prouvé en lab ou déduit |
|---|---|---|---|
| Lire un fichier que le processus Element peut ouvrir | fetch("vector://vector/webapp/C:/Windows/win.ini"). La prison se limite à relTarget.startsWith(".."). La jointure avec lettre de lecteur est absolue, donc la vérification passe. path.win32.resolve(asar, relTarget) donne C:\Windows\win.ini | Reconnaissance | Prouvé en lab sur le gadget du parseur d'URL. Le corps est ELEMENT-VECTOR-DRIVE-LETTER-WITNESS. Desktop natif non exécuté |
Même lecture de electron-config, profils, fichiers d'autres utilisateurs sur la même ACL | Même fetch vector://vector/webapp/C:/... | Reconnaissance | Déduit. Le lab a planté win.ini, pas de secrets réels |
| ATO Matrix si le frame principal charge du HTML attaquant déjà présent sur le disque | will-navigate laisse passer vector:. Du HTML hostile à vector://vector obtient le preload / window.electron (tokens, Seshat, clearStorage) | Intégrité | Déduit de webcontents-handler.ts et du preload. Le lab n'a pas navigué de BrowserWindow |
Traversée ../ de l'arbre asar | vector://vector/webapp/../ | n/a | Fermé ici. L'URL WHATWG le réduit ; le handler renvoie FILE_NOT_FOUND (-6) |
| Fetch avec lettre de lecteur POSIX / macOS / Linux | path.posix.join laisse C:/Windows/win.ini sous l'asar | n/a | Fermé ici. Gadget posix 404, pas de témoin |
| RCE OS / LPE | nodeIntegration: false, app.enableSandbox() | n/a | Fermé. Pas ce reliquat |
Reliquats du même pin : fragment guest wipe, Univention ICS javascript: href.
J'ai épinglé element-hq/element-web v1.12.29 après la release GitHub du 22 septembre 2026. Le XSS de timeline, le XSS d'export HTML (GHSA-wqmv), le HTML de la page d'accueil (GHSA-wrcp), le token média des widgets (GHSA-3jm3) et les clés Element Call (GHSA-69q3) sont fermés sur ce tag. Le protocole personnalisé Desktop ne vérifie toujours que startsWith("..").
new URL("vector://vector/webapp/C:/Windows/win.ini") conserve C: comme segment de chemin. path.win32.join("C:", "Windows", "win.ini") donne C:\Windows\win.ini. Le path.win32.join(asar, abs) de Node concatène ; path.win32.resolve supprime la racine asar.
Fausses pistes déjà consignées : traiter ../ comme le reliquat (WHATWG le réduit, le handler renvoie 404) ; appeler le C: POSIX le même bug (la jointure posix reste sous l'asar) ; gonfler la lecture de fichier en RCE OS (le sandbox et nodeIntegration: false restent actifs). Un reverse shell. Du théâtre.
Gadget du parseur d'URL. path.win32 de Node vs path.posix. Pas de processus Element Desktop Windows. Un /lab/oracle/win.ini planté remplace C:\Windows\win.ini. /lab/asar/index.html est la prison asar.
python3 element-vector-drive-letter-Abraxas-Labs.py
ou
cd lab
./run.sh
Cible uniquement http://127.0.0.1:19610. Projet Compose element-vector-drive-letter. La stack est démontée après l'exécution.
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
Après normalize, rejeter path.isAbsolute(relTarget) et exiger que path.resolve(baseDir, relTarget) reste sous path.resolve(baseDir) (path.relative, refuser ..).
electron-main.ts (registerFileProtocol)webcontents-handler.ts (will-navigate)GNU Affero GPL v3.0. Voir LICENSE. Lab en loopback uniquement. Aucune garantie.