Razer Synapse 3权限提升漏洞
产品版本: Razer Synapse 3 (3.3.1128.112711) Windows客户端
下载来源: https://www.razer.com/downloads
测试操作系统: Windows 10 1803 (x64)
漏洞类型: Razer Synapse Windows服务权限提升
简要描述: Razer Synapse软件有一个以"NT AUTHORITY\SYSTEM"权限运行的服务(Razer Synapse Service),该服务从"C:\ProgramData\Razer*“加载多个.NET程序集。该文件夹及其递归目录/文件具有弱权限,允许任何经过身份验证的用户对内容拥有完全控制权。攻击者可以绕过签名检查,通过程序集旁加载提升至SYSTEM权限。
漏洞原理分析
当Razer Synapse服务启动时,它会从"C:\ProgramData\Razer*“内的各个目录(如"C:\ProgramData\Razer\Synapse3\Service\bin”)加载.NET程序集。
查看文件夹"DACL"时,会发现"Everyone"对文件夹(包括文件夹内的任何文件)具有"FullControl"权限。
理论上,攻击者可以简单地用恶意程序集替换现有.NET程序集,重启系统并让Razer Synapse服务在启动时加载它。但这种方法存在一些复杂性,比如在服务加载程序集之前替换程序集的竞争条件。此外,服务在加载程序集前会实施一些必须通过的检查。
漏洞利用条件
服务会递归枚举"C:\ProgramData\Razer*“中的所有DLL,这意味着我们可以简单地将程序集放入其中一个文件夹(例如C:\ProgramData\Razer\Synapse3\Service\bin),它将被视为与现有有效程序集相同。
服务通过从"Razer.cer"获取证书信息,对每个程序集调用X509Certificate.CreateFromSignedFile(),然后将Razer.cer的证书链与要加载的程序集进行比较。但由于X509Certificate.CreateFromSignedFile()仅提取证书链而不验证文件签名的有效性,攻击者可以使用SigPirate等工具从有效的Razer程序集克隆证书到恶意程序集。
通过证书检查后,服务通过Assembly.LoadFile()将程序集加载到当前应用程序域。服务会检查是否存在IPackage接口实现,该接口来自SimpleInjector项目。攻击者只需在恶意程序集中实现IPackage接口即可通过此检查。
漏洞利用步骤
- 编写实现SimpleInjector项目中IPackage接口的自定义程序集
- 在IPackage接口的"RegisterServices()“方法中添加恶意逻辑
- 编译程序集并使用SigPirate等工具从有效Razer程序集克隆证书链
- 将最终恶意程序集放入"C:\ProgramData\Razer\Synapse3\Service\bin”
- 重启服务或重启主机
修复方案
Razer通过实现名为"Security.WinTrust"的新命名空间来修复此漏洞,该命名空间包含完整性检查功能。服务现在在从Razer目录获取所有”*.dll"文件后立即调用"WinTrust.VerifyEmbeddedSignature()"。
“WinTrust.VerifyEmbeddedSignature()“函数利用"WinTrust.WinVerifyTrust()“验证被检查文件具有有效签名(通过WinVerifyTrust())。如果文件具有有效签名且签名者来自Razer,服务将继续原始代码路径,在加载程序集前检查有效的IPackage接口。
披露时间线
- 2018年6月5日:向Razer的HackerOne项目提交漏洞报告
- 2018年6月8日:H1帖子回复确认报告
- 2018年8月6日:报告标记为已分类
- 2018年12月14日:通过Twitter联系Razer安全联系人
- 2018年12月15日:Razer CEO直接联系要求提供直接邮箱
- 2018年12月16日:信息安全经理和软件SVP直接通过电子邮件联系
- 2018年12月19日:下载最新Synapse 3构建并调查漏洞代码路径
- 2018年12月25日:收到Razer内部构建链接进行修复验证
- 2019年1月10日:修复版本向公众提供,报告关闭
- 2019年1月21日:报告公开发布