Avira VPN本地权限提升漏洞:通过不安全更新路径实现系统级代码执行

本文详细分析了Avira VPN服务中的本地权限提升漏洞。攻击者可通过利用可写更新目录、绕过文件夹所有权和DACL检查,并利用合法签名的可执行文件加载恶意DLL,最终以SYSTEM权限执行任意代码。

Avira VPN本地权限提升漏洞:通过不安全更新位置

产品版本:Avira VPN
测试操作系统:Windows 10 1709 (x64)
漏洞类型:Avira VPN服务本地权限提升
简要描述:当Phantom VPN服务(Avira.VPNService.exe)启动时,它会检查是否有可用更新。该服务从C:\ProgramData\Avira\VPN\Update执行更新,此目录默认允许低权限用户写入。此外,服务实施的防护检查可被绕过,使得攻击者能在该目录放置有效的Avira可执行文件及恶意DLL,诱使服务执行更新文件,发生DLL劫持,最终以SYSTEM权限执行代码。

漏洞详解

Phantom VPN服务(Avira.VPNService.exe)启动时,首先检查更新,该过程在C:\ProgramData中进行(默认低权限用户可写)。服务通过调用“VPNUpdater.UpdateProduct()”,进而调用“Updater.UpdateToNewPackageIfValid()”来处理更新逻辑:

进入“Updater.UpdateToNewPackageifValid()”后,服务首先通过调用“Updater.CheckForDownloadedUpdatePackage()”检查是否有已下载的更新包。为此,它检查“C:\ProgramData\Avira\VPN\Update\AviraVPNInstaller.exe”是否存在,以及更新文件是否已安装:

服务通过比较更新可执行文件的“ProductVersion”属性与VPN服务本身(Avira.VPNService.exe)的“ProductVersion”属性,判断更新是否已存在。如果更新可执行文件的ProductVersion大于“Avira.VPNService.exe”的ProductVersion,则服务继续安装流程:

验证“C:\ProgramData\Avira\VPN\Update\AviraVPNInstaller.exe”存在且未安装后,服务调用“Updater.IsUpdateFolderAccessRestricted()”。此函数旨在确保“C:\ProgramData\Avira\VPN\Update”被锁定,低权限用户无法写入(以保护更新可执行文件在执行前的安全)。服务首先检查文件夹是否由NT AUTHORITY\SYSTEM、NT AUTHORITY\SERVICE或Administrators(值存储在“AcceptedSIDs”中)拥有:

如果更新文件夹不由这些SID拥有,函数返回,并调用“Updater.RestoreUpdateFolder()”,该函数立即删除“C:\ProgramData\Avira\VPN\Update”,然后使用限制访问上述3个接受SID的DACL重新创建它。如果文件夹所有者是这些接受SID之一,服务则遍历文件夹DACL中的每个条目,确保那3个接受SID也在DACL中(推测是为了确保只有这3个特权用户/组能控制文件夹内容)。

此处问题在于,可以绕过这些检查,在“C:\ProgramData\Avira\Update”中放置恶意更新。首要任务是绕过更新文件夹的“所有者”检查。这可通过将文件系统中另一个由SYSTEM拥有但低权限用户可写的文件夹移动到“C:\ProgramData\Avira\Update”来实现。由于在同一卷上移动文件/文件夹会保留权限集,更新文件夹将具有“SYSTEM”所有者,满足服务检查。

为利用此,我们可以将我们的“AviraVPNInstaller.exe”版本(及依赖项)复制到“C:\ProgramData\Avira\Launcher\LogFiles”,该目录由SYSTEM拥有但低权限用户可写:

完成后,将“C:\ProgramData\Avira\Launcher\Logfiles”移动到“C:\ProgramData\Avira\VPN\Update”:

此时,我们有一个通过“所有者”检查的“C:\ProgramData\Avira\VPN\Update”版本。下一个障碍是通过服务实施的DACL检查,确保3个接受SID存在。这可通过设置更新文件夹的DACL以包含“Administrators”、“SYSTEM”和“SERVICE”来实现:

完成后,更新文件夹将仅可由3个接受SID访问。绕过所有者和DACL检查后,最后障碍是绕过文件完整性检查。在执行更新文件前,服务检查确保其由Avira签名且签名有效(通过调用Updater.IsUpdatePackageAuthentic())。如果“C:\ProgramData\Avira\VPN\Update\AviraVPNInstaller.exe”未由Avira签名或不包含有效数字签名,服务将不执行它。为绕过此,我们需要一个由Avira签名、ProductVersion大于当前安装版本Avira.VPNService.exe的文件。经搜寻,我找到一个名为“CefSharp.BrowserSubprocess.exe”的Avira签名可执行文件,其产品版本为“65.0.0.0”:

由于此可执行文件由Avira签名、具有有效数字证书且产品版本大于当前“Avira.VPNService.exe”版本,它将通过服务实施的所有检查。此可执行文件被重命名为“AviraVPNInstaller.exe”,并在上述文件复制和文件夹移动操作中使用。

此时,我们具备以下条件:

  • 一个有效的Avira签名可执行文件,其ProductVersion大于已安装的Avira.VPNService.exe版本
  • 当此可执行文件启动时,它在当前工作目录中查找“VERSION.dll”
  • 通过绕过文件夹所有者和DACL检查,能够将此重命名可执行文件及恶意VERSION.dll副本放置在C:\ProgramData\Avira\VPN\Update中

VPN服务启动时(通过重启或手动),它将看到“C:\ProgramData\Avira\VPN\Update\AviraVPNInstaller.exe”存在。然后,它将看到“Update”文件夹由“SYSTEM”拥有,且文件夹DACL包含“Administrators”、“SYSTEM”和“SERVICE” SID。接着,它将检查“AviraVPNInstaller.exe”的文件完整性,看到其由Avira签名、数字签名有效且ProductVersion大于已部署的VPN服务。通过所有检查后,服务将以SYSTEM权限执行重命名版本的“AviraVPNInstaller.exe”并加载我们的恶意“VERSION.dll”,导致本地权限提升:

此问题已在最新Avira VPN版本中修复。

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