
Element Desktop v1.12.29 - High - Local - File - vector: protocol이 asar jail 외부의 Windows 파일을 읽음
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:를 권한 있는 파일 프로토콜로 등록합니다. 감옥(jail)은 path.normalize(path.join(...pathname.split("/").slice(2))) 이후의 relTarget.startsWith("..")뿐입니다. Windows에서 C:, Windows, win.ini를 join하면 이미 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 | High: 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 전용 |
vector:에 접근할 수 있는 렌더러 XSS, DevTools 또는 다른 로컬 프로세스. 네이티브 Windows Element Desktop은 실행하지 않았습니다. 이 가젯은 해당 취약점의 URL 파서를 복사하고 Node path.win32를 사용합니다.
| 권한 | 방법 / 싱크 | 정찰 / 무결성 / 가용성 | 실습 환경 입증 또는 추론 |
|---|---|---|---|
| Element 프로세스가 열 수 있는 파일 읽기 | fetch("vector://vector/webapp/C:/Windows/win.ini"). 감옥은 relTarget.startsWith("..")뿐. 드라이브 문자 join은 절대 경로이므로 검사를 통과. 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 ATO | 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, 증거 없음 |
| OS RCE / LPE | nodeIntegration: false, app.enableSandbox() | 해당 없음 | 차단됨. 이 잔재에 해당하지 않음 |
같은 핀 잔여물: fragment guest wipe, Univention ICS javascript: href.
2026년 9월 22일 GitHub 릴리스 이후 element-hq/element-web v1.12.29를 핀했다. 타임라인 XSS, HTML 내보내기 XSS(GHSA-wqmv), 홈페이지 HTML(GHSA-wrcp), 위젯 미디어 토큰(GHSA-3jm3), Element Call 키(GHSA-69q3)는 이 태그에서 닫혀 있다. 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가 이를 축약하고 핸들러는 404를 낸다); POSIX C:를 같은 버그라고 부르기(posix join은 asar 아래에 머문다); 파일 읽기를 OS RCE로 부풀리기(샌드박스와 nodeIntegration: false는 그대로 켜져 있다). 리버스 셸. 연극일 뿐이다.
URL 파서의 가젯. 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만 대상으로 합니다. Compose 프로젝트 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를 참조하십시오. 루프백 랩 전용. 보증 없음.