内容简介:我们最近发现了一个有趣的漏洞,该漏洞影响了大量基于Qt5的产品。由于许多开发人员都依赖Qt框架进行C++和Python的开发,因此这一漏洞的后果可能会非常深远。使用Qt5框架构建的任何GUI应用程序,都将具有一组受支持的命令行选项,这些选项可以传递给可执行的二进制文件。例如,运行以下命令:这样会使用foobar,替换掉开发人员作为窗口标题的任何内容。其中,有一个有趣的命令行选项,是platformpluginpath。这个参数应该包含指向Qt5插件的目录路径或UNC共享。换而言之,目标位置应该包含Windo
一、概述
我们最近发现了一个有趣的漏洞,该漏洞影响了大量基于Qt5的产品。由于许多开发人员都依赖Qt框架进行C++和 Python 的开发,因此这一漏洞的后果可能会非常深远。
使用Qt5框架构建的任何GUI应用程序,都将具有一组受支持的命令行选项,这些选项可以传递给可执行的二进制文件。例如,运行以下命令:
QtGUIapp.exe -qwindowtitle foobar
这样会使用foobar,替换掉开发人员作为窗口标题的任何内容。其中,有一个有趣的命令行选项,是platformpluginpath。这个参数应该包含指向Qt5插件的目录路径或UNC共享。换而言之,目标位置应该包含Windows上的动态链接库(DLL)文件。Qt5应用程序将在内存中加载这些插件,并自动执行(取决于某些元数据)。
我们不禁要问,这个“特性”如何能够被利用呢?什么样的攻击媒介可以适用?确实,在许多情况下,并没有一个合适的向量,但是在配置 自定义URI方案 后我们能够得到想要的结果。接下来,让我们重点分析两个案例,分别是 CVE-2019-1636 (Cisco WebEx)和 CVE-2019-6739 (Malwarebytes),Qt5中存在的漏洞分别给这两个产品带来了严重的风险。
二、Cisco WebEx Teams(CVE-2019-1636)
2.1 漏洞名称
Cisco WebEx Teams Cisco Spark URI处理程序远程命令执行漏洞
2.2 CVE ID
CVE-2019-1636
2.3 CVSS评分
8.8(AV:N/AC:L/PR:N/UI:R/S:U/C:H/I:H/A:H)
2.4 漏洞详情
该漏洞允许远程攻击者在易受攻击的Webex Cisco Spark安装上执行任意代码。需要用户交互才能利用此漏洞,因为目标必须访问恶意网页。
该产品在某些方案中处理URI的方式存在问题。该产品不会警告用户即将发生危险的导航。由于URI中的特殊字符未被清理,因此可能导致执行任意命令。攻击者可以利用这一漏洞,以中等的完整性在当前用户的上下文中执行代码。
该漏洞是由于Windows操作系统中定义的应用程序URI使用了不安全的搜索路径而引起的。攻击者可以通过诱导目标用户关注恶意链接来实现漏洞利用,经过成功利用后,应用程序可能会从URI链接所针对的目录加载库。如果攻击者可以将精心设计的库放置在易受攻击的系统中可访问的目录中,那么攻击者可以使用这一行为,以目标身份的权限在提供上执行任意命令。
该漏洞影响3.0.10260之前版本的所有Cisco Webex Teams,该更新版本于2018年11月21日发布。
2.5 漏洞分析
在安装Cisco Spark和Webex Teams之后,“ciscospark”协议的URI处理程序在注册表中会按照以下键配置:
为Webex配置自定义URI方案的注册表项:
该密钥确保使用ciscospark协议标识符的任何URI最终都会调用CiscoCollabHost.exe。Cisco Spark应用程序基于Qt5,如前所述,它支持多个命令行参数,包括platformpluginpath。Spark允许用户读取和写入多种图像格式,例如.gif、.jpg和.bmp文件。该功能需要几个插件来解析图像格式,包括:qgif.dll、qicns.dll、qico.dll、qjpeg.dll、qsvg.dll、qtga.dll、qtiff.dll、qwbmp.dll和qwebp.dll。这些插件默认从“\imageformats\”目录加载。但是,一旦将“-platformpluginpath”传递给可执行文件(CiscoCollabHost.exe),就意味着允许加载外部插件。
举例来说,如下命令将加载并执行C:/Users/research/Desktop/poc/imageformats目录中的所有DLL:
CiscoCollabHost.exe -platformpluginpath C:/Users/research/Desktop/poc
处理DLL加载过程的代码如下,这部分代码负责在Qt5Core.dll中加载DLL:
从/imageformats目录读取并开始解析图像的代码如下:
在了解这一点之后,就可以很明确地进行漏洞利用了。例如,PoC可以非常简单:
在远程“共享”中,包含“imageformats”目录,其中包含“malicious.dll”文件。在这种情况下,DLL名称无关紧要,因为Qt5会根据其元数据加载插件,而不是根据其名称。
创建恶意DLL,对Qt5的开发人员来说,似乎显得微不足道,但它最初并不适合我们。因为我们缺乏Qt5的开发经验,所以要编译需要由Qt5加载的特制DLL,还需要一段时间。在花费了一段时间试图弄清楚文件没有加载的原因,以及其“DllMain”没有被执行的原因之后,我们更加深入的对Qt核心进行研究,最终发现缺少的内容是一个名为.qtmetad的PE段。事实证明,DLL插件中需要存在元数据段,这样才能被Qt5识别。该断种,包含有关插件及其处理的数据的详细信息(例如:mime类型)。如果我们从另一个有效的插件中(例如:qgif.dll)复制段内容,应该可以解决这一问题。
来自GIF解析插件的元数据内容:
在Visual Studio中,我们可以使用#pragma const_seg(".qtmetad")创建一个段。除了DllMain入口点之外,还会在加载DLL时执行qt_plugin_instance函数。Cisco在 SA20190123 中修复了这一漏洞。
2.6 披露时间表
·2018年8月20日 向厂商报告漏洞
· 2019年1月25日 公开披露
三、Malwarebytes反恶意软件(CVE-2019-6739)
3.1 漏洞名称
Malwarebytes反恶意软件URI处理程序远程命令执行漏洞
3.2 CVE ID
CVE-2019-6739
3.3 CVSS评分
8.8(AV:N/AC:L/PR:N/UI:R/S:U/C:H/I:H/A:H)
3.4 漏洞详情
该漏洞允许远程攻击者在Malwarebytes反恶意软件产品的易受攻击版本上执行任意代码。需要用户交互才能利用此漏洞,因为目标必须访问恶意网页。
产品在某些方案中处理URI的方式存在问题。该产品不会警告用户即将发生危险的导航。由于URI中的特殊字符未被清理,因此可能导致任意命令执行。攻击者可以利用此漏洞,以中等完整性在当前用户的上下文中执行代码。
该漏洞已在3.6.1.2711-1.0.508之后的版本中实现修复。
3.5 漏洞分析
同样的概念也适用于Malwarebytes反恶意软件产品。其使用的协议标识符为“malwarebytes”,其用于为反恶意软件配置自定义URI方案的注册表项如下:
这里的区别是默认加载的插件类型。与Webex不同,反恶意软件不会读取和写入图像文件,因此不会加载前面提到的DLL,而是使用Windows中集成的插件qwindows.dll。在默认情况下,该DLL位于“\platforms\”。
其PoC也是类似的:
它与特制的DLL相同。只需要从“qwindows.dll”复制到“.qtmetad”段即可。通过在加载的过程中将此命令行选项提供给Malwarebytes,攻击者就可以通过加载DLL来接管系统,而不会是程序的默认值。Malwarebytes在3.6.1.2711-1.0.508之后的版本中解决了这一漏洞。
3.6 披露时间表
·2018年8月21日 向厂商报告漏洞
· 2019年2月20日 公开披露
四、总结
这种漏洞利用方式可以应用于大多数(不是全部)基于Qt5的应用程序。然而,在大多数情况下,除非像上面的CVE这样,表现出明显的攻击向量之外,并不会有任何实际效果。是否能成功利用漏洞,完全取决于厂商的实现方式,以及它们提供的类型向量。在这些情况下,开发人员实现了Qt的合法功能,该功能由产品中其它机制存在的攻击媒介所利用。对于厂商来说,如果使用了一个框架来帮助其内容创作,一定要确保了解这些选项,并且知道即使不指定它们也会被载入。如果这一点没有弄清楚,很可能会导致像示例这样的情况的出现,其中的内置选项最终会导致意外的后果。
大家可以在Twitter上找到我(@ziadrb),并且关注我们团队的动态,以获得最新的漏洞利用技术和安全补丁。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:- Joomla 3.8.10 发布,修复 Windows 自动加载器漏洞
- 介绍同步加载、异步加载、延迟加载[原创]
- .net加载失败的程序集重新加载
- 虚拟机类加载机制:类加载时机
- 探秘类加载器和类加载机制
- hibernate中加载策略+批加载+懒加载异常【原创】
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。