Windows PrintDemon提权缝隙分析

颁布功夫 2020-05-21

1.缝隙概述


微软在5月12日的安全更新中公开了一个Windows本地提取缝隙(CVE-2020-1048),,,,,,,该缝隙的描述为:

“Windows Print Spooler服务不恰本地允许肆意的文件系统写入,,,,,,,存在特权提升缝隙。。 。。。。。 。攻击者利用此缝隙可能用系统特权运行肆意代码,,,,,,,从而实现:法式的装置、查看、更改或数据删除,,,,,,,以及创建拥有齐全权限的帐户。。 。。。。。 。要利用此缝隙,,,,,,,攻击者必须登录到受影响的系统并运行特定剧本或利用法式”。。 。。。。。 。


该缝隙由安全钻研人员Alex Ionescu和Yarden Shafir发现,,,,,,,并被定名为PrintDemon。。 。。。。。 。Print Spooler是系统自带的打印后盾处置服务,,,,,,,治理所有本地和网络打印队列,,,,,,,节造着所有打印工作。。 。。。。。 。Print Spooler在Windows系统中已存在多年,,,,,,,从微软颁布的补丁页面可知该缝隙影响Windows7至Windows10 1909的险些所有版本。。 。。。。。 。


2.缝隙验证


8827太阳集团ADLab安全钻研员对该缝隙进行了分析和验证,,,,,,,实现了在低权限的尺度用户下写入系统目录,,,,,,,测试操作系统为Windows 10 x64企业版2016(持久服务版),,,,,,,测试步骤如下:


(1)在测试系统中创建一个尺度用户test,,,,,,,并使用该尺度用户登录系统。。 。。。。。 。查看其所属用户组,,,,,,,确认其不是治理员用户组。。 。。。。。 。


8827太阳集团(Macau)股份有限公司-Official website


(2)在test账户下,,,,,,,尝试在系统目录下创建文件夹或者写入文件,,,,,,,均失败。。 。。。。。 。


8827太阳集团(Macau)股份有限公司-Official website


(3)而后执行如下PowerShell号令,,,,,,,以期在系统目录下创建文件myport.txt。。 。。。。。 。


8827太阳集团(Macau)股份有限公司-Official website


(4)沉启测试系统并登录test用户,,,,,,,能够看到在系统目录下已天生了myport.txt文件,,,,,,,查看内容的确蕴含了测试字符串。。 。。。。。 。该了局批注:低权限的 test用户突破了无法批改系统资源的安全限度。。 。。。。。 。


8827太阳集团(Macau)股份有限公司-Official website

8827太阳集团(Macau)股份有限公司-Official website


3.缝隙道理


该缝隙涉及到Windows打印机的工作机造,,,,,,,为更好的理解缝隙成因,,,,,,,首先单一介绍打印机基础知识,,,,,,,而后再分析缝隙成因。。 。。。。。 。


打印机工作机造


Windows系统的打印机有两个主题组件:打印机驱动和打印机端口。。 。。。。。 。


■ 打印机驱动

在增长一个打印机时,,,,,,,必要装置打印机驱动。。 。。。。。 。在MSDN文档描述中,,,,,,,早期系统要求只有具备SeLoadDriverPrivilege权限的用户能力装置打印驱动,,,,,,,但为了便于尺度用户装置驱动,,,,,,,从Windows Vista起头,,,,,,,只有打印机驱动是已经存在的可立即便用的驱动,,,,,,,就不必要任何特权即可装置。。 。。。。。 。例如,,,,,,,通过一条PowerShell号令即可装置“Generic / Text-Only”驱动。。 。。。。。 。


8827太阳集团(Macau)股份有限公司-Official website


■ 打印机端口


在增长一个打印机时,,,,,,,必要设置打印机的端口。。 。。。。。 。Windows支持多种类型的打印机端口:LPT1端口、USB端口、网络端口和文件等。。 。。。。。 。若是设置端口为文件,,,,,,,则意味着打印机将数据打印到指定文件。。 。。。。。 。例如,,,,,,,通过一条PowerShell号令即可增长一个输出到指定文件的打印端口:

Add-PrinterPort -Name "C:\windows\Temp\myport.txt"


8827太阳集团(Macau)股份有限公司-Official website


现实上,,,,,,,该操作是在注册表中增长一个REG_SZ类型的值。。 。。。。。 。


8827太阳集团(Macau)股份有限公司-Official website


筹备好驱动和端口后,,,,,,,通过一条PowerShell号令即可创建一个打印机。。 。。。。。 。


8827太阳集团(Macau)股份有限公司-Official website


打印机创建结束后,,,,,,,通过一条PowerShell号令即可打印数据到指定端口:

"PrintTest!" | Out-Printer -Name "PrintTest"


由于PrintTest打印机的端口是文件c:\windows\Temp\myport.txt,,,,,,,因而打印号令执行后,,,,,,,数据“Print Test!”将会被写入(即打印!� 。。。。。 。┑礁梦募!� 。。。。。 。


8827太阳集团(Macau)股份有限公司-Official website


针对端口是文件的打印过程,,,,,,,spooler打印服务法式以impersonating方式来模拟当前用户的特权进行文件写入。。 。。。。。 。因而,,,,,,,若是端口文件在受�;;;;;;;;さ南低衬柯迹ɡ鏑:\Windows\system32),,,,,,, 则非治理员下的PowerShell打印作业就会失败。。 。。。。。 。


8827太阳集团(Macau)股份有限公司-Official website

8827太阳集团(Macau)股份有限公司-Official website


脱机打印的机造


在Windows系统上,,,,,,,若是系统配置启用了假脱机服务,,,,,,,则所有的打印工作都不是立即执杏祝。 。。。。。 。相反,,,,,,,系统使用Print Spooler来治理脱机打印工作。。 。。。。。 。具体来说,,,,,,,当用户挪用打印操作后,,,,,,,系统将打印作业存储在特定的假脱机文件夹钟祝。 。。。。。 。


默认情况下,,,,,,,Windows天生的脱机打印工作文件为.SPL文件,,,,,,,此表Windows还会创建后缀名为.SHD的shadow文件并同SPL文件做关联。。 。。。。。 。创建shadow文件的用处是:在打印法式出现问题或者打印工作被挂起后,,,,,,,PrintSpooler依然能够通过SHD文件复原打印工作。。 。。。。。 。


8827太阳集团(Macau)股份有限公司-Official website


在Windows系统沉启或Print Spooler服务沉启之后,,,,,,,.SHD和.SPL文件会被沉新读取以复原打印工作。。 。。。。。 。


8827太阳集团(Macau)股份有限公司-Official website


打印提权的道理


脱机打印机造使得Windows系统在沉启后会复原可能存在的未执行打印工作。。 。。。。。 。但是,,,,,,,沉启后的Printer Spooler服务法式直接使用了System权限来复原未执行的打印作业。。 。。。。。 。对于打印机端口为文件的打印工作,,,,,,,打印文件的写入也就在System权限下被执杏祝。 。。。。。 。因而,,,,,,,系统沉启使得脱机打印工作具备了System权限的肆意文件写入能力。。 。。。。。 。


8827太阳集团(Macau)股份有限公司-Official website


打印机的设置除PowerShell剧本表,,,,,,,通过系统节造面板也能设置。。 。。。。。 。具体来说,,,,,,,通过“设备和打印机”能增长打印机并设置端口。。 。。。。。 。


8827太阳集团(Macau)股份有限公司-Official website

8827太阳集团(Macau)股份有限公司-Official website

8827太阳集团(Macau)股份有限公司-Official website


但若是设置打印端口名为“C:\Windows\system32\myport.txt”,,,,,,,则会失败。。 。。。。。 。


为何设置同样文件名的打印机端口,,,,,,,通过节造面板会失败,,,,,,,而通过PowerShell 号令则能够成功呢???? ???通过度析这两种方式对spooler法式执行流程的影响,,,,,,,发现spooler法式对通过PowerShell号令行增长打印机端口方式不足安全校验。。 。。。。。 。


8827太阳集团(Macau)股份有限公司-Official website


具体来讲,,,,,,,针对PowerShell号令增长打印机端口,,,,,,,spooler法式直接设置了相应的打印机端口注册表项;;;;;;;;针对节造面板增长打印机端口,,,,,,,spooler法式会首先尝试创建该端口文件,,,,,,,创建失败后就不会再设置相应的注册表项。。 。。。。。 。


8827太阳集团(Macau)股份有限公司-Official website


进一步分析有关API发现,,,,,,,Windows系统提供了两种增长打印机端口的API,,,,,,,别离是AddPort函数和XcvData函数。。 。。。。。 。其中MSDN对AddPort的描述:


“AddPort函数浏览网络以查找现有端口,,,,,,,并弹出对话框供用户选择。。 。。。。。 。AddPort函数应该通过挪用EnumPorts来验证用户输入的端口名称,,,,,,,以确保不存在沉复的名称。。 。。。。。 。AddPort函数的挪用方必须拥有接见端口所衔接的服务器的SERVER_ACCESS_ADMINISTER权限。。 。。。。。 。要增长端口而不显示对话框,,,,,,,可挪用XcvData函数而不是AddPort ”。。 。。。。。 。


通过节造面板增长打印机在底层是挪用了AddPort函数,,,,,,,该函数会触发spooler法式对端口的合法性校验。。 。。。。。 。通过PowerShell号令增长打印机在底层则是直接挪用XcvData函数,,,,,,,该函数不会触发spooler法式对用户增长的端口进行安全校验。。 。。。。。 。因而,,,,,,,测试法式AddPort.exe通过该函数在尺度用户权限下也能设置打印机端口为受�;;;;;;;;つ柯贾械奈募!� 。。。。。 。


8827太阳集团(Macau)股份有限公司-Official website


缝隙补丁的分析


分析缝隙建复后的版本发现,,,,,,,微软在关键函数LcmCreatePortEntry(最终创建打印机端口的函数)中增长了相应的端口合法性查抄代码。。 。。。。。 。下图是关键函数LcmCreatePortEntry在建复前和建复后的Call Graph对比,,,,,,,能够看出:补丁的主题是通过函数PortIsValid对端口进行合法性查抄。。 。。。。。 。


8827太阳集团(Macau)股份有限公司-Official website



凭据上文的分析可知,,,,,,,尺度用户是无法在系统目录中创建文件的,,,,,,,把端口设置为系统目录下的文件会导致PortIsValid检测不到指标文件,,,,,,,从而判定要设置的端口长短法的。。 。。。。。 。因而,,,,,,,在补丁建复后,,,,,,,尺度用户增长打印端口为系统目录下文件的打印机就会始终失败,,,,,,,从而预防了系统沉启时复原恶意的打印服务。。 。。。。。 。


4.建复建议


由于该缝隙能影响多多的Windows系统版本,,,,,,,并且能够在尺度用户下提议缝隙攻击,,,,,,,建议受影响的用户实时进行系统更新或装置缝隙补丁。。 。。。。。 。


此表,,,,,,,微软的安全更新只是对打印端口API进行了更严格的校验。。 。。。。。 。但是,,,,,,,若是恶意文件端口在缝隙建复前已经创建,,,,,,,则缝隙攻击现实已经生效,,,,,,,此时进行系统更新依然是不安全的。。 。。。。。 。建议用户先使用PowerShell号令Get-PrinterPort来查抄系统中是否存在可疑的打印机端口,,,,,,,在删除可疑端口后再执行系统更新。。 。。。。。 。


参考链接:

[1]https://portal.msrc.microsoft.com/en-US/security-guidance/advisory/CVE-2020-1048

[2]https://docs.microsoft.com/en-us/windows/win32/printdocs/addport

[3]https://docs.microsoft.com/en-us/previous-versions/ff564255(v%3dvs.85)

[4]https://windows-internals.com/printdemon-cve-2020-1048/