Razer Synapse 3权限提升漏洞分析与利用

本文详细分析了Razer Synapse 3软件中的权限提升漏洞,包括漏洞原理、利用方法和修复方案。通过.NET程序集侧加载和证书链克隆技术,攻击者可在SYSTEM权限下执行任意代码。

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程序集。“C:\ProgramData\Razer*“文件夹及其递归目录/文件的权限设置较弱,允许任何经过身份验证的用户对内容拥有完全控制权。通过程序集侧加载技术,可以绕过签名检查并提升至SYSTEM权限。

漏洞解释

当Razer Synapse服务启动时,它会从"C:\ProgramData\Razer*“内的各个目录(如"C:\ProgramData\Razer\Synapse3\Service\bin”)加载.NET程序集。

查看文件夹"C:\ProgramData\Razer\Synapse3\Service\bin"的DACL时,您会注意到"Everyone"对该文件夹(包括文件夹内的任何文件)拥有"FullControl"权限:

理论上,攻击者可以简单地用恶意程序集替换现有的.NET程序集,重新启动系统,并让Razer Synapse服务在启动时加载它。这种方法存在一些复杂性,例如在服务加载程序集之前替换程序集的竞争条件。此外,服务在加载程序集之前实施了一些必须通过的检查。为了有效利用,完全理解程序集可以成功加载的条件非常重要。

要解决的第一个问题是以服务将尝试加载的方式植入恶意程序集。劫持现有程序集可能具有挑战性,因为低权限用户无权停止或启动Razer Synapse服务。这意味着要触发程序集加载代码路径,需要重新启动计算机。这使得在竞争条件中获胜,用恶意程序集替换合法程序集变得具有挑战性。查看服务时,这个问题很容易解决,因为它会递归枚举"C:\ProgramData\Razer*“中的所有DLL。

这意味着我们可以简单地将程序集放入其中一个文件夹(例如C:\ProgramData\Razer\Synapse3\Service\bin)中,它将被视为与现有的有效程序集相同。

递归枚举"C:\ProgramData\Razer*“中的所有DLL后,服务尝试确保这些已识别的程序集由Razer签名。这是通过从"Razer.cer"获取证书信息,对每个程序集调用X509Certificate.CreateFromSignedFile(),然后将Razer.cer的证书链与正在加载的程序集进行比较来完成的。

如果程序集上的证书链与Razer.cer的证书链不匹配,服务将不会加载它。虽然在加载之前检查.NET程序集的信任度的想法很好,但实现并不健壮,因为X509Certificate.CreateFromSignedFile()仅提取证书链,并且绝不证明被检查文件签名的有效性(https://twitter.com/tiraniddo/status/1072475737142239233)。这意味着可以使用诸如SigPirate之类的工具从有效的Razer程序集中克隆证书到恶意程序集,因为所述程序集的签名实际上从未经过验证。

一旦程序集通过证书检查,服务将通过Assembly.LoadFile()将其加载到当前应用程序域中。然而,在Assembly.LoadFile()调用期间不会执行恶意代码。之后,服务将检查以确保实现了IPackage接口。

此接口特定于SimpleInjector项目,并有详细文档记录。通过此检查的唯一要求是在我们的恶意程序集中实现IPackage接口。一旦服务验证了程序集的证书链并验证了IPackage的存在,它就会将程序集添加到运行列表中。对"C:\ProgramData\Razer*“中找到的所有程序集执行此操作后,该列表将传递给SimpleInjector的"RegisterPackages()“函数。

RegisterPackages()将获取"已验证"程序集的列表,并在每个程序集的IPackage接口中调用"RegisterServices()“函数。

这是我们作为攻击者可以执行恶意代码的点。所需要做的就是在我们的恶意程序集的IPackage接口内的"RegisterServices()“方法中添加恶意逻辑。

此时,我们已经找到了滥用所有要求以获得提升的代码执行的方法。

  • 编写一个实现SimpleInjector项目中IPackage接口的自定义程序集
  • 在IPackage接口内的"RegisterServices()“方法中添加恶意逻辑
  • 编译程序集并使用诸如SigPirate之类的工具从有效的Razer程序集中克隆证书链
  • 将最终的恶意程序集放入"C:\ProgramData\Razer\Synapse3\Service\bin”
  • 重新启动服务或重新启动主机

利用

在理解了在提升的上下文中获得任意代码执行的要求后,我们现在可以对其进行利用。首先,我们需要创建实现所需IPackage接口的恶意程序集。为此,需要从SimpleInjector项目添加对"SimpleInjector"和"SimpleInjector.Packaging"程序集的引用。添加引用后,我们只需要实现接口并添加恶意逻辑。PoC程序集可能如下所示:

由于Razer服务是32位的,我们将程序集编译为x86。编译后,我们需要通过证书链检查。由于服务使用X509Certificate.CreateFromSignedFile()而没有任何签名验证,我们可以简单地使用SigPirate从签名的Razer程序集中克隆证书:

在PowerShell中使用"Get-AuthenticodeSignature”,我们可以验证证书是否已应用于从SigPirate创建的"lol.dll"程序集:

此时,我们有一个具有"后门"IPackage接口的恶意程序集,该接口具有从有效Razer程序集克隆的证书链。最后一步是将"lol.dll"放入"C:\ProgramData\Razer\Synapse3\Service\bin"并重新启动主机。一旦主机重新启动,您将看到"Razer Synapse Service.exe”(以SYSTEM权限运行)已从"C:\ProgramData\Razer\Synapse3\Service\bin"加载了"lol.dll”,导致在实现的IPackage接口中的"RegisterServices()“方法执行cmd.exe。

当服务加载"lol.dll"时,由于克隆的证书,它将其视为有效,并且由于IPackage实现中的"恶意"逻辑而发生EoP。

Razer通过实现一个名为"Security.WinTrust"的新命名空间来修复此问题,该命名空间包含完整性检查功能。服务现在将在从Razer目录拉取所有”*.dll"文件后立即调用"WinTrust.VerifyEmbeddedSignature()"。

查看"WinTrust.VerifyEmbeddedSignature()“时,该函数利用"WinTrust.WinVerifyTrust()“来验证被检查的文件具有有效签名(通过WinVerifyTrust())。

如果文件具有有效签名且签名者是Razer,则服务将继续原始代码路径,在加载程序集之前检查有效的IPackage接口。通过验证文件的完整性,攻击者无法再从签名的Razer文件中克隆证书,因为新克隆文件的签名将无效。

有关信任验证的其他阅读,我鼓励您阅读Matt Graeber的白皮书"Subverting Trust in Windows”。

披露时间线

  • 2018年6月5日:向Razer的HackerOne计划提交漏洞报告
  • 2018年6月8日:在H1线程上发布响应,确认报告
  • 2018年6月8日:H1工作人员要求提供Synapse 3安装程序的特定版本号
  • 2018年6月8日:向Razer提供了Synapse 3安装程序版本号
  • 2018年7月5日:要求更新
  • 2018年8月6日:报告标记为已分类
  • 2018年8月27日:要求更新,无响应
  • 2018年9月14日:要求更新,并提供直接电子邮件地址以加快沟通。无响应
  • 2018年12月14日:通过Twitter要求Razer的安全联系人
  • 2018年12月14日:H1项目经理联系调查H1报告
  • 2018年12月15日:Razer CEO Min-Liang Tan直接联系,要求提供直接电子邮件以传递给安全团队
  • 2018年12月16日:信息安全经理和软件高级副总裁直接通过电子邮件联系。我被告知修复将在几周内推送给公众
  • 2018年12月19日:拉取最新的Synapse 3构建并调查易受攻击的代码路径。向Razer的H1计划提交了其他信息,并通知了Razer的信息安全经理
  • 2018年12月25日:Razer的某人联系我,提供了用于修复验证的内部构建链接
  • 2018年12月27日:根据他们的要求,通过H1报告提供了对已实施缓解措施的反馈
  • 2019年1月9日:要求提供固定构建提供给公众的时间表更新(通过H1)
  • 2019年1月10日:被告知构建现已可供公众使用
  • 2019年1月10日:报告关闭
  • 2019年1月10日:请求公开披露许可
  • 2019年1月10日:Razer授予公开披露许可
  • 2019年1月21日:报告发布

*注意:虽然披露时间线很长,但我必须假设这是由于Razer管理H1计划的人员与Razer从事修复工作的人员之间的脱节造成的。一旦我提供了内部联系人,时间线和体验就大大改善了。

-Matt N.

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计