
Element Web v1.12.29 - 높음 - 원격 - XSS - Univention ICS navigation.json 링크가 javascript: 메뉴 href가 됨
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · element-ics-javascript
Element Web v1.12.29 - Element / New Vector
분류: XSS 도달 범위: 원격
Univention 배너 모듈은 ICS navigation.json을 가져오고, 각 항목의 link를 스킴 검사 없이 z.string()으로 받아들이며, Menu.tsx는 그 문자열을 스타일이 적용된 <a href>에 넣습니다. 정적 메뉴 구성은 link_url에 z.url()을 사용합니다. ICS 경로는 그렇지 않습니다. 같은 핀의 URL 미리보기는 이미 javascript:를 거부합니다(previewFromBundle, GHSA-9r5h). 이것은 기본 app.element.io가 아닙니다. menu.type이 univention인 modules/banner와 배포가 신뢰하는 ICS가 필요합니다.
해당 navigation.json을 변경할 수 있는 사람은 누구나 javascript: 또는 data:를 심을 수 있습니다. 로그인한 사용자가 배너 메뉴를 열고 해당 항목을 클릭하면 Element 오리진에서 스크립트가 실행됩니다.
| ID | 아직 CVE 없음 |
| CWE | CWE-79 / CWE-20 |
| CVSS | Medium: 6.8 CVSS:3.1/AV:N/AC:L/PR:H/UI:R/S:U/C:H/I:H/A:N |
| 제품 | Element Web |
| 영향받는 버전 | v1.12.29 태그 v1.12.29 (2d90d6b7b601ecb9ccdf81239a43b4396b4b0c9e). 조건: Univention 배너 + ICS. |
| 인증 | ICS 운영자 / ICS 침해. 피해자는 메뉴 항목을 클릭하는 로그인한 사용자. |
| 라이선스 | GNU Affero GPL v3.0 |
| 랩 | 127.0.0.1 전용 |
Element 배포가 신뢰하는 ICS를 침해하거나 운영합니다. navigation.json에 javascript:(또는 data:) URL을 넣습니다. 로그인한 사용자가 배너 메뉴를 열고 해당 항목을 클릭할 때까지 기다립니다. 이것은 Matrix 계정 탈취입니다: 액세스 토큰, 암호화 저장소, 세션. OS RCE는 아닙니다. 데스크톱은 여전히 nodeIntegration이 꺼져 있고 샌드박스가 있습니다.
| 권한 | 방법 / 싱크 | 정찰 / 무결성 / 가용성 | 랩 입증 또는 추론 |
|---|---|---|---|
Element 오리진에서 배너 메뉴 <a href="javascript:…"> 렌더링 | ICS navigation.json entries[].link -> navigationToConfig link_url -> Menu.tsx LinkButton href={link.link_url} | 메뉴 DOM의 무결성 | 랩 입증. 모의 ICS 링크 javascript:ELEMENT-ICS-JAVASCRIPT-WITNESS가 해당 href가 됨. https 포털 링크는 여전히 렌더링됨 |
| 클릭 후 Element 오리진으로 스크립트 실행 | 피해자가 메뉴 항목 클릭 (UI:R) | 무결성 | href 싱크로부터 추론. 랩은 브라우저 클릭을 유도하거나 실제 Matrix 토큰을 탈취하지 않음 |
| Matrix 액세스 토큰 / 암호화 저장소 읽기 (계정 탈취) | 오리진 내 스크립트 대 localStorage / IndexedDB 세션 | 정찰 / 무결성 | Element 오리진 XSS로부터 추론. 랩 증거는 href 문자열 |
| Element 탭을 피싱 페이지로 최상위 이동 | SilentLogin.tsx 샌드박스 없는 iframe src={new URL("silent", icsUrl)} | 무결성 | 랩에서 iframe에 sandbox가 없음을 입증. 최상위 이동은 실행되지 않음 |
data:를 통한 동일한 심기 | z.string()이 모든 스킴을 허용 | 무결성 | 추론. 랩은 javascript:만 심음 |
이 핀에서 닫힌 항목: 기본 app.element.io (Univention 배너 없음). OS RCE / LPE (Desktop nodeIntegration: false, 샌드박스, contextIsolation). Timeline HTML XSS. URL 미리보기 javascript: (GHSA-9r5h previewFromBundle은 http:/https:를 요구). HTML 내보내기 XSS (GHSA-wqmv). 위젯 미디어 토큰 (GHSA-3jm3). 정적 배너 link_url: z.url()은 운영자 구성이지 ICS가 아님; z.url()은 또한 http/https 허용 목록이 아님.
같은 핀의 나머지: fragment guest wipe, vector: Windows 드라이브 문자.
2026년 9월 22일 GitHub 릴리스 이후 Element Web v1.12.29를 핀했습니다. URL 미리보기는 이미 http:/https:를 어렵게 배웠습니다. Univention ICS link는 여전히 z.string()입니다. 정적 메뉴 구성은 z.url()을 사용합니다. 가져오기 경로는 그 검사를 거치지 않습니다.
이미 기록된 잘못된 방향: 기본 app.element.io를 피해자로 취급 (Univention은 조건부); z.url()을 스킴 허용 목록으로 취급 (URL 생성자는 javascript:를 허용); 클릭 XSS를 OS RCE로 과장. 리버스 셸. 연극.
핀 함수들의 가젯과 모의 ICS navigation.json. 실제 Element Web 컨테이너가 아닙니다. how=gadget. URL 미리보기 http/https 허용 목록(previewFromBundle)을 적용하면 javascript href가 제거되고 https 포털 링크는 유지되었습니다.
python3 element-ics-javascript-Abraxas-Labs.py
또는
cd lab
./run.sh
오직 http://127.0.0.1:19620만 대상으로 합니다. Compose 프로젝트 element-ics-javascript. 실행 후 스택은 해체됩니다.
SUCCESS element-ics-javascript how=gadget href-scheme=javascript menu-a-javascript=yes allowlist-rejects=yes silent-no-sandbox=yes ELEMENT-ICS-JAVASCRIPT-WITNESS
previewFromBundle이 하는 것과 같은 방식으로 ICS link에 http:와 https:를 허용 목록에 추가하세요. href= 이전에 javascript:, data: 및 기타 스킴을 거부하세요. silent iframe을 샌드박스 처리하세요 (sandbox="" 또는 최소한 allow-top-navigation 없이). z.url()을 스킴 허용 목록으로 취급하지 마세요.
navigation.tsMenu.tsxSilentLogin.tsxpreviewFromBundleGNU Affero GPL v3.0. LICENSE 참조. 루프백 랩 전용. 보증 없음.