Avira VPN本地权限提升漏洞分析:不安全的更新路径
产品版本:Avira VPN
测试操作系统:Windows 10 1709 (x64)
漏洞类型:Avira VPN服务本地权限提升
简要描述:当Phantom VPN服务(Avira.VPNService.exe)启动时,它会检查是否有可用更新。该服务从C:\ProgramData\Avira\VPN\Update执行更新,而此目录默认允许低权限用户写入。此外,服务虽然实施了防止利用的检查,但这些检查可以被绕过。这使得攻击者可以在C:\ProgramData\Avira\VPN\Update目录中放置一个有效的Avira可执行文件和一个恶意DLL,并诱使服务执行更新文件。这将导致DLL劫持,最终以SYSTEM权限执行代码。
漏洞原理详解
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目录,然后使用一个限制访问权限的DACL重新创建它,该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中修复。