Avira Optimizer 本地权限提升漏洞:深入剖析命名管道安全缺陷

本文详细分析了Avira Optimizer软件中一个本地权限提升漏洞。该漏洞源于一个具有NULL DACL(空自由访问控制列表)的命名管道,允许低权限用户通过进程注入和证书克隆等技术,向以SYSTEM权限运行的服务发送命令,从而以系统最高权限执行任意代码。

Avira Optimizer 本地权限提升漏洞

作者:enigma0x3 发布日期:2019年8月29日

版本: Avira Optimizer < 1.2.0.367 测试操作系统: Windows 10 1803 (x64) 漏洞: 通过不安全的命名管道实现Avira Optimizer本地权限提升

漏洞概述

用户安装最新的Avira antivirus时,它会附带几个不同的组件,其中之一就是Avira Optimizer。简而言之,“Avira.OptimizerHost.exe”以“NT AUTHORITY\SYSTEM”权限运行,并接收通过“AviraOptimizerHost”命名管道(\\.\pipe\AviraOptimizerHost)发出的命令。该服务对调用客户端的验证不当,同时对启动的可执行文件检查无效,这使得恶意代码能够向“Avira.OptimizerHost.exe”发出进程创建调用,从而导致本地权限提升。

识别与利用

在评估软件的权限提升漏洞时,找到一个起点通常让人不知所措,因为存在许多不同的原语和漏洞类别。我的方法通常从基础开始,然后逐步增加复杂度。这个过程通常包括运行PowerUp这样的工具,它可以识别各种简单(但常见)的错误配置。

如果没有发现有趣的结果,下一步通常是寻找逻辑漏洞。这些漏洞可能更难自动识别,需要更多手动探查。我的工作流程通常涉及分析全局可写目录、可写的注册表位置、通过NTObjectManager暴露的命名管道和RPC接口。在分析现有的命名管道时,发现一些Avira进程创建了一个具有NULL DACL的命名管道。这实际上意味着任何请求访问的用户都被授予了完全控制权限:

虽然这很有趣,但如果这个管道没有被某个特权Avira进程以某种方式使用,那么它就不是极其有用。检查该管道的使用进程ID显示,一个SYSTEM权限的Avira进程正在使用它:

下一步是弄清楚“Avira.OptimizerHost.exe”实际上在用这个命名管道做什么。这是一个值得深究的“兔子洞”,因为一个特权进程正在与一个低权限用户可以控制的资源进行交互。由于“Avira.OptimizerHost.exe”持有该管道的句柄,那么该进程很可能正在接收通过管道传递的某种数据。为了验证这一点,下一步是在IDA中打开“Avira.OptimizerHost.exe”。经过一番探查,很明显,该服务会接收任何连接到“AviraOptimizerHost”命名管道的客户端,并验证其是否为有效的Avira文件。

为了滥用此命名管道,我们需要绕过此检查,以便能成功通过命名管道向服务发送数据。服务通过GetNamedPipeClientProcessID()获取连接的客户端,然后通过QueryFullProcessImageNameW()拉取完整的镜像路径来进行检查。

一旦获得路径,服务会提取调用客户端的证书,并确保其由Avira签名且未被篡改。此处的思路是确保只有有效的Avira进程才能向服务发出命令。为了绕过此限制,我们可以简单地将代码注入到一个正在运行的Avira进程中(或者可能只是克隆一个现有的证书)。

下一步是弄清楚我们可以通过命名管道向服务发出什么指令。在这种情况下,我通常喜欢调查任何潜在的合法客户端,看看它们在正常操作期间会做什么。由于这个管道是Avira优化器的一部分,我开始浏览已安装的Avira组件。经过一些死胡同后,Avira的“System Speedup”应用浮出水面,因为优化和加速是同义词。查看了Avira的“System Speedup”文件夹后,我偶然发现了Avira System Speedup库。然后,我将System Speedup文件夹中的所有文件加载到DnSpy中,并开始搜索命名管道引用。这引导我找到了“Avira.SystemSpeedup.Core.Client.Services.dll”,特别是其中的“StartServiceHost()”方法。

正如所料,这是用于连接“AviraOptimizerHost”命名管道的代码。在该函数内部,它会继续调用Avira.Optimizer.Common.Tools.OptimizerHostClient类中的OptimizerHostCommandsClient.Connect(),这听起来非常有趣。查看此函数,它只是调用WaitNamedPipe()等待管道就绪。一旦就绪,便使用CreateFile获取命名管道的句柄。

回顾“StartServiceHost”方法,它会实例化Avira.Optimizer.Common.Tools.OptimizerHostClient类的一个实例,连接到“AviraOptimizerHost”命名管道,然后继续调用一个名为“StartParentProcess()”的有趣方法。

查看那个被实例化的类,有许多有趣的方法。例如:StartProcess、StartParentProcess、StopProcess、AddTask和RemoveTask。这些方法接受各种参数,然后在将任务转换为JSON后继续调用“SendMessage”:

“SendMessage()”方法接收命令的JSON,并将其发送到“AviraOptimizerHost”命名管道,由SYSTEM进程“Avira.OptimizerHost.exe”接收:

查看“Avira.OptimizerHost.exe”,我们可以看到服务读取JSON并解析出参数的位置:

在这种情况下,如果我们通过命名管道发送“StartProcess()”方法,服务将从通过命名管道发送的JSON blob中提取“procid”、“exec”(可执行路径)、“args”(参数)等。然后,它遵循与验证客户端命名管道相同的逻辑,即从“exec”参数中获取可执行路径,并检查文件的证书以确保其属于Avira。该服务依赖于主题和证书序列号(这两者都可以被攻击者控制),因此可以使用SigPirate等工具从有效的Avira可执行文件克隆证书,并将其应用到自定义负载上。

为了利用此漏洞,我们需要完成几件事:

  1. 准备我们的负载。在本例中,它是一个名为Avira.SystemSpeedup.RealTime.Client.exe的.NET可执行文件,用于启动cmd.exe
  2. 从有效的Avira文件克隆证书,并将其应用到我们的负载。
  3. 编写代码,注入到有效的Avira进程中,加载Avira.Optimizer.Common.Tools.dll,并实例化OptimizerHostClient类。
  4. 使用暴露的方法连接到“AviraOptimizerHost”命名管道,并向服务发出我们的命令。

关于负载创建和证书克隆,我将留给读者作为练习。为了连接到命名管道并发送命令,我们可以通过添加对Avira.Optimizer.Common.Tools.dll的引用并导入Avira.Optimizer.Common.Tools.OptimizerHostClient命名空间来重用现有的Avira库。完成后,我们只需创建OptimizerHostCommandsClient类的一个实例,并调用任何有趣的方法,例如“StartProcess”。

为了实现LPE(本地权限提升),我们需要做的就是将此程序集注入到Avira进程中并调用我们的入口点。同样,这留给读者作为练习……但有各种项目使这个过程变得简单(例如https://github.com/ChadSki/SharpNeedle)。

在注入到Avira进程并执行上述C#代码后,当程序集连接到“AviraOptimizerHost”命名管道并发送带有“exec”参数(设置为具有克隆Avira证书的负载,本例中为名为Avira.SystemSpeedup.RealTime.Client.exe的负载)的“StartProcess()”方法时,cmd.exe将以SYSTEM权限启动。

此漏洞已在Avira Optimizer 1.2.0.367版本中修复。浏览修复方案后,Avira现在使用WinVerifyTrust()和明显的路径白名单来确保启动的进程不受影响。

披露时间线

我想花点时间赞扬一下Avira及其开发团队。该团队保持持续沟通,并以极快的速度修复问题。在本报告的案例中,在初次报告后大约30天内,就开发并公开发布了修复程序。与认真对待漏洞报告并遵循社区设定的90天修复期望的供应商合作令人耳目一新。

正如SpecterOps致力于透明度一样,我们也承认攻击者在新技术公开后采用新攻击技术的速度。这就是为什么在公开新的漏洞或攻击技术之前,我们会定期通知相应的供应商,提供充足的缓解时间,并通知选定的、可信赖的供应商,以确保能够尽快向其客户提供检测。

  • 2019年7月23日:漏洞发送给Avira安全团队
  • 2019年7月24日:Avira确认收到报告,指出PoC存在一些编译问题
  • 2019年7月26日:Avira使用提供的PoC复现了该漏洞
  • 2019年8月6日:Avira指出开发人员已修复该问题,询问我是否愿意测试修复
  • 2019年8月6日:回复Avira,提供了针对补丁的绕过方法、更新的PoC和细节
  • 2019年8月16日:Avira回复指出开发人员实施了新的修复,并询问我是否愿意测试
  • 2019年8月16日:测试了新修复。告知Avira修复似乎足够有效
  • 2019年8月27日:修复程序推送上线
  • 2019年8月29日:细节公开
comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计