Razer Synapse 3权限提升漏洞
发布日期: 2019年1月21日
产品版本: Razer Synapse 3 (3.3.1128.112711) Windows客户端
测试操作系统: Windows 10 1803 (x64)
漏洞类型: Razer Synapse Windows服务权限提升(EoP)
漏洞概述
Razer Synapse软件包含一个以"NT AUTHORITY\SYSTEM"权限运行的Razer Synapse服务,该服务从"C:\ProgramData\Razer*“目录加载多个.NET程序集。该目录及其递归子目录/文件的权限设置较弱,允许任何经过身份验证的用户对内容拥有完全控制权。攻击者可以通过程序集旁加载技术绕过签名检查并提升至SYSTEM权限。
漏洞原理分析
服务加载机制
当Razer Synapse服务启动时,会从"C:\ProgramData\Razer*“下的各个目录(如"C:\ProgramData\Razer\Synapse3\Service\bin”)加载.NET程序集。
检查"C:\ProgramData\Razer\Synapse3\Service\bin"文件夹的DACL时,会发现"Everyone"对该文件夹(包括其中的所有文件)拥有"FullControl"权限。
利用挑战与解决方案
理论上,攻击者可以简单地用恶意程序集替换现有程序集,重启系统并让Razer Synapse服务在启动时加载它。但这种方法存在竞态条件等问题,需要在服务加载程序集之前完成替换。
服务会递归枚举"C:\ProgramData\Razer*“中的所有DLL文件,这意味着我们可以直接将程序集放入其中一个文件夹(如C:\ProgramData\Razer\Synapse3\Service\bin),它将被视为现有的有效程序集。
签名检查绕过
服务递归枚举所有DLL后,会尝试确保这些程序集由Razer签名。这是通过从"Razer.cer"获取证书信息,对每个程序集调用X509Certificate.CreateFromSignedFile(),然后将Razer.cer的证书链与正在加载的程序集进行比较来实现的。
由于X509Certificate.CreateFromSignedFile()仅提取证书链,并不验证文件签名的有效性,攻击者可以使用SigPirate等工具从有效的Razer程序集中克隆证书到恶意程序集上。
程序集加载执行
通过证书检查后,服务通过Assembly.LoadFile()将程序集加载到当前应用程序域中。然后服务检查是否实现了IPackage接口。
该接口特定于SimpleInjector项目,需要在我们恶意程序集中实现IPackage接口。服务验证程序集的证书链并确认存在IPackage后,将程序集添加到运行列表中。然后该列表传递给SimpleInjector的"RegisterPackages()“函数。
RegisterPackages()将获取"已验证"程序集列表,并调用每个程序集IPackage接口中的"RegisterServices()“函数。
漏洞利用步骤
- 编写实现SimpleInjector项目中IPackage接口的自定义程序集
- 在IPackage接口的"RegisterServices()“方法中添加恶意逻辑
- 编译程序集并使用SigPirate等工具从有效的Razer程序集中克隆证书链
- 将最终的恶意程序集放入"C:\ProgramData\Razer\Synapse3\Service\bin”
- 重启服务或重新启动主机
利用演示
由于Razer服务是32位的,我们需要将程序集编译为x86架构。编译后,使用SigPirate克隆签名证书:
使用PowerShell中的"Get-AuthenticodeSignature"可以验证证书已应用到通过SigPirate创建的"lol.dll"程序集。
将"lol.dll"放入"C:\ProgramData\Razer\Synapse3\Service\bin"并重启主机后,“Razer Synapse Service.exe”(以SYSTEM权限运行)将从该目录加载"lol.dll”,导致实现的IPackage接口中的"RegisterServices()“方法执行cmd.exe。
修复方案
Razer通过实现名为"Security.WinTrust"的新命名空间来修复此漏洞,该命名空间包含完整性检查功能。服务现在在从Razer目录拉取所有”*.dll"文件后立即调用"WinTrust.VerifyEmbeddedSignature()"。
“WinTrust.VerifyEmbeddedSignature()“函数利用"WinTrust.WinVerifyTrust()“来验证被检查文件具有有效签名(通过WinVerifyTrust())。
如果文件具有有效签名且签名者为Razer,则服务将继续原始代码路径,在加载程序集前检查有效的IPackage接口。通过验证文件的完整性,攻击者无法再从签名的Razer文件中克隆证书,因为新克隆文件的签名将无效。
披露时间线
- 2018年6月5日: 向Razer的HackerOne项目提交漏洞报告
- 2018年6月8日: 在H1线程上发布回应确认报告
- 2018年12月14日: H1项目经理联系调查H1报告
- 2018年12月15日: Razer CEO Min-Liang Tan直接联系要求提供直接邮箱
- 2018年12月16日: 信息安全经理和软件SVP通过邮箱直接联系
- 2018年12月25日: Razer人员联系提供内部构建链接进行修复验证
- 2019年1月10日: 告知构建现已公开可用
- 2019年1月10日: 报告关闭并获得公开披露许可
- 2019年1月21日: 报告发布
参考资料
建议阅读Matt Graeber的白皮书《Subverting Trust in Windows》以了解更多关于信任验证的信息。
-Matt N.