Razer Synapse 3 Windows客户端本地提权漏洞分析

栏目: 编程语言 · 发布时间: 5年前

内容简介:Razer Synapse(雷云)软件在系统中安装了一个服务(Razer Synapse Service),该服务以该漏洞已在Windows 10 1803 (x64)系统上的Razer Synapse 3 (3.3.1128.112711)Windows客户端上复现成功。

Razer Synapse 3 Windows客户端本地提权漏洞分析

一、漏洞简介

Razer Synapse(雷云)软件在系统中安装了一个服务(Razer Synapse Service),该服务以 NT AUTHORITY\SYSTEM 权限运行,会加载 C:\ProgramData\Razer\ 目录中的多个.NET assembly。 C:\ProgramData\Razer\* 及其子目录/文件在权限方面没有严格控制,通过身份认证的任何用户可以具备这些目录/文件的完全控制权限( FullControl )。攻击者有可能绕过签名检测机制,通过assembly侧加载方法提升至 SYSTEM 权限。

该漏洞已在Windows 10 1803 (x64)系统上的Razer Synapse 3 (3.3.1128.112711)Windows客户端上复现成功。

二、漏洞分析

当Razer Synapse服务启动时,会加载 C:\ProgramData\Razer\* 目录(包括子目录,比如 C:\ProgramData\Razer\Synapse3\Service\bin )中的.NET assembly。

Razer Synapse 3 Windows客户端本地提权漏洞分析

观察 C:\ProgramData\Razer\Synapse3\Service\bin 上设置的DACL权限时,我们可以发现 Everyone 具备该目录的 FullControl 权限(也包括该目录中的任何文件)。

Razer Synapse 3 Windows客户端本地提权漏洞分析

从理论上讲,攻击者可以将该目录中已有的.NET assembly替换成恶意assembly,重启系统,就可以让Razer Synapse Service加载恶意assembly。这种方法需要考虑一些复杂情况,比如竞争条件,需要在服务加载源assembly前执行替换操作。此外,该服务中存在一些检查机制,攻击者在加载assembly前需要绕过这些机制。为了能成功利用漏洞,我们需要澄清成功加载assembly的具体条件。

首先要解决的第一个问题就是如何植入恶意assembly,使目标服务能够加载该assembly。对低权限用户来说,劫持已有的assembly可能是比较有挑战的一个任务,因为低权限用户无法停止或者启动Razer Synapse服务。这意味着为了触发加载assembly的代码路径,攻击者需要重启目标系统。攻击者可以通过这种方式在条件竞争中获胜,将合法的assembly替换成恶意的assembly。其实这个问题很容易解决,观察目标服务,我们发现该服务会递归枚举 C:\ProgramData\Razer\* 中的所有DLL:

Razer Synapse 3 Windows客户端本地提权漏洞分析

这意味着我们可以简单地将一个assembly存放在其中一个目录中(如 C:\ProgramData\Razer\Synapse3\Service\bin ),这样目标服务就会将其视为一个已有的、有效的assembly。

递归枚举 C:\ProgramData\Razer\* 中的所有DLL后,该服务会尝试确保这些assembly都带有Razer的签名。目标服务首先会获取“Razer.cer”的证书信息。然后在每个assembly上调用 X509Certificate.CreateFromSignedFile() ,接着比较“Razer.cer”证书链与待加载的assembly的证书链。

Razer Synapse 3 Windows客户端本地提权漏洞分析

如果assembly的证书链与Razer.cer的不匹配,那么目标服务就不会加载该DLL。虽然在加载.NET assembly之前先检查证书是一个很不错的选择,但目标在具体实现上并不健壮,这是因为 X509Certificate.CreateFromSignedFile() 只会提取证书链信息,并不会去检查待检查的文件签名是否有效(参考 此处 资料)。这意味着攻击者有可能使用类似 SigPirate 之类的工具,将合法的Razer assembly证书克隆到恶意的assembly中(因为目标服务并不会去校验签名是否有效)。

一旦assembly通过证书检测过程,目标服务就会利用 Assembly.LoadFile() ,将其加载到当前的app域中。目标服务在调用 Assembly.LoadFile() 的过程中并不会执行任何恶意代码,但会在加载assembly后,检查assembly中是否实现了 IPackage接口

Razer Synapse 3 Windows客户端本地提权漏洞分析

该接口是 SimpleInjector 项目特有的一个接口(可参考该项目详细 说明文档 )。为了绕过这个检查过程,我们只需要在我们恶意的assembly中实现 IPackage 接口即可。一旦目标服务通过assembly的证书链验证,并且验证assembly中存在 IPackage 接口,就会将assembly加入运行列表中。对 C:\ProgramData\Razer\* 中的所有assembly执行完该操作后,目标服务就会将这个运行列表传递给 SimpleInjector RegisterPackages() 函数。

Razer Synapse 3 Windows客户端本地提权漏洞分析

RegisterPackages() 会认为该列表中的assembly都已通过校验,然后调用每个assembly IPackage 接口中的 RegisterServices() 函数。

Razer Synapse 3 Windows客户端本地提权漏洞分析

作为攻击者,这正是我们可以用来执行恶意代码的具体位置。我们只需要将恶意代码逻辑加入我们构造的恶意assembly IPackage 接口的 RegisterServices() 方法中即可。

到目前为止,我们已经找到了攻击路径,可以滥用正常服务来提升代码执行权限,具体步骤如下:

1、编写自定义的assembly,其中实现了来自 SimpleInjector 项目的 IPackage 接口;

2、将恶意逻辑加入 IPackage 接口的 RegisterServices() 方法中;

3、编译assembly,然后使用类似 SigPirate 的工具,从合法的Razer assembly中克隆证书链;

4、将最终生成的恶意assembly释放到 C:\ProgramData\Razer\Synapse3\Service\bin 目录中;

5、重启服务或者重启主机。

三、漏洞利用

澄清如何提升代码执行权限后,我们现在可以着手利用这一过程。首先,我们需要创建自己的恶意assembly,实现所需的 IPackage 接口。为了完成该任务,我们可以在代码中引用 SimpleInjector 项目中的 SimpleInjector 以及 SimpleInjector.Packaging assembly。添加引用语句后,我们还需要实现对应接口、添加恶意逻辑。典型的PoC assembly代码如下所示:

Razer Synapse 3 Windows客户端本地提权漏洞分析

由于Razer为32位服务,因此我们需要以x86架构来编译assembly。编译完成后,我们需要绕过证书链验证机制。由于服务使用的是 X509Certificate.CreateFromSignedFile() ,并且没有验证签名,因此我们可以使用 SigPirate ,从已签名的Razer assembly中克隆证书:

Razer Synapse 3 Windows客户端本地提权漏洞分析

我们可以在PowerShell中使用 Get-AuthenticodeSignature ,验证 SigPirate 正确设置了 lol.dll 的证书:

Razer Synapse 3 Windows客户端本地提权漏洞分析

此时,我们已经生成了一个恶意的assembly,其中包含带有“后门”的 IPackage 接口,并且从合法的Razer assembly克隆了证书链,那么最后一步就是将 lol.dll 释放到 C:\ProgramData\Razer\Synapse3\Service\bin 中,然后重启主机。一旦主机重启,我们可以看到以 SYSTEM 权限运行的 Razer Synapse Service.exe 会加载 C:\ProgramData\Razer\Synapse3\Service\bin 目录中的 lol.dll ,最终导致 IPackage 接口中的 RegisterServices() 方法成功运行 cmd.exe

Razer Synapse 3 Windows客户端本地提权漏洞分析

当服务加载 lol.dll 时,由于该assembly克隆了证书,因此会将其当成合法的assembly,并且由于我们在 IPackage 实现代码中添加了“恶意”逻辑,因此最终达到了EoP(权限提升)效果。

Razer实现了名为 Security.WinTrust 的一个命名空间,修复了这个漏洞,该命名空间包含完整性检查功能。打上补丁后,现在当目标服务获取Razer目录中的所有 *.dll 文件后,会立即调用 WinTrust.VerifyEmbeddedSignature() 函数执行检查操作。

Razer Synapse 3 Windows客户端本地提权漏洞分析

来分析一下 WinTrust.VerifyEmbeddedSignature() ,该函数会使用 WinTrust.WinVerifyTrust() 来验证待检查的文件的确具备有效的签名:

Razer Synapse 3 Windows客户端本地提权漏洞分析

如果文件具备有效的签名,并且签发者为Razer,那么目标服务就会继续前文分析的代码流程,在加载assembly之前检查其中是否包含有效的 IPackage 接口。添加文件完整性验证机制后,现在攻击者无法克隆合法Razer文件的证书信息,因为克隆出的新文件无法通过签名校验过程。

如果大家想进一步了解证书验证方面内容,我推荐大家参考 Matt Graeber 之前写的一份白皮书: Subverting Trust in Windows

四、时间线

06/05/2018: 向Razer的HackerOne项目提交漏洞报告

06/08/2018: 厂商通过H1确认报告

06/08/2018: H1工作人员要求我们提供Synapse 3安装程序的具体版本号

06/08/2018: 将Synapse 3版本号提供给Razer

07/05/2018:请求更新信息

08/06/2018: 报告已被分类

08/27/2018: 请求更新信息,厂商未回应

09/14/2018: 请求更新信息,也通过电子邮件直接联系以加快沟通进度,厂商未回应

12/14/2018: 通过Twitter联系Razer请求提供安全的联系方式

12/14/2018: H1项目经理开始调查H1报告

12/15/2018: Razer CEO Min-Liang Tan要求直接将电子邮件发送给安全团队

12/16/2018: 信息安全经理和软件高级副总裁通过邮件直接与我们联系,告诉我们将于几周内推出补丁

12/19/2018: 下载最新版的Synapse 3,研究存在漏洞的代码路径。向Razer的H1项目提交更多信息,也通知了Razer的信息安全经理

12/25/2018: Razer的某位员工联系我,提供了一个内部版本链接,以便后续漏洞反馈

12/27/2018: 根据他们的要求,我们通过H1报告提供有关环节措施的反馈

01/09/2019: 通过H1要求厂商给出更新版产品的公布时间线

01/10/2019: 厂商告知已公开新版本

01/10/2019: 报告流程已关闭

01/10/2019:要求公开披露漏洞信息

01/10/2019:Razer同意公开披露漏洞信息

01/21/2019:公布漏洞报告


以上所述就是小编给大家介绍的《Razer Synapse 3 Windows客户端本地提权漏洞分析》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Algorithms

Algorithms

Robert Sedgewick、Kevin Wayne / Addison-Wesley Professional / 2011-3-19 / USD 89.99

Essential Information about Algorithms and Data Structures A Classic Reference The latest version of Sedgewick,s best-selling series, reflecting an indispensable body of knowledge developed over the ......一起来看看 《Algorithms》 这本书的介绍吧!

URL 编码/解码
URL 编码/解码

URL 编码/解码

MD5 加密
MD5 加密

MD5 加密工具

HEX CMYK 转换工具
HEX CMYK 转换工具

HEX CMYK 互转工具