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 | 中危: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 账户接管:访问令牌、加密存储、会话。这不是操作系统 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 横幅)。操作系统 RCE / LPE(桌面端 nodeIntegration: false、沙箱、contextIsolation)。时间线 HTML XSS。URL 预览 javascript:(GHSA-9r5h previewFromBundle 要求 http:/https:)。HTML 导出 XSS(GHSA-wqmv)。Widget 媒体令牌(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 夸大为操作系统 RCE。反弹 shell。纯属表演。
该版本的 gadget 功能加上模拟 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。仅限回环实验环境。无担保。