
Element Web v1.12.29 - 높음 - 원격 - XSS - Univention ICS navigation.json 링크가 javascript: 메뉴 href가 됨
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · element-ics-javascript
분석 문서: https://abraxaslabs.tech/research/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 | 중간: 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, sandbox, 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 게스트 초기화, vector: Windows 드라이브 문자.
2026년 9월 22일 GitHub 릴리스 이후 Element Web v1.12.29를 핀했다. URL 미리보기는 이미 http:/https:를 어렵게 익혔다. Univention ICS link는 여전히 z.string()이다. 정적 메뉴 설정은 z.url()을 사용한다. fetch 경로는 그 검사를 거치지 않는다.
이미 기록된 잘못된 방향들: 기본 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: 및 기타 스킴을 거부합니다. 무음 iframe을 샌드박스 처리합니다(sandbox="" 또는 최소한 allow-top-navigation 없이). z.url()을 스킴 허용 목록으로 취급하지 마십시오.
navigation.tsMenu.tsxSilentLogin.tsxpreviewFromBundleGNU Affero GPL v3.0. LICENSE를 참조하십시오. 루프백 실험실 전용. 보증 없음.