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
以及更新文件是否已经安装:
确定是否安装主要通过比较更新包和VPN服务的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
或管理员(存储在AcceptedSIDs
中的值):
如果更新文件夹不属于任何SID,函数将调用Updater.RestoreUpdateFolder()
,它会立即删除C:\ProgramData\Avira\VPN\Update
,然后重新创建,并限制访问用户(只允许以上三类用户)。如果文件夹的拥有者是以上三者之一,则服务会遍历所有DACL,确保只有以上三类用户能控制文件夹内容。
不过以上安全检查存在缺陷,我们可轻松绕过,并往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检查,这可以通过设置更新文件夹的DACL来实现,使其包括“Administrators”、“SYSTEM”和“SERVICE”:
一旦完成,更新文件夹只能被3类指定用户所访问。在绕过了“所有者”和“DACL”检查之后,最后一个障碍是绕过文件完整性检查。在执行更新文件之前,服务会检查它是否由Avira所签名且签名是否有效(通过调用Updater.IsUpdatePackageAuthentic()
)。如果C:\ProgramData\Avira\VPN\Update\AviraVPNInstaller.exe
不是由Avira签名或是签名无效,则服务不会执行它。为了避免这种情况,我们需要一个由Avira签名的文件,该文件的ProductVersion
要大于当前Avira.VPNService.exe
的版本。经过一番搜寻,我发现了一个由Avira签名的可执行文件,名字为CefSharp.BrowserSubprocess.exe
,产品版本为65.0.0.0
。
因为这个可执行文件是由Avira签署的,产品版本大于当前的Avira.VPNService.exe
,所以它将通过服务的所有安全检查。当然你需要将这个可执行文件重命名为AviraVPNInstaller.exe
,并和恶意的VERSION.dll
一起,使用一系列上述所提及的绕过操作把它们移动到更新文件夹中。
当VPN服务启动,它将发现C:\ProgramData\Avira\VPN\Update\AviraVPNInstaller.exe
文件存在,并激活一系列检查。它将看到“更新”文件夹属于“SYSTEM”,而DACL包含“Administrators”、“SYSTEM”和“SERVICE”的SID。接着它将检查AviraVPNInstaller.exe
文件的完整性,看看它是否由Avira签署的,数字签名是否有效的,产品版本是否比现有VPN服务版本更大。通过以上所有这些检查后,服务将以“STSTEM”身份执行AviraVPNInstaller.exe
,最终导致本地权限提升:
该漏洞已在最新版本的Avira VPN中得到修复。
本文由白帽汇整理并翻译,不代表白帽汇任何观点和立场
来源:https://enigma0x3.net/2020/01/15/avira-vpn-local-privilege-escalation-via-insecure-update-location/
最新评论