本文介绍如何利用该漏洞来加载任意未签名的DLL到SYSTEM权限运行的服务中,来实现权限提升和驻留。
PC-Doctor
允许SupportAssist访问敏感低级硬件的组件是由PC-Doctor公司开发的。该公司主要开发硬件诊断软件。下面主要介绍PC-Doctor公司开发的组件来描述漏洞,然后说明如何利用该漏洞来访问物理内存这样的低级硬件。
Dell SupportAssist
Dell SupportAssist是大多数Dell电脑预装的软件。该软件可以检查系统硬件和软件的健康。健康检查需要高权限级别的权限。为了以高级权限运行动作,签名的驱动会安装以及多个以SYSTEM运行的服务。
漏洞分析
研究人员首先关注的是Dell Hardware Support,因为该服务是一个非常重要的服务,而且有对硬件访问的高级权限,因为有能力可以进行权限提升。Dell Hardware Support服务启动后,会执行DSAPI.exe和 pcdrwi.exe,都是以SYSTEM权限运行的:
然后,该服务会执行多个PC-Doctor可执行文件来收集关于操作系统和计算机硬件的信息。这些可执行文件其实都是普通的PE文件,但是扩展名为p5x。
这些可执行文件都会加载DLL库,可以从不同的源来收集信息。一旦这些库被加载后,研究人员在ProcMon中发现:
从图中可以看出,3个p5x可执行文件尝试在c:\python27目录中找出以下DLL文件:
· LenovoInfo.dll
· AlienFX.dll
· atiadlxx.dll
· atiadlxy.dll
DLL劫持漏洞
在研究人员的虚拟机中,c:\python27有一个允许所有认证用户在ACL上写文件的ACL。这会使权限提升变得简单,并允许普通用户写丢失的DLL文件,并以SYSTEM
权限进行代码执行。需要说明的是,管理级用户或进程必须:
(1) 设置目录ACL来允许对非管理员用户账户的访问
(2) 修改系统PATH
变量来包含该目录为了测试该权限提升漏洞,研究人员编译了一个未签名的DLL将以下内容写入txt文件的文件名中:
· 执行的用户名
· DLL文件名
研究人员在重命名以下DLL时,该DLL是以SYSTEM权限加载和执行的
· LenovoInfo.dll
· atiadlxx.dll
漏洞根源分析
p5x模块使用了一个名为Common.dll的工具库,提供了包括加载dll文件选项这样的功能:
从上图可以看出,该漏洞的两个根源在于:
· 缺乏安全的DLL加载。代码使用的是LoadLibraryW,而不是LoadLibraryExW,这样就允许未授权的用户来用特定的flag来定义搜索顺序,比如LOAD_LIBRARY_SEARCH_DLL_LOAD_DIR。这样反过来会在自己的文件夹中搜索DLL,避免在PATH变量中搜索DLL。
· 没有对该二进制文件进行数字证书的验证。该程序并不会验证加载的DLL是否是签名的。因此,可以加载任意未签名的DLL文件。
漏洞利用
PC-Doctor签名的驱动
SupportAssist使用的是PC-Doctor签名的驱动(pcdsrvc_x64.pkms)来访问低级的内存和硬件。
PoC – 读取物理内存
在加载到PC-Doctor的库中,p5x可执行文件是SysSpace.dll。该库提供一个强大的对物理内存读取的封装函数—— PhysicalMemory::read。
该函数打开一个到驱动的handle,并发送相关的IOCTL来启动。下一步是找出发送给该函数所需的参数。研究人员搜索了导入PhysicalMemory::read函数的DLL并使用它。
forfiles /M *.dll /C "cmd /c %userprofile%\amd64\dumpbin.exe /IMPORTS @file | findstr [email protected] && echo @file"153 [email protected]@[email protected]@@[email protected]@@Z"NVMeInfo.dll"153 [email protected]@[email protected]@@[email protected]@@Z"Quip.dll"
用IDA打开Quip.dll,提取调用该函数的实现:
然后加载SysSpace.dll,定义PhysicalMemory的constructor,并调用PhysicalMemory::read函数。
下面从物理内存中读取任意地址。
首先,用WinDbg Kernel Debugger检查物理地址的内容:
然后利用该漏洞来加载未签名的DLL,并将结果写入txt文件:
从中可以看出,可以将任意物理内存地址的内容写入。
潜在恶意使用和影响
SupportAssist是大多数运行Windows系统的Dell设备预装的软件。也就是说,该漏洞如果不修复,将影响数百万Dell PC用户。下面介绍攻击者可以利用该漏洞的2种潜在方式。
签名的执行和白名单绕过
该漏洞给予攻击者被加载和执行恶意payload的能力。该能力可能会被攻击者滥用,比如进行执行和绕过,具体来说有应用白名单绕过和签名验证绕过。
DSE绕过
为了加载kernel模式驱动带Windows 10中,必须要经过微软认证的厂商的数字签名。为了强制执行,微软使用了一种名为Driver Signature Enforcement (DSE)的机制,如果未签名的kernel-mode驱动被加载,操作系统就会奔溃。
攻击者可以获取pcdsrvc_x64.pkms驱动提供的R/W原语,pcdsrvc_x64.pkms驱动是已经加载的kernel-mode驱动。事实上,攻击者可能并不需要加载驱动,因为签名加载的驱动已经给了他们一些控制权限。
为了访问和操作R/W原语,攻击者可以:
· 利用该漏洞来获取权限提升,并以SYSTEM权限运行;
· 使用签名和加载的pcdsrvc_x64.pkms驱动;
· 发送相关的IOCTLs来直接读写物理内存;
· 然后攻击者就有了kernel-mode驱动环境下的全部R/W原语。