鉴于译者水平所限,如表述上存在问题,请以英文原版为准。
0x01 漏洞介绍
本文讲一个在NVIDIA GeForce Experience(GFE)上发现的任意文件写入漏洞(CVE-2019-5674),漏洞存在于默认安装运行NVIDIA GeForce的系统上。
通过任意文件写入漏洞,您可以强制应用程序以特权用户覆盖系统上的任何文件。通常,这只是意味着您可以通过覆盖关键系统文件来导致DOS,但如果您能够以某种方式控制正在编写的数据,通常您可以使用它来完成更多工作。
此漏洞允许覆盖任何系统文件,因为在GFE将数据通过SYSTEM权限写入的日志文件上设置了不安全的权限。此外,用户控制的数据可被注入一个日志文件中,然后将其作为批处理文件写入,从而导致其他用户执行代码并可能进行提权操作。
此外,我还将描述此漏洞如何与拒绝服务漏洞联系起来,以获得进一步提权。
0x02 什么是NVIDIA GeForce Experience
引用在NVIDIA网站中的介绍,“抓取和共享视频,截图,并与朋友进行直播互动,并保持你的驱动程序更新并优化游戏设置。”
从本质上讲,它是一个与GeForce产品一起安装的应用程序,为用户提供更多功能。
0x03 发现过程
为了开始寻找正在运行的NVIDIA服务和应用程序的问题,我打开了Process Monitor(Procmon)并了解了NVIDIA 默认运行的不同应用程序,它们作为GeForce Experience和其他服务的一部分。
为此,我使用了来自Sysinternals的procmon.exe。
注意到一些与NVIDIA相关的进程:nvcontainer.exe和NVDisplay.Container.exe。
我们能够看到NVIDIA正在运行的一些进程,我在Procmon中添加了一个过滤规则查看由* container.exe编写的不同文件,这些文件包括以下两个进程。
过滤后,只查找WriteFile操作,发现一些可疑进程。
下图显示了这些进程通过SYSTEM权限写入到“C:\ProgramData”(包含普通用户可以修改的文件)。
查看一些文件的权限,表明“Everyone”组可以完全控制它们。
文件被以SYSTEM权限写入,Everyone可以完全控制它们。每个用户都可以以任何方式修改文件,这包括创建到系统上其他文件的硬链接或符号链接。
如果我能够创建一个链接到另一个我无法通过普通用户写入的系统文件,SYSTEM进程将跟随该链接并能够写入该文件(系统文件),认为它是日志文件而将被写入。
这个操作可能更改关键系统文件,从而造成应用程序或系统不稳定,崩溃或无法启动等问题。
0x04 文件写入的利用
利用文件写入所需的符号链接和硬链接,可以使用symboliclink-testing-tools(by James Forshaw)进行创建。
即使是普通用户也可以创建指向系统文件的链接。
这苦我使用了Createsymlink工具,并创建一个临时的符号链接,从“C:\ProgramData\NVIDIA Corporation\nvstapisvr\nvstapisvr.log”到“C:\windows\test.file”(管理管拥有写权限和所有权)。为了使符号链接成功,它需要“C:\ProgramData\NVIDIA Corporation\nvstapisvr”目录为空(这是因为它需要创建一个需要空目录的目录连接)。
如果目录不为空,将会显示如下错误:
现在,当NVIDIA特权进程写入日志文件“C:\ProgramData\NVIDIA Corporation\nvstapisvr\nvstapisvr.log”时,可以看到它实际上写入了“C:\windows\test.file”这个文件。
如图:
这表明可以覆盖系统上的任何文件。虽然这个漏洞会造成一些影响,它将会覆盖指定文件并可能导致DoS。
但是之外,你所做的远不止这些。因为无法控制此特定日志文件中的数据,它只会写入需要记录的数据。
为了更好的利用这个漏洞,我想看看是否可以控制受影响的日志文件中的一些数据,并且尝试执行诸如对.bat文件的写入命令之类的操作。
经过一番研究之后,我发现“C:\ProgramData\NVIDIA Corporation\nvstreamsvc\nvstreamsvcCurrent.log”包含了我在其他文件中看到的一些字符串,这些字符串也可以由普通用户写入,“C:\ProgramData\NVIDIA Corporation\NvStreamSrv\SETTINGS.TXT”。
该文件包含一些变量,只要在GeForce Experience中打开和关闭“GameStream”服务时,就会将这些变量写入nvstreamsvcCurrent日志文件。
如图:
切换这个选项会导致写入日志文件“C:\ProgramData\NVIDIA Corporation\nvstreamsvc\nvstreamsvcCurrent.log”,其中包含settings.txt中的URL。
接下来,我尝试将一些命令附加到这些变量以对日志文件进行修改。
这已成功写入“C:\ProgramData\NVIDIA Corporation\nvstreamsvc\nvstreamsvcCurrent.log” 的日志中。
现在即使存在大量其他日志数据,我们注入的命令能够最终在.bat文件中执行。
结合写入任何目录,我可以将有效命令注入到易受攻击的文件中,尝试将其写入系统启动文件夹,并在任何登录的用户上执行命令。这将包括管理员用户,从而提权。
我发现创建符号链接的目录是必需的,但该目录包含一个NVIDIA服务正在使用的文件,阻止我删除它。
这可以通过引导到安全模式(普通用户可以)或者可能通过拒绝服务来解决这个问题,这将在稍后进行讨论。
让我们来总结一下:
将命令附加到“C:\ProgramData\NVIDIA Corporation\NvStreamSrvsettings.txt”。
清空“C:\ProgramData\NVIDIA Corporation\nvstreamsvc”目录。
创建从“C:\ProgramData\NVIDIA Corporation\nvstreamsvc\nvstreamsvcCurrent.log”到“C:\ProgramData\Microsoft\Windows\Start Menu\Programs\StartUpcmd.bat”的符号链接。
创建符号链接:
现在可以打开和关闭“GameStream”服务,最后在系统的启动目录中输入cmd.bat文件。
此时,以任何用户身份登录都会导致注入日志文件的任何命令以该用户权限运行。
0x05 进一步提权的可能性讨论
进一步讲,如果该漏洞与NVIDIA上的拒绝服务配合使用,则为进一步提权提供可能。
NVIDIA有几个批处理文件,我们可以在“C:Windows”中找到。
只要“NVIDIA Display Container” 或 “NVIDIA Telemetry Container”服务崩溃超过2次,这些文件就会被以SYSTEM权限执行。
这是NVIDIA服务的默认恢复设置的一部分。我们可以看到:
这些文件可以使用本文中解释的任意文件写入目标,然后通过使服务崩溃3次以强制执行BAT文件,从而实现提权。
0x06 结论
此概念证明演示了任意文件写入漏洞的影响,以及对应用程序文件的不正确权限可能具有的影响。
通常,任意文件写入都不会被认为是非常有影响的漏洞,因为假设它只能简单地用一些数据覆盖任意文件。
但是,如果您能以某种方式控制正在编写的数据并借助其他漏洞,那么影响可能会非常显著。
如果你感兴趣,可以在我们的GitHub中找到相关验证代码。
NVIDIA的原始建议可以在这里找到。此问题存在于3.18之前的GeForce Experience版本中,因此请确保您使用的是NVIDIA的最新版本。
参考链接
https://rhinosecuritylabs.com/application-security/nvidia-arbitrary-file-writes-to-command-execution-cve-2019-5674/
https://www.securityweek.com/nvidia-patches-serious-flaw-geforce-experience-software