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号