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/