我们最近发现了一个有趣的漏洞,该漏洞影响了大量的Qt5产品。 由于许多开发人员依赖Qt框架进行C ++和Python开发,因此此bug可能造成十分严重的影响。
使用Qt5框架构建的GUI应用程序均包含有一组受支持的命令行选项,而这些选项可以传递部分可执行二进制文件。
都将具有一组受支持的命令行选项,这些选项可以传递给可执行二进制文件。 例如运行下面的命令:
QtGUIapp.exe -qwindowtitle foobar
之后我们将发现foobar
替换了原始窗口标题的内容。 命令行选项platformpluginpath
更为明显。 此参数包含了指向Qt5
插件的目录路径以及UNC
共享目录。 换句话说,目标位置包含Windows上的动态链接库(DLL)文件。 Qt5应用程序将在内存中加载后自动执行这些插件。
读者可能会问,这个“功能”如何被利用? 什么样的攻击媒介适用? 确实,在许多情况下确实没有合适的payload来进行攻击,但是在配置自定义URI方案时会这种漏洞就容易发生。 让我们来谈谈下面几个案例,CVE-2019-1636``和CVE-2019-6739
。
Cisco Webex Teams(CVE-2019-1636)
安装Cisco Spark
和Webex Teams
后,“ciscospark”协议的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
)将允许应用程序加载外部插件。
例如如下命令:
CiscoCollabHost.exe -platformpluginpath C:/Users/research/Desktop/poc
之后我们发现其将加载并执行C:/Users/research/Desktop/poc/imageformats
目录中的所有DLL文件。 这是处理DLL加载的代码。
从/imageformats dir
读取的代码并解析图像。
了解这一点,攻击就非常直接了。 例如,POC可以如下进行编写。
远程共享包含“imageformats”目录,其中包含“malicious.dll”文件。 在这种情况下,DLL名称并不重要,因为QT5根据其元数据而不是其名称加载插件。
创建恶意DLL对Qt5开发人员影响不大,但它最初对我们的分析不太友好。 没有经过Qt5的预编程,编译将在Qt5加载过程中持续一些时间。我们花了一段时间试图弄清楚文件为何没有加载以及它的“DllMain”没有被执行的原因后,我们更深入地了解了Qt内核机制,发现缺少的部分是一个名为.qtmetad的PE部分。 事实证明,DLL插件中需要存在元数据部分才能由Qt5识别。 该部分包含有关插件及其处理的数据(如mime类型)的详细信息。 从另一个有效的插件如“qgif.dll”复制部分内容应该可以解决问题。
在Visual Studio
中,我们可以使用#pragma const_seg(“.qtmetad”)
创建一个节点。 除了DllMain
入口点之外,还会在加载DLL时需要执行qt_plugin_instance
函数。 思科用SA20190123修补了这个问题。
Malwarebytes Anti-Malware(CVE-2019-6739)
同样的概念适用于Malwarebytes Anti-Malware
。 其使用的协议标识符是“malwarebytes
”,其注册表项如下:
这里有所区别的地方是默认加载的插件类型。 与Webex
不同,Anti-Malware
不会读取和写入图像文件,因此不会加载前面提到的DLL。 而是使用Windows集成插件qwindows.dll
。 默认情况下,此DLL位于“\platforms\
”。
POC如下:
它与我们自行编译的DLL相同。 只需从“qwindows.dll
”中复制“.qtmetad
”部分就可以了。 通过在加载时将此命令行选项提供给Malwarebytes
,攻击者可以通过加载DLL而不是程序默认值来接管系统。 Malwarebytes
使用3.6.1.2711-1.0.508
之后的版本解决了此漏洞。
总结
该技术可应用于大多数基于Qt5进行编程的应用程序。 但是,在大多数情况下,除非上面的CVE中有明确的攻击payload,否则它将很难进行利用。 这完全取决于供应商应用的目的以及它们提供的类型。 在这些情况下,开发人员实现了Qt的功能,该功能由产品中其他机制中存在的攻击作为媒介进行综合利用。 对于开发人员,如果其使用框架来创建其他内容,请确保已经了解了加载的选项和功能。 如果不这样做,可能会导致像这些示例这样的漏洞情况,其中内置选项最终会导致意外后果。
本文为翻译稿件,来自:[https://www.zerodayinitiative.com/blog/2019/4/3/loading-up-a-pair-of-qt-bugs-detailing-cve-2019-1636-and-cve-2019-6739](https://www.zerodayinitiative.com/blog/2019/4/3/loading-up-a-pair-of-qt-bugs-detailing-cve-2019-1636-and-cve-2019-6739)