综合三个Bug完成Discord桌面应用RCE漏洞

我选择测试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主界面后台下,使用了以下方法函数:


  1. const mainWindowOptions = { 
  2.   title: 'Discord', 
  3.   backgroundColor: getBackgroundColor(), 
  4.   width: DEFAULT_WIDTH, 
  5.   height: DEFAULT_HEIGHT, 
  6.   minWidth: MIN_WIDTH, 
  7.   minHeight: MIN_HEIGHT, 
  8.   transparent: false, 
  9.   frame: false, 
  10.   resizable: true, 
  11.   show: isVisible, 
  12.   webPreferences: { 
  13.     blinkFeatures: 'EnumerateDevices,AudioOutputDevices', 
  14.     nodeIntegration: false, 
  15.     preload: _path2.default.join(__dirname, 'mainScreenPreload.js'), 
  16.     nativeWindowOpen: true, 
  17.     enableRemoteModule: false, 
  18.     spellcheck: true 
  19.   } 
  20. }; 

从上述代码片段中,可以看出,我们着重需要检查的是其中的nodeIntegration和contextIsolation配置,这里的nodeIntegration都被配置为了false,且原先未修改版本的和contextIsolation也被配置为了false。

如果nodeIntegration为true,那么web页面的JS代码可以通过调用require()方法使用Node.js功能。比如,在Windows系统中执行以下计算器calc.exe程序的代码:


  1. <script> 
  2.   require('child_process').exec('calc'); 
  3. </script> 

而在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漏洞。

【声明】:芜湖站长网内容转载自互联网,其相关言论仅代表作者个人观点绝非权威,不代表本站立场。如您发现内容存在版权问题,请提交相关链接至邮箱:bqsm@foxmail.com,我们将及时予以处理。

相关文章