Avira VPN本地权限提升漏洞:通过不安全更新路径实现系统提权
产品版本:Avira VPN
测试操作系统:Windows 10 1709 (x64)
漏洞类型:Avira VPN服务本地权限提升
简要描述:当Phantom VPN服务(Avira.VPNService.exe)启动时,它会检查是否有可用更新。该服务从C:\ProgramData\Avira\VPN\Update执行更新,此目录默认允许低权限用户写入。此外,服务实施的防护检查可被绕过,使得攻击者能够在更新目录中放置有效的Avira可执行文件及恶意DLL,导致服务以SYSTEM权限执行更新文件,引发DLL劫持并实现代码执行。
漏洞详解
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目录,然后重新创建它,并设置DACL以限制仅允许上述3个SID访问。如果目录的所有者是这些接受的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中修复。