0x00 前言
Razer Surround会在当前系统中安装名为RzSurroundVADStreamingService
的一个服务,该服务以SYSTEM
权限运行,并且会运行位于C:\ProgramData\Razer\Synapse\Devices\Razer Surround\Driver
目录中的RzSurroundVADStreamingService.exe
。与此同时,厂商在RzSurroundVADStreamingService.exe
与C:\ProgramData\Razer\Synapse\Devices\Razer Surround\Driver
上的权限设置不当,程序文件可以被替换为恶意文件,导致攻击者能将权限提升至SYSTEM
级别。
漏洞概要信息如下:
版本: Razer Surround 1.1.63.0
测试操作系统: Windows 10 1803 (x64)
漏洞描述: 通过不安全的目录/文件权限实现Razer Surround权限提升
0x01 漏洞细节
在漏洞研究过程中,选择合适的目标并进一步研究可能是非常具有挑战性的一个任务。许多人可能会认为,在大型软件平台上寻找漏洞可能没那么简单,会假设所有漏洞都比较复杂,需要特殊技能来识别。因此我想以本文为例,给大家一点信心,让大家知道这个过程并没有想象中那么难。
大家可能会问,为什么选择Razer?如何确定选择哪个软件开始查找漏洞?答案比较简单:选择你感兴趣的目标即可。我自己拥有各种Razer产品,每天都在使用这些产品及相关软件,因此很难抑制住研究的冲动。
寻找漏洞时,在安装完感兴趣的软件后,我通常会执行一些常用操作。这些操作包括分析目标软件已暴露的接口中是否存在可能利用的攻击面。通常我会从基础开始梳理,然后根据需要采用动态或者动态分析。一开始我寻找的切入点通常包括:
1、已安装服务(包括服务权限以及服务可执行程序/路径权限);
2、命名管道(及对应的ACL);
3、某些目录(如C:\ProgramData
)中的日志文件权限;
4、网络套接字;
5、DCOM服务端以及托管的接口。
在常用工具方面,我主要使用的是Process Monitor以及James Forshaw开发的NTObjectManager。
对于Razer Surround,我首先检查进程列表信息,判断软件使用的是哪个特权进程,结果表明RzSurroundVADStreamingService.exe
会以NT AUTHORITY\SYSTEM
权限运行,下一步就是找出该进程的启动方式。由于该进程名中包含“service”这个关键词,因此这是一个很好的切入点。为了确认一点,我们可以在PowerShell中使用Get-Service *Rz*
来返回名称中包含“Rz”的所有服务。我找到了RzSurroundVadStreamingService
这个系统服务,其ImagePath
为可执行文件的路径。导出ImagePath
后,可知服务程序的具体目录为C:\ProgramData\Razer\Synapse\Devices\Razer Surround\Driver\
。
为什么这一点比较有意思?默认情况下,BUILTIN\Users
用户组具备C:\ProgramData
目录的GenericWrite
访问权限:
这里软件开发者经常犯一个错误,就是没有正确锁定在C:\ProgramData
中创建的子目录的权限。如果安装程序只是简单地在C:\ProgramData
中创建一个目录,那么该目录及任何子目录都会继承C:\ProgramData
的权限,其中就包括BUILTIN\Users
用户组具备的GenericWrite
访问权限。
对于这个漏洞,不正确的文件及目录权限是罪魁祸首,其中Everyone
最终被授予对C:\ProgramData\Razer\Synapse\Devices\Razer Surround\Driver
中任意文件的FullControl
访问权限:
前面提到过,这个路径正是RzSurroundVADStreamingService
服务ImagePath
指向的可执行文件所在的目录。由于低权限用户具备该目录及其中文件的FullControl
控制权,因此攻击者有可能直接替换RzSurroundVADStreamingService
系统服务所对应的可执行文件:
一旦拷贝payload,重启主机就可以让该服务以SYSTEM
权限运行新的可执行程序。这里我们以SYSTEM
权限启动一个cmd.exe
。
Razer将RzSurroundVADStreamingService.exe
以及关联的依赖项移到了更为安全的路径:C:\Program Files (x86)\Razer
,最终修复了这个漏洞。
0x02 时间线
由于SpecterOps之类的漏洞平台遵循透明度原则,我们人认为攻击者会在漏洞公开后第一时间利用这些脆弱性。这也是为什么我们在公开新的漏洞或者攻击技术前,会定期通知相关厂商漏洞细节,确保厂商有足够的时间缓解问题,我们也会通知可信的供应商,以便尽快将检测结果传递给客户。
具体时间线如下:
- 2019年3月20日 – 向Razer发送初步报告
- 2019年3月21日 – Razer确认漏洞报告
- 2019年4月30日 – 距离初步报告提交已30天
- 2019年5月2日 – Razer提供了一个修复版以供我们测试
- 2019年5月2日 – 我们验证漏洞已修复
- 2019年5月20日 – 初步报告提交后60天
- 2019年6月6日 – 与Razer讨论关于推出补丁的时间表
- 2019年6月6日 – Razer告知我们会推出在线修复版,但需要开发团队进一步验证
- 2019年6月7日 – 通知Razer我们无法在网站上或通过Surround的更新机制获得补丁
- 2019年6月10日 – Razer宣称内部处理流程有点混乱,会在6月底在线修复
- 2019年6月11日 – 通知Razer我们会推迟披露漏洞细节,直到在线补丁生效
- 2019年6月20日 – 初步报告提交后90天,漏洞细节披露时间延期
- 2019年7月1日 – Razer告知我们已通知开发团队补丁推出的具体时间
- 2019年7月5日 – 官方发布补丁