GHOST系统之家 - Windows系统光盘下载网站!
当前位置:GHOST系统之家>电脑问题 > 综合三个Bug实现Discord桌面应用RCE漏洞

综合三个Bug实现Discord桌面应用RCE漏洞

来源:Ghost系统之家浏览:时间:2022-11-25 11:30:34

本文讲述了作者在参加Discord众测的过程中,通过多个bug的综合利用,成功发现了Discord桌面应用的远程代码执行漏洞(RCE),收获了$5,300的奖励。

Discord 是一款适用于游戏玩家一体化语音和文字聊天的即时通信(IM)软件。 目前 Discord已经覆盖windows、MacOS、Android、iOS、windowsPhone等多种主流平台。

我选择测试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架构时,通常我会先检查BrowserWindowAPI的选项,当创建浏览器窗口时BrowserWindowAPI会被调用。测试时,我就在想,当Electron渲染器(renderer)加载时,怎样的任意JS代码执行才会引起RCE?

虽然Discord的Electron架构并不是开源的,但Electron的JS代码是保存在应用本地,所以我是可以提取查看到的。通过本地JS代码的查看,我发现在APP主界面后台下,使用了以下方法函数:

从上述代码片段中,可以看出,我们着重需要检查的是其中的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:

  • https://drive.google.com/file/d/1LSsD9gzOejmQ2QipReyMXwr_M0Mg1GMH/view
  • https://speakerdeck.com/masatokinugawa/electron-abusing-the-lack-of-context-isolation-curecon-en

contextIsolation功能的引入目的在于隔离Web页面和Web页面之外的JS代码,让它们在执行时不会产生相互影响。该功能非常有必要,因为如果存在不被信任的内容或操作,就会产生安全问题。而在Discord这里,该功能却被配置为false,被禁用了。因此,遵循上述覆盖JS脚本的方法,我对Discord的此处缺陷发起了测试。

由于Electron内置的JS代码在渲染时可以在任意的ElectronAPP中执行,所以一般我测试Electron的RCE时,习惯首先在渲染时用Electron内置的JS代码来测试。在我的文章中,我写到了可以用Electron在执行navigationtiming时的代码来实现RCE,该缺陷不仅可以从代码中发现,还可从其它地方发现(以后我会公布详细的PoC实例)。但是,由于目标应用不同的Electron版本使用或BrowserWindow选项设置,Discord这里Electron运行启动时,我实际测试的PoC总是不稳定,所以我把测试重点放在了预加载脚本上。

测试预加载脚本时,我发现Discord应用曝露了DiscordNative.nativeModules.requireModule('MODULE-NAME')方法函数,该函数功能在于可以通过其把一些模块功能调用到Web页面中去实现。然而,经测试发现,我并不能有效地调用类似child_process的模块实现RCE,但却可以用之前说过的覆盖方法,覆盖掉DiscordElectron中内置的JS方法,干扰曝露模块的执行,以此实现RCE。

以下为相关的PoC。当覆盖掉DiscordElectron中内置的RegExp.prototype.test和Array.prototype.join方法,调用"discord_utils"模块中定义的getGPUDriverVersions方法函数时,可以触发执行calc.exe程序:

getGPUDriverVersions方法函数用来执行"execa"库调用:

通常,"execa"库又是用来执行nvidiaSmiPath变量中指定的"nvidia-smi.exe"显卡程序的,但由于覆盖掉了RegExp.prototype.test和Array.prototype.join方法,"execa"库中nvidiaSmiPath变量名即被覆盖为了"calc"。

具体来说,nvidiaSmiPath中的变量覆盖需要改变以下两个JS文件:

  • https://github.com/moxystudio/node-cross-spawn/blob/16feb534e818668594fd530b113a028c0c06bddc/lib/parse.js#L36
  • https://github.com/moxystudio/node-cross-spawn/blob/16feb534e818668594fd530b113a028c0c06bddc/lib/parse.js#L55

到了这步,"nvidia-smi.exe"可以成功被替换为"calc",那么接下来只需找到执行JS代码的方式即可成功实现RCE了。

iframe嵌入功能中的XSS

在我尝试挖掘XSS的过程中,我发现DiscordAPP支持类似autolink或Markdown的功能,这有点意思。经测试,如果Discord用户交流信息中有视频帖子,如You-tubeURL,那么这里类似Markdown的iframe嵌入功能即可显示出视频播放器(video player)来。

由于Discord涉及到用户的各种社交交流信息,所以其支持OpenGraphProtocol(开放内容协议),如果用户交流信息中包含OGP信息,那么Discord应用即会显示出其中出现的网页标题、描述、缩略图和一些相关的视频内容。当用户交流信息中的视频URL链接被嵌入到iframe中后,Discord应用会提取出该视频URL链接。后续,我无法查看到Discord应用相关的iframe嵌入功能说明文档,就只好在其CSPframe-src 指令中寻找线索,发现其采用了以下CSP策略:

可以看到,其中列出了允许iframe嵌入的策略(如对You-Tube,Twitch,Spotify视频的嵌入)。接下来,我就对这些域名一个一个进行测试,希望在其中能在iframe视频嵌入时触发XSS。经过测试,我发现域名sketchfab.com可以在iframe嵌入时产生XSS,这是一个简单的DOM-basedXSS。以下是我根据OGP协议制作的一个PoC,当我把该URL链接以聊天方式发送给另一位Discord用户时,点击其中的iframe,就会触发任意的JS代码执行:

https://l0.cm/discord_rce_og.html

现在,虽然发现了XSS,但是触发的JS代码却只能在iframe中执行。由于Electron不会把“Web页面之外的JS代码”加载进入iframe中,所以即使我覆盖了其iframe内置的JS方法,还是不能调用Node.js相关功能。因此,要实现真正的RCE,还需要跳出iframe限制,在用户浏览内容层面去考虑。这就需要在iframe框架中创建一个新窗口,或是从iframe中导航(navigating)到另一URL中的顶层窗口。

经过对相关代码的分析,我发现Navigation restriction(导航限制)的主要代码中用到了"new-window" 和"will-navigate"两个事件:

只要突破这里,就可以在iframe框架中创建一个新窗口,或是从iframe中导航(navigating)到另一URL中的顶层窗口。然而,这里存在着一个让我完全意想不到的缺陷。

Navigation restriction bypass (导航限制功能绕过,CVE-2020-15174)

在我对导航限制相关代码进行检查过程中,我本认为iframe对导航(navigation)应该是有限制的,但我惊奇地发现,iframe不知怎的对导航机制竟然没有限制。我本来想着,"will-navigate"事件和preventDefault()会在导航动作绕过发生之前进行相关的捕捉或拦截,但是这却没有。

为了进行导航绕过测试,我创建了一个简单的Electron应用,然后发现,顶部导航(top navigation)中的"will-navigate"事件并不会从iframe中跳出,具体来说,如果顶部导航的所属域和iframe的所属域相同,"will-navigate"事件会跳出,否则就不会跳出。这并不是一种合乎常理的操作行为,而是个Bug。有了这个Bug,我就能绕过导航限制了。最后,我要做的就是,导航到可以触发XSS的iframe页面,然后在其中包含进RCEPayload代码。

最终,综合利用以上三个Bug,我成功在Discord应用中实现的远程代码执行(RCE)。

POC视频:https://tinyurl.com/y5nx6zjy

漏洞处理

我通过Discord众测项目上报了这三个漏洞,之后,Discord安全团队禁用了Sketchfab的嵌入功能,然后在iframe中加入了沙箱功能防止导航限制绕过,同时启用了contextIsolation功能。我因此收获了$5,000的漏洞奖励。

https://github.com/electron/electron/security/advisories/GHSA-2q4g-w47c-4674

另外,其中的XSS漏洞上报给Sketchfab后,收获了Sketchfab奖励的$300;"will-navigate"事件Bug上报给Electron后,被分配了CVE-2020-15174的漏洞编号。

参考来源:mksben

鸿蒙官方战略合作共建——HarmonyOS技术社区

推荐系统

  • 微软Win11原版22H2下载_Win11GHOST 免 激活密钥 22H2正式版64位免费下载

    微软Win11原版22H2下载_Win11GHOST 免 激活密钥 22H2正式版64位免费下载

    语言:中文版系统大小:5.13GB系统类型:Win11

    微软Win11原版22H2下载_Win11GHOST 免 激活密钥 22H2正式版64位免费下载系统在家用办公上跑分表现都是非常优秀,完美的兼容各种硬件和软件,运行环境安全可靠稳定。Win11 64位 Office办公版(免费)优化  1、保留 Edge浏览器。  2、隐藏“操作中心”托盘图标。  3、保留常用组件(微软商店,计算器,图片查看器等)。  5、关闭天气资讯。 

  • Win11 21H2 官方正式版下载_Win11 21H2最新系统免激活下载

    Win11 21H2 官方正式版下载_Win11 21H2最新系统免激活下载

    语言:中文版系统大小:4.75GB系统类型:Win11

    Ghost Win11 21H2是微软在系统方面技术积累雄厚深耕多年,Ghost Win11 21H2系统在家用办公上跑分表现都是非常优秀,完美的兼容各种硬件和软件,运行环境安全可靠稳定。Ghost Win11 21H2是微软最新发布的KB5019961补丁升级而来的最新版的21H2系统,以Windows 11 21H2 22000 1219 专业版为基础进行优化,保持原汁原味,系统流畅稳定,保留常用组件

  • windows11中文版镜像 微软win11正式版简体中文GHOST ISO镜像64位系统下载

    windows11中文版镜像 微软win11正式版简体中文GHOST ISO镜像64位系统下载

    语言:中文版系统大小:5.31GB系统类型:Win11

    windows11中文版镜像 微软win11正式版简体中文GHOST ISO镜像64位系统下载,微软win11发布快大半年了,其中做了很多次补丁和修复一些BUG,比之前的版本有一些功能上的调整,目前已经升级到最新版本的镜像系统,并且优化了自动激活,永久使用。windows11中文版镜像国内镜像下载地址微软windows11正式版镜像 介绍:1、对函数算法进行了一定程度的简化和优化

  • 微软windows11正式版GHOST ISO镜像 win11下载 国内最新版渠道下载

    微软windows11正式版GHOST ISO镜像 win11下载 国内最新版渠道下载

    语言:中文版系统大小:5.31GB系统类型:Win11

    微软windows11正式版GHOST ISO镜像 win11下载 国内最新版渠道下载,微软2022年正式推出了win11系统,很多人迫不及待的要体验,本站提供了最新版的微软Windows11正式版系统下载,微软windows11正式版镜像 是一款功能超级强大的装机系统,是微软方面全新推出的装机系统,这款系统可以通过pe直接的完成安装,对此系统感兴趣,想要使用的用户们就快来下载

  • 微软windows11系统下载 微软原版 Ghost win11 X64 正式版ISO镜像文件

    微软windows11系统下载 微软原版 Ghost win11 X64 正式版ISO镜像文件

    语言:中文版系统大小:0MB系统类型:Win11

    微软Ghost win11 正式版镜像文件是一款由微软方面推出的优秀全新装机系统,这款系统的新功能非常多,用户们能够在这里体验到最富有人性化的设计等,且全新的柔软界面,看起来非常的舒服~微软Ghost win11 正式版镜像文件介绍:1、与各种硬件设备兼容。 更好地完成用户安装并有效地使用。2、稳定使用蓝屏,系统不再兼容,更能享受无缝的系统服务。3、为

  • 雨林木风Windows11专业版 Ghost Win11官方正式版 (22H2) 系统下载

    雨林木风Windows11专业版 Ghost Win11官方正式版 (22H2) 系统下载

    语言:中文版系统大小:4.75GB系统类型:

    雨林木风Windows11专业版 Ghost Win11官方正式版 (22H2) 系统下载在系统方面技术积累雄厚深耕多年,打造了国内重装系统行业的雨林木风品牌,其系统口碑得到许多人认可,积累了广大的用户群体,雨林木风是一款稳定流畅的系统,一直以来都以用户为中心,是由雨林木风团队推出的Windows11国内镜像版,基于国内用户的习惯,做了系统性能的优化,采用了新的系统

  • 雨林木风win7旗舰版系统下载 win7 32位旗舰版 GHOST 免激活镜像ISO

    雨林木风win7旗舰版系统下载 win7 32位旗舰版 GHOST 免激活镜像ISO

    语言:中文版系统大小:5.91GB系统类型:Win7

    雨林木风win7旗舰版系统下载 win7 32位旗舰版 GHOST 免激活镜像ISO在系统方面技术积累雄厚深耕多年,加固了系统安全策略,雨林木风win7旗舰版系统在家用办公上跑分表现都是非常优秀,完美的兼容各种硬件和软件,运行环境安全可靠稳定。win7 32位旗舰装机版 v2019 05能够帮助用户们进行系统的一键安装、快速装机等,系统中的内容全面,能够为广大用户

  • 番茄花园Ghost Win7 x64 SP1稳定装机版2022年7月(64位) 高速下载

    番茄花园Ghost Win7 x64 SP1稳定装机版2022年7月(64位) 高速下载

    语言:中文版系统大小:3.91GB系统类型:Win7

    欢迎使用 番茄花园 Ghost Win7 x64 SP1 2022.07 极速装机版 专业装机版具有更安全、更稳定、更人性化等特点。集成最常用的装机软件,集成最全面的硬件驱动,精心挑选的系统维护工具,加上独有人性化的设计。是电脑城、个人、公司快速装机之首选!拥有此系统