abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · element-vector-drive-letter
技术分析文章:https://abraxaslabs.tech/research/element-vector-drive-letter
Element Desktop v1.12.29 - Element Creations Ltd
类别: 文件读取 影响范围: 本地
apps/desktop/src/electron-main.ts 将 vector: 注册为特权文件协议。其沙箱校验仅依赖 path.normalize(path.join(...pathname.split("/").slice(2))) 之后的 relTarget.startsWith("..")。在 Windows 上,将 C:、Windows、win.ini 拼接后已经是 C:\Windows\win.ini。绝对路径不以 .. 开头,因此该检查会放行它们。Electron 自身关于自定义协议的说明也拒绝使用 path.isAbsolute。POSIX 的 path.join 不将 C: 视为绝对路径,因此 Linux 和 macOS 不存在此遗留问题。will-navigate 允许 vector: 通过。
渲染进程 XSS、DevTools 或另一个本地进程可以执行 fetch("vector://vector/webapp/C:/Windows/win.ini"),并读取 Element 进程能够打开的文件。
| ID | 暂无 CVE |
| CWE | CWE-22 / CWE-73 |
| CVSS | 高危:8.3 CVSS:3.1/AV:L/AC:L/PR:N/UI:R/S:C/C:H/I:H/A:N |
| 产品 | element-web Desktop(apps/desktop) |
| 受影响版本 | v1.12.29(2d90d6b7b601ecb9ccdf81239a43b4396b4b0c9e)。仅限 Windows。 |
| 认证 | 本地渲染进程(DevTools / XSS) |
| 许可证 | GNU Affero GPL v3.0 |
| 实验环境 | 仅 127.0.0.1 |
渲染进程 XSS、DevTools 或另一个能够访问 vector: 的本地进程。未运行原生 Windows Element Desktop。该利用组件复制了该漏洞的 URL 解析器,并使用 Node 的 path.win32。
| 权限 | 方法 / 汇聚点 | 侦察 / 完整性 / 可用性 | 实验验证或推断 |
|---|---|---|---|
| 读取 Element 进程能够打开的文件 | fetch("vector://vector/webapp/C:/Windows/win.ini")。沙箱校验仅依赖 relTarget.startsWith("..")。盘符拼接结果为绝对路径,因此检查通过。path.win32.resolve(asar, relTarget) 为 C:\Windows\win.ini | 侦察 | 已在 URL 解析器利用组件上通过实验验证。响应体为 ELEMENT-VECTOR-DRIVE-LETTER-WITNESS。未运行原生 Desktop |
在相同 ACL 下读取 electron-config、配置文件、其他用户的文件 | 相同的 vector://vector/webapp/C:/... fetch | 侦察 | 推断。实验环境放置的是 win.ini,而非真实机密 |
| 若主框架加载磁盘上已有的攻击者 HTML,则导致 Matrix 账户接管 | will-navigate 允许 vector: 通过。位于 vector://vector 的恶意 HTML 会获得 preload / window.electron(令牌、Seshat、clearStorage) | 完整性 | 根据 webcontents-handler.ts 和 preload 推断。实验未导航 BrowserWindow |
对 asar 目录树进行 ../ 遍历 | vector://vector/webapp/../ | 不适用 | 此处已封堵。WHATWG URL 会将其折叠;处理程序返回 FILE_NOT_FOUND (-6) |
| POSIX / macOS / Linux 盘符 fetch | path.posix.join 会将 C:/Windows/win.ini 保留在 asar 之下 | 不适用 | 此处已封堵。利用组件的 posix 返回 404,无见证 |
| 操作系统 RCE / LPE | nodeIntegration: false、app.enableSandbox() | 不适用 | 已封堵。不属于此遗留问题 |
同样的 pin 遗留问题:fragment guest wipe、Univention ICS javascript: href。
在 2026 年 9 月 22 日的 GitHub 发布之后,我 pin 了 element-hq/element-web v1.12.29。Timeline XSS、HTML 导出 XSS(GHSA-wqmv)、主页 HTML(GHSA-wrcp)、widget 媒体 token(GHSA-3jm3)以及 Element Call 密钥(GHSA-69q3)在该 tag 上均已关闭。Desktop 自定义协议仍然只检查 startsWith("..")。
new URL("vector://vector/webapp/C:/Windows/win.ini") 会将 C: 保留为路径段。path.win32.join("C:", "Windows", "win.ini") 的结果是 C:\Windows\win.ini。Node 的 path.win32.join(asar, abs) 会进行拼接;path.win32.resolve 则会丢弃 asar 根目录。
已记录的弯路:把 ../ 当作遗留问题(WHATWG 会将其折叠,handler 返回 404);把 POSIX 下的 C: 当作同一个 bug(posix join 仍停留在 asar 内);把文件读取夸大为操作系统 RCE(沙箱和 nodeIntegration: false 仍然开启)。一个反弹 shell。纯属表演。
URL 解析器的 gadget。Node 的 path.win32 对比 path.posix。没有 Windows Element Desktop 进程。植入的 /lab/oracle/win.ini 代替 C:\Windows\win.ini。/lab/asar/index.html 是 asar 牢笼。
python3 element-vector-drive-letter-Abraxas-Labs.py
或
cd lab
./run.sh
仅针对 http://127.0.0.1:19610。组合项目 element-vector-drive-letter。运行结束后栈会被拆除。
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
在 normalize 之后,拒绝 path.isAbsolute(relTarget),并要求 path.resolve(baseDir, relTarget) 保持在 path.resolve(baseDir) 之下(使用 path.relative,拒绝 ..)。
electron-main.ts(registerFileProtocol)webcontents-handler.ts(will-navigate)GNU Affero GPL v3.0。参见 LICENSE。仅限回环实验环境。不提供任何担保。