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.缝隙验证


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


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


宝运莱·(中国区)最新官方网站


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


宝运莱·(中国区)最新官方网站


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


宝运莱·(中国区)最新官方网站


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


宝运莱·(中国区)最新官方网站

宝运莱·(中国区)最新官方网站


3.缝隙道理


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


打印机工作机造


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


■ 打印机驱动

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


宝运莱·(中国区)最新官方网站


■ 打印机端口


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

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


宝运莱·(中国区)最新官方网站


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


宝运莱·(中国区)最新官方网站


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


宝运莱·(中国区)最新官方网站


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

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


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


宝运莱·(中国区)最新官方网站


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


宝运莱·(中国区)最新官方网站

宝运莱·(中国区)最新官方网站


脱机打印的机造


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


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


宝运莱·(中国区)最新官方网站


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


宝运莱·(中国区)最新官方网站


打印提权的道理


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


宝运莱·(中国区)最新官方网站


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


宝运莱·(中国区)最新官方网站

宝运莱·(中国区)最新官方网站

宝运莱·(中国区)最新官方网站


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


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


宝运莱·(中国区)最新官方网站


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


宝运莱·(中国区)最新官方网站


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


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


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


宝运莱·(中国区)最新官方网站


缝隙补丁的分析


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


宝运莱·(中国区)最新官方网站



凭据上文的分析可知,尺度用户是无法在系统目录中创建文件的,把端口设置为系统目录下的文件会导致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/