允许任意URL,期待任意代码执行

2021-04-16 02:46:58

- Markdown - - 我们发现并报告了在流行软件中的1单击代码执行漏洞,包括**电报**,** nextcloud **,** vlc **,** libre- / OpenOffice **,**比特币/ dogecoin钱包**,** wireshark **和** mumble ** - 通过操作系统打开的用户提供的URL的桌面应用程序经常容易受到用户交互的代码执行** - 代码执行可以是当一个URL指向一个恶意可执行文件(`.desktop`,`.jar`,`.exe`,......)托管在互联网访问的文件共享(`nfs`,`webdav`,`smb`)上......)已打开,或者开放应用程序的URI处理程序中的额外漏洞是利用 - 此模式中已发现的漏洞已被发现在其他软件中,更预期将透露前进

在此帖子中,我们在许多桌面应用程序中显示了代码执行漏洞,所有这些都具有相同的根本原因:用户输入的验证不足,稍后将被视为URL并在操作系统的帮助下打开。所需的用户交互和开发策略取决于桌面环境,例如,使用URI方案允许/阻止列表是否已硬化。作为一个例子,这里是在xubuntu 20.04上的NextCloud(< 3.1.3)中对此问题的开发方式。

在解释不同OS和桌面环境的根本原因,易受攻击的模式和奇怪之后,我们将探讨如何在各种流行的桌面应用程序中利用此漏洞类型。

- [简介](#介绍) - [根原因:OS打开的用户提供的URL](#根本原因 - 用户提供的URL-On-Whe-OS) - [查找易受攻击的功能是简单的] (#查找易受攻击 - 特点 - 是直接的) - [操作系统和桌面环境具有不同的URL开放行为](#操作系统 - 桌面 - 环境 - 具有不同的URL开放行为) - [Windows 10 19042](#windows-10-19042) - [xubuntu 20.04](#xubuntu-2004-xfce) - [其他Linux操作系统](#topto-linux-moctions-systems)+ [snap](#snap) - [Mac(Catalina 10.15.6)](#mac-catalina-10156) - [漏洞](#漏洞) - [nextcloud](#nextcloud) - [电报](#telegram) - [vlc](#vlc) - [打开 - / libreoffice](#开放式libreoffice) - [mumble](#mumble) - [比特币/ dogecoin钱包](#bitcoindogecoin-wallets) - [wireshark](#wireshark) - [bonus-blynerability:winscp]( #boolus vultnerability-winscp) - [系统缓解需要contri来自操作系统,框架和应用维护者的武器](#系统缓解 - 需要 - 从OS框架和应用程序维护者源) - [结论](#结论)

从本机桌面应用程序打开文件和链接的常用方法是通过将URI传递给操作系统来处理(例如,打开“邮件”的默认邮件申请:“链接”:“链接”。

- Windows:`shellexecute *` - Linux:`xdg-open`(检测桌面环境和呼叫`gio打开',`gvfs-open`,`gnome-open-open`,`mate-open`,`exo-open` `Enlightment_open`) - Mac:`nsworkspace#OpenURL()`

通过以这种方式打开用户提供的URL而无需额外检查,这可能导致代码执行:

- 通过利用特定URI方案和文件扩展的操作系统行为 - 通过利用第三方应用程序URL处理程序的漏洞(例如[STEAV中的此漏洞:///`协议)(http://revuln.com/files/revuln_steam_browser_protocol_Insecurity。 PDF))

浏览器了解潜在的安全性含义和禁用`文件://` -links作为最危险的URI方案之一,并且至少在导航到其他外部URL之前显示弹出窗口。

虽然这些额外的检查已经通过安全意识的浏览器开发人员随着时间的推移来实现,但是在许多其他应用程序中缺少它们。

对于任何给定软件,请检查所有功能,其中用户提供的值被打开为URL(例如超链接)。如果该功能在引擎盖下使用操作系统以处理开口并允许任意方案而无需全面的警告消息,可能有一种方法可以利用某些平台上的功能。

我们发现Qt的`Qdesktopservices :: OpenURL()`功能满足第一个条件,并检查了使用验证的用户输入不充分的函数的函数的流行Qt的开源软件。诸如[SearchCode的工具允许轻松扩展跨越数百万索引开源项目的搜索](https://searchcode.com/?q=qdesktopservices%3a%3aopenurl)。

请注意,此行为和问题并不是Qt唯一的。作为另一个例子,电子的`shell.openexternal()`[具有相同的行为](https://benjamin-altpeter.de/shell-openexternal-dangers/),这引领了例如到了Wire Messenger中的[RCE](https://github.com/wireapp/wire-desktop/security/advisities/ghsa-5gpx -9976-ggpm)。

从我们的角度来看,OS的理想URL打开行为包括以下特征:

- **未自动安装**未在没有全面的用户警告的情况下寄出的文件共享,因为只需安装“SMB”份额可能导致凭据泄漏 - **在打开可执行或危险之前显示全面的用户警告**(即`。来自远程文件共享的DOCM`)文件

本节的其余部分包含我们在不同操作系统中观察到的这种行为的详细陈述。如果您对这些细节不感兴趣,您可以[跳过漏洞部分](#漏洞)我们演示不同的易受攻击桌面应用程序。

*可执行的`.jar`文件不会触发当它们位于安装的文件共享时(所需标准JRE安装)*所有兼容文件共享协议的UNC路径导致自动安装,没有警告:*`SMB`:`\ \< hostname> \< filename>`< / filename>< / hostname> *`webdav`:`\\< hostname> \ davwwwroot \< filename>`< / filename>< / hostname> *`webdavs`:`\\< hostname> @ssl \ davwwwroot \< filename>`< / filename>< / hostname> *许多应用程序将文件URL转换为UNC路径:`file://< hostname> / davwwwroot /< fileename>`变为`\\ hostname \ davwwwroot \< filename>`,允许一个绕过客户端检查< / filename>< / filename>< / hostname> *当UNC路径指向共享的根文件夹中的文件时,使用单个URL打开/单击完成文件时(否则,请单击“第一次安装”然后打开)

- 执行`.desktop`文件(因此运行指定的命令)在安装文件共享时不会触发警告,并且该文件具有可执行位设置 - “NFS”URL导致自动安装,而无需警告/通知并允许通过单个URL打开动作安装和执行 - “DAV”和“DAVS”URL指向未安装的共享的根文件夹导致自动安装。如果经过修改服务器以返回到对“/文件”的第一个Propfind请求的响应中的“集合”元素,还可以为指向共享上的特定文件的URL进行自动安装 - “DAV”,“DAVS”,“ FTP`,`ftps`ulls导致自动安装,没有警告。当安装由指向可执行文件的URL启动时,在安装后显示了关于该文件的未知原点的警告消息。但是,即使用户被用户取消了执行,当再次打开相同的URL时,使用现在已经安装了相同的URL,则执行该文件,并未显示进一步的警告 - “SMB”URL启动示出一个安装过程连接对话框(不是安全警告)可以用一点击选定的确认按钮 - “sftp`ulls启动一个安装过程,该过程在第一次连接时显示主机键确认对话框

确切的打开行为取决于桌面环境和配置。快速评论后,XFCE似乎具有最具可利用的功能:

- **自动安装:**在Kubuntu / KDE(`KDE-OPEN5`),远程文件是自动打开的,但远程份额未永久安装。打开远程文件时,会下载它,然后用默认程序打开/执行(但在此下载期间不会保留可执行标志)。 Ubuntu / Gnome(GIO打开)没有自动安装远程共享(“指定的位置未安装”),但已安装的股份的内容可称为本地文件(`文件:/// var /运行/用户/< id> / gvfs / ...`) - **文件类型:** .desktop文件通常不会解析/执行,而是在文本编辑器中打开。由于这对许多人来说意外,并且意味着没有从命令行启动的载载方法。2009年提交了一个错误[https://bugs.launchpad.net/ubuntu/+source/glib2 .0 / +错误/ 378783](https://bugs.launchpad.net/ubuntu/+source/glib2.0/ addbug/378783)和许多类似的讨论可以在互联网上找到。在2020年12月,通过引入新的单独的`GIO Maillow`命令关闭该错误。例如,已经实现了解决方法的用户,[通过将“.desktop`文件与`dex`”相关联(https://github.com/jceb/dex)可能仍然易受攻击。

捕捉应用程序受其他URI方案允许列表。最初,此列表仅包含“http`,`https`,`mailto`和`snap`,这打破了很多应用程序,包括Google Chrome。最近添加了更多URI方案](https://github.com/snapcore/snapd/blob/30ef6dd52df387d359afdcd15f96210e6e0a1d71/usersession/userd/launcher.go#l56-l118)。

Snap Team使用以下条件来解决“XDG-Open”呼叫的明确目标: - 该方案被理解并记录在代码中 - 方案本身不会导致“XDG-Open”(例如)打开文件(例如`文件: //`) - 验证了URL的收件人(即“XDG-Open`的Callee”)赢得了' T处理文件路径或其他参数,以便可以利用突破沙箱(需要了解URL如何驱动收件人应用程序)

从安全角度来看,这很值得赞赏。但是,初始可用性降低很高,这可能使用户推向整体限制的.deb包。尽管添加了更多的URI方案,但许多用例仍然被破坏。作为一个相当平凡的示例,我们发现“FTP://` -Links从”普通“电报桌面应用程序(浏览器中安全地)打开(安全地在浏览器中),但在Snap版本中没有任何内容(”用户打开错误:提供的URL计划“FTP”不允许")

- “SMB”“URL”打开“连接”对话框。确认连接将安装共享并打开Finder(文件资源管理器)视图 - “SMB”(File Explorer)视图 - “Shares上的特定文件的URL被解释为Share的根文件夹的URL。即使已安装了真实的根文件夹,它们也会触发另一个连接对话框。确认连接添加了附加条目,其中包含引用的文件的名称到“/卷” - 可以通过指向“/卷/< share_name> /< file_name>`<` ; / file_name>< / share_name> - 对于特定文件的“文件”URL,仅对某些文件类型打开文件,仅为某些文件类型,如“.txt`”,才能在手动打开之前(例如,通过双击Finder) - 总而言之其他测试的案例,`file`网址指向特定文件打开包含文件夹的查找器而不是打开文件

**请注意:**除了这些文件共享URI方案和扩展的这些不同组合外,还可以使用自定义URL方案处理程序引入更多危险,而独立于操作系统。在此博客文章中,我们在第三方应用程序中披露了一个这样的RCE,其允许任意代码执行而无需额外的用户交互。在即将介绍的博客文章中,我们将探讨Windows 10默认URI处理程序中的类似漏洞。

NextCloud Desktop Client在各个地方使用`qdesktopservices :: OpenURL`,但是,最有趣的情况是当用户连接到NextCloud服务器时。在这种情况下,服务器的登录页面已加载到WebView中。 Qt'默认行为是,在WebView中的单击链接不会直接调用OS'处理程序,所以这是安全的攻击。但是,NextCloud代码专门[拦截那些请求并将它们传递给`qdesktopservices :: OpenURL`向导/ webview.cpp#l226-l232)。

- 代码语言-JS - Bool ExternalWebenginePage :: AcceptNavigationRequest(Const QURL& URL,qwebenginePage :: NavigationType类型,Bool IsmainFrame){q_unused(类型); Q_Unused(ISMainFrame); qdesktopservices :: OpenURL(URL);返回false; }

如果没有对URI方案进行任何过滤,这会产生许多可能性,并且可以在没有额外确认的情况下平滑开发,如图中的视频中的视频中所示。以下两个视频显示了xubuntu(使用`sftp://`)和窗口中的剥削与漏洞的URI处理程序的开发方式:

NextCloud团队通过替换“Qdesktopservices :: OpenURL”(IndowUll`)与其实用程序函数`: OpenBrowser`实现该问题,该oppmbrows`它到`qdesktopservices :: Openurl`。

** cve:** cve-2021-22879 ** patch:** [验证敏感网址只允许http(s)方案](https://github.com/nextcloud/desktop/pull/2906)** hackerone报告:**通过恶意URI方案的[NextCloud Desktop客户端RCE](https://hackerone.com/reports/1078002)**安全咨询:** [https://nextcloud.com/security/advisory/?id= nc-sa-2021-008](https://nextcloud.com/security/advisory/?id=nc-sa-2021-008)

Windows / Linux / Mac OS的电报桌面应用程序似乎是一个有趣的目标,因为它是基于Qt,并通过链接直接传递给`qdesktopservices :: OpenURL`。

虽然电报可选地支持端到端加密的聊天,但桌面应用程序仅支持非E2E加密的聊天。在这种情况下,电报利用它们过滤发送的URL的能力。

电报API定义了特定的`MearryEntity`s([https://core.telegram.org/type/messageentity](htpps://core.telegram.org/type/messageentity)),具有“偏移”,a `length`和可选的附加参数。与URL相关的消息是[MESSAMENTITYURL](https://core.telegram.org/constructor/messageentityURL)和[MESSAMENTITYTEXTURL](https://core.telegram.org/constructor/messageentitytexturl)。

使用“mearaerentitytexturel`”,任何文本都可以指向任何URL(偏移量和长度定义要在`URL`参数定义目标时下划线的消息的哪个部分。在这种情况下,后端对URL执行严格检查,并且在许多情况下返回“400 - 不支持的URL协议”。我们发现,对于`messageentityurl`项目(没有URL字段,因此带下划线的文本也是链接目的地),使用稍微放松的过滤列表,允许`sftp://`ul方案。在xubuntu上,这可以通过链接到可执行的.desktop文件通过`sftp://`(包括用户名和服务器上的空密码为最小交互设置)来利用,以便利用。

在默认的Windows安装中,没有安装用于处理`sftp://`链接的应用程序。但是,我们的测试机器安装了WinSCP,默认寄存器本身是“SFTP://”URI处理程序“。 [已下载1.5亿次](https://winscp.net/eng/index.php),Winscp是流行的,几乎没有竞争为Windows的“SFTP”/“SCP”客户端,所以我们快速了解看看有可能。签出[奖励 - 漏洞:winscp](#bonus-plastability-winscp)下面,以查看Windows上的代码执行(使用WinSCP安装)。

有趣的是,我们可以追溯到从2015年的“SFTP://`”的不同治疗方法(HTTPS://github.com/telegramdesktop/tdesktop/issues/1201),其中用户观察并报告了一个看似的人令人惊讶的行为,而没有实际用例,增加了URI方案。

该问题于1月11日报告给电报,经过几次随访,通过服务器方面的改变(或以前)2月10日关闭。

在VLC的情况下,它可能不那么明显,利用功能在引擎盖下打开一个URL。该易受攻击的功能是播放列表项的上下文菜单中的“包含文件夹...”操作。

单击该项目时,包含的目录的路径被获取并由`qdesktopservices :: OpenURL`打开。通过添加额外的`/`或`/ dootnotexist.mp4`到播放列表条目的URL,“包含文件夹...”可以将“显示文件夹”归功于使用关联的默认应用程序打开文件。

- `vlc_uri2path C#L291),但是相关代码似乎无法访问,并且函数为UNC路径成功执行 - [来自从小核文件,https://doc.qt.io/qt-5/qurl.html#fromlocalfile):返回A&#34的古怪表示;本地文件"字符串,但也许假定也支持远程文件("此函数也接受具有一倍的前导斜杠(或反斜杠)的路径,以指示远程文件,如`//servername/path/to/file.txt`w #34;) - [`islocalfile`](https://doc.qt.io/qt-5/qurl.html#islocalfile):返回与`文件开始的任何URI的`true`:`("请注意,此函数将具有主机名的URL为本地文件路径")

由于所有这些函数允许远程`文件://` -paths,这可以使用包含文件URL或UNC路径指向的WebDAV共享中的文件URL或UNC路径的恶意播放列表文件在Windows上进行利用。

由于URI方案限制,对Linux的开发严重限制。由于没有引用远程文件以强制自动安装,只能使用特殊的`/运行/用户`目录引用已安装的远程共享(例如,播放列表所在的位置)(例如,“文件:///运行/运行/用户/ 1000 / gvfs / sftp:host =< host>,用户=< user>`)

通过添加检查来缓解该问题,以确保打开的URI是目录,防止RCE。 `vlc_uri2path`没有改变。因此,尽管函数可能似乎具有禁止远程文件的目标,但仍然可以指定UNC文件(导致使用NTLM哈希泄漏或潜在的其他意外行为,或者在使用`VLC_URI2PATH`时)。

我们向1月18日向VLC报告了漏洞,以及3个补丁候选人。一名候选人于2月8日合并,修补版3.0.13将可能会在下周发布。

OpenOffice和LibreOffice允许嵌入各种类型的文档中的超链接,包括常常在不受信任的方面共享的宏禁用文件类型。超链接可以点击Ctrl键,将它们发送到Windows上的“Shellexecute”或“Linux上的”XDG-Open“或”XDG-Open“呼叫。一键式漏洞显示在Windows和Xubuntu上的OpenOffice,以及Xubuntu的LibreOffice:

在Windows版libreoffice中,a [文件扩展名黑名单](https://github.com/libreoffice/core/blob/5e4c771c0b89452ab55d1ab30dbbb1634f15d3775/shell/source/win32/sysshexec.cxx#l340)旨在保护这种类型的攻击在我们的研究之前已经很久了。但是,我们很快找到了一种绕过这个黑名单的方法,允许在Windows上单击剥削,展示这种方法的不可靠性。

办公室套件允许具有相当复杂的内容和功能的文件,有时在实际上预期在“文件中的”FTP“特征(如”文件“中的内容)中的上下文中使用。因此,没有潜在的情况,不可能完全限制修复

......