Windows PrintDemon提权缝隙分析
颁布功夫 2020-05-211.缝隙概述
微软在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/


京公网安备11010802024551号