综合三个Bug实现Discord桌面应用RCE漏洞
搜索公众号:暗网黑客可领全套网络安全渗透教程、配套攻防靶场
文章插图
本文讲述了作者在参加Discord众测的过程中 , 通过多个bug的综合利用 , 成功发现了Discord桌面应用的远程代码执行漏洞(RCE) , 收获了$5,300的奖励 。
Discord 是一款适用于游戏玩家一体化语音和文字聊天的即时通信(IM)软件 。目前 Discord 已经覆盖 Windows、MacOS、Android、iOS、Windows Phone等多种主流平台 。
我选择测试Discord的原因由于我对Electron架构的APP漏洞测试比较有经验 , 而刚好Discord应用正是基于Electron架构开发的 , 且我也是一名Discord用户 , 所以本着测试把玩的心态 , 我就对Discord进行了分析 。
发现的漏洞我发现了以下Discord应用存在的三个bug , 综合利用最终形成了RCE漏洞:
Missing contextIsolation(contextIsolation功能未启用)XSS in iframe embeds(iframe嵌入功能中的XSS)Navigation 导航限制功能绕过 (Navigation restriction bypass,CVE-2020-15174)
contextIsolation功能未启用(Missing contextIsolation)在测试Electron架构时 , 通常我会先检查BrowserWindow API的选项 , 当创建浏览器窗口时BrowserWindow API会被调用 。 测试时 , 我就在想 , 当Electron渲染器(renderer)加载时 , 怎样的任意JS代码执行才会引起RCE?虽然Discord的Electron架构并不是开源的 , 但Electron的JS代码是保存在应用本地 , 所以我是可以提取查看到的 。 通过本地JS代码的查看 , 我发现在APP主界面后台下 , 使用了以下方法函数:
const mainWindowOptions = {title: 'Discord',backgroundColor: getBackgroundColor(),width: DEFAULT_WIDTH,height: DEFAULT_HEIGHT,minWidth: MIN_WIDTH,minHeight: MIN_HEIGHT,transparent: false,frame: false,resizable: true,show: isVisible,webPreferences: {blinkFeatures: 'EnumerateDevices,AudioOutputDevices',nodeIntegration: false,preload: _path2.default.join(__dirname, 'mainScreenPreload.js'),nativeWindowOpen: true,enableRemoteModule: false,spellcheck: true}};从上述代码片段中 , 可以看出 , 我们着重需要检查的是其中的nodeIntegration和contextIsolation配置 , 这里的nodeIntegration都被配置为了false , 且原先未修改版本的和contextIsolation也被配置为了false 。
如果nodeIntegration为true , 那么web页面的JS代码可以通过调用require()方法使用Node.js功能 。 比如 , 在Windows系统中执行以下计算器calc.exe程序的代码:
而在Discord这里 , nodeIntegration为false , 所以我也不能调用require()去使用Node.js功能 。 然而 , 仍然存在一种访问Node.js功能的方法 。 接下来且听我慢慢解释 。
Discord中的另一重要功能contextIsolation也配置为了false , 该功能用来隔离不信任的内容 , 所以 , 如果你想消除RCE , 那么该功能就不应该配置为false 。
如果contextIsolation为false , 那么web页面中的JS可以影响Electron内部渲染时的JS代码和预加载脚本执行 , (这里Electron内部渲染时的JS代码指Web页面之外的JS脚本) , 例如 , 假设用Web页面JS中的方法函数 , 把Electron内置JS的方法Array.prototype.join覆盖掉 , 那么Web页面之外的JS脚本在加载join方法时 , 就会调用后来被覆盖的方法函数 。
这种行为是很危险的 , 因为这样一来 , 可以不用考虑nodeIntegration配置 , 直接用覆盖的方式 , 就可以让Electron允许Web页面之外的JS脚本使用Node.js特性 , 这种方式即使在nodeIntegration配置为false的情况下 , 都还还可演变为RCE漏洞 。
我顺便提一下 , 类似的缺陷早在2016年我在Cure53公司时就已经发现了 , 当时我上报给了Electron安全团队 , 后来在Electron架构中就引入了contextIsolation功能 。
以下为最近才公开的技术细节PDF:
?
contextIsolation功能的引入目的在于隔离Web页面和Web页面之外的JS代码 , 让它们在执行时不会产生相互影响 。 该功能非常有必要 , 因为如果存在不被信任的内容或操作 , 就会产生安全问题 。
而在Discord这里 , 该功能却被配置为false , 被禁用了 。
因此 , 遵循上述覆盖JS脚本的方法 , 我对Discord的此处缺陷发起了测试 。
由于Electron内置的JS代码在渲染时可以在任意的Electron APP中执行 , 所以一般我测试Electron的RCE时 , 习惯首先在渲染时用Electron内置的JS代码来测试 。
在我的文章中 , 我写到了可以用Electron在执行navigation timing时的代码来实现RCE , 该缺陷不仅可以从代码中发现 , 还可从其它地方发现(以后我会公布详细的PoC实例) 。
但是 , 由于目标应用不同的Electron版本使用或BrowserWindow选项设置 , Discord这里Electron运行启动时 , 我实际测试的PoC总是不稳定 , 所以我把测试重点放在了预加载脚本上 。
- 三个目标之后|品味莲乡 | 品味
- 绿色|吉利新能源关联公司成立科技新公司 定位绿色智慧物流综合服务商
- 系列|Redmi Note9系列开售:三个亮点和一个缺点,看完再买也不迟
- 小米|小米11将至,全面超越华为mate40?
- 两同事合伙创业,三个月亏损5万,不欢而散,合伙创业就这么难?
- 华强北|钢琴音乐会在深圳市福田区华强北科技综合体奏响
- vivo X50 Pro综合体验:具有划时代意义的实力新机
- 蚂蚁电竞ANT27VQ显示器评测:综合表现全面的电竞利器
- 震惊!京东T4大佬面试整整三个月,才写了两份java面试笔记
- 禁止拷贝构造,禁止bug
