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()。此函数处理VPN软件更新的所有逻辑:
进入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中修复。