0x00 绪论
Avast SecureLine VPN允许用户通过安全的Avast VPN服务器在加密信道上连接互联网,保护用户的网络活动免遭监听。Avast SecureLine VPN增强了用户上网的安全性和隐私性,在连接到公共网络或者不安全的无线网络时很有用。
Avast SecureLine VPN服务默认在C:\ProgramData\AVAST Software\SecureLine\log下创建日志文件,文件是由Avast SecureLine服务的特权(SYSTEM)进程所创建、访问和操作的。日志和所在的文件夹都有宽松的访问权限,允许非特权用户创建/删除文件或更改属性。Avast SecureLine VPN 5.5.522.0版受影响,更低版本可能也受影响,但没测试过。漏洞在5.6.4982.470版修复。
0x01 漏洞分析
以高特权(如SYSTEM)运行且可对用户文件进行无限制操作的进程可能导致安全问题,这些特权进程可能被滥用从而执行不安全操作。多数特权程序会操作一些位于用户可访问位置的文件,根据这篇文章所述,以下是一些有意思的文件位置:
- 用户专属的文件和文件夹,包括AppData和Temp目录,如果安装了杀毒软件的话,一些特权进程可能会使用这些文件和目录
- 公共用户的文件和目录
- 创建在C:\且带有默认ACL的目录:分区根目录下创建的文件夹默认拥有宽松的ACL,允许用户写入
- C:\ProgramData下带有默认ACL的子目录:默认情况下,用户可以创建文件和目录,但不能修改已有项目。这个目录常常是攻击时首先考虑的。
- C:\Windows\Temp的子目录:默认情况下,用户可以创建文件和目录,但不能修改已有项目,对其他用户所属的项目,也不能读取文件/访问文件夹。
文件和目录的权限可以用多种方法查看,比如Powershell的Get-Acl或者属性的安全选项卡。日志文件由SYSTEM进程创建,且对用户可写。通过滥用日志文件的创建,可以实现任意文件创建:非特权用户可以用指向任意文件的符号链接替换这些日志文件。当日志生成时,有特权的AVAST SecureLine VPN进程将会创建日志文件并设置其访问权限,这就给了我们写权限。AVAST SecureLine用的权限如下图所示:
可以用Process Monitor工具观察文件操作。一旦发现对用户可控的文件/目录的操作,我们就需要思考如何利用这些操作。James Forshaw提出了若干滥用Windows文件系统和路径解析功能的方法,还发布了一个符号链接测试工具集,给研究者做PoC用。有很多方法可以用来利用此类漏洞,包括:
- NTFS目录联接
- 硬链接
- 对象管理器符号链接
- 机会锁
低权限用户可以使用三种符号链接:
- 对象管理器符号链接
- 注册表键符号链接
- NTFS挂载点
我用的是对象管理器符号链接来利用漏洞。@clavoillotte在他博客中提到,非特权用户可以在Windows对象管理器中创建符号链接,对象管理器管理进程、section、文件之类的对象。对象管理器用符号链接来把驱动器字符和命名管道与相应的设备关联起来。用户可以在可写的对象目录中创建对象符号链接,比如在\RPC CONTROL\中创建,这些符号链接可以指向任意路径——包括文件系统上的路径——不管这个路径是否实际存在。对象符号链接和NTFS目录联接结合起来十分有意思,非特权用户可以创建挂载点,使其解析到\RPC CONTROL\目录,而在这个目录中又有一个对象管理器符号链接。例如:
0x02 漏洞利用
非特权用户可以执行以下操作来利用漏洞:
- 删除C:\ProgramData\AVAST Software\SecureLine\log中所有文件
- 创建伪符号链接C:\ProgramData\AVAST Software\SecureLine\log\vpn_engine.log,指向C:\Windows\System32\pwned.dll
- 重启SecureLine服务,或者等待电脑重启,然后服务就会在C:\Windows\System32目录下创建任意文件
这导致任意内容文件创建漏洞,我们可以用符号链接来把一个特定日志文件重定向到任意文件,改文件名由攻击者选择,比如:
漏洞利用步骤:
删除日志目录下所有文件,用Powershell命令删除文件:
Remove-Item -Force "C:\ProgramData\AVAST Software\SecureLine\log\*"
用James Forshaw的CreateSymlink工具创建符号链接,所用命令:
CreateSymlink.exe "C:\ProgramData\AVAST Software\SecureLine\log\vpn_engine.log" C:\Windows\System32\pwned.dll
成功利用漏洞,在目标文件夹中创建了文件。
我写了PoC,代码在这里。要和James Forshaw的符号链接工具集一起编译。PoC需要管理员权限才能运行,因为启动/停止服务功能需要管理员权限,如何避免这点就留给读者实现吧。
0x03 漏洞披露时间线
漏洞是我飞韩国参加POC会议前几天发现的,我只花了几小时找漏洞和利用。2019年11月就已经报告了这个漏洞,遵守了AVAST的标准披露程序,时间线如下:
- 2019-11-02——漏洞报告给AVAST安全团队(邮件)
- 2019-11-05——厂商回复将调查漏洞
- 2020-01-23——跟进漏洞。厂商确认漏洞并告知内部正在发生变动,所以修补可能要花费一些时间
- 2020-03-02——再次跟进漏洞。厂商首要任务是杀毒软件,其次才是其他产品
- 2020-05-18——跟进漏洞。厂商之前通知VPN产品的补丁会在五月底发布,但进展不顺利,所以推迟到六月
- 2020-06-26——再次跟进漏洞。厂商告知周一将发布修补后的版本(即2020年6月29日)
- 2020-07-14——确认5.6.4982.470版已部署补丁,联系厂商询问CVE与发表博客文章有关事宜。厂商回复不分配CVE,可自己申请。因为补丁已部署,所以厂商允许发表文章描述漏洞。修复后的版本在这里。
- 2020-07-22——申请CVE,等待中