Windows PrintNightmare 漏洞 (CVE-2021-34527) 和补丁分析
字数 2407 2025-08-09 22:00:40
Windows PrintNightmare 漏洞 (CVE-2021-34527) 深度分析与防护指南
一、漏洞概述
PrintNightmare (CVE-2021-34527) 是 Windows 打印服务中的一个严重远程代码执行漏洞,允许低权限用户加载恶意 DLL 实现权限提升。该漏洞于 2021 年 6 月 29 日作为 0day 被披露,微软于 7 月 6 日发布紧急补丁。
二、相关漏洞背景
CVE-2021-1675 漏洞分析
-
漏洞位置:
AddPrinterDriverEx函数 -
关键参数:第三个参数 flag 包含未公开的值
APD_INSTALL_WARNED_DRIVER = 0x00008000 -
绕过机制:
- 通过
bittest检查 flag 的第 0xf 位 - 当该位为 1 时,
v12值为 0,绕过权限检查 - 成功调用
InternalAddPrinterDriverEx
- 通过
-
补丁修复:
- 增加了三个关键检查函数:
YIsElevatedYIsElevationRequeredRunningAsLUA
- 当
v12==0、v13==1且v9==1时,清除 flag 中的 0x8000 位
- 增加了三个关键检查函数:
三、PrintNightmare 漏洞分析
1. 漏洞利用原理
PrintNightmare 是对 CVE-2021-1675 补丁的绕过,主要利用 RpcAsyncAddPrinterDriver API:
- 该 API 同样可以设置
APD_INSTALL_WARNED_DRIVERflag - 未实施与
AddPrinterDriverEx相同的权限检查 - 完美绕过
bittest检查,实现恶意 DLL 加载
2. 利用流程详解
-
初始调用:
spoolsv!TRemoteWinspool::RpcAsyncAddPrinterDriver调用
TFunction4设置回调 -
回调设置:
TFunction4设置对YAddPrinterDriverEx的调用v7偏移 128 处为YAddPrinterDriverEx
-
异步调用:
- 通过
a1偏移 128 处的函数指针调用YAddPrinterDriverEx APD_INSTALL_WARNED_DRIVERflag 保留,绕过权限检查
- 通过
-
DLL 加载:
- 成功加载攻击者指定的恶意 DLL
- 实现任意代码执行
四、漏洞补丁分析
1. RpcAddPrinterDriverEx 补丁
-
新增检查函数:
YIsInAdministratorGroup:检查当前用户是否在管理员组YIsElevationRequired:通过注册表项NoWarningNoElevationOnInstall判断是否需要提升权限YRestrictDriverInstallationToAdministrators:通过注册表项判断是否允许向管理员组安装驱动
-
关键逻辑:
- 非管理员用户 (
v9,v12,v13为 false) - 当
v12为 false 时,清除APD_INSTALL_WARNED_DRIVERflag - 当
YRestrictDriverInstallationToAdministrators返回 true 且v13为 false 时,阻止驱动安装
- 非管理员用户 (
2. RpcAsyncAddPrinterDriver 补丁
- 新增权限检查:
- 当
YIsElevationReuqred返回 true 时 - 清除 flag 中的
APD_INSTALL_WARNED_DRIVER位
- 当
五、防护措施
1. 官方补丁
- 立即安装微软官方补丁 (2021年7月6日发布)
- 补丁 KB5004945 及后续更新
2. 临时缓解措施
若无法立即安装补丁:
-
禁用 Print Spooler 服务:
net stop spooler sc config spooler start= disabled -
通过组策略限制:
- 配置
Computer Configuration -> Administrative Templates -> Printers - 启用 "Point and Print Restrictions"
- 设置 "Users can only point and print to these servers" 和 "Users can only point and print to machines in their forest"
- 配置
-
注册表修改:
HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows NT\Printers\PointAndPrint设置:
RestrictDriverInstallationToAdministrators= 1NoWarningNoElevationOnInstall= 0
3. 网络防护
- 防火墙规则阻止 TCP 端口 135、139、445 和 UDP 端口 137、138
- 限制 SMB 协议访问
六、检测方法
-
日志监控:
- 监控 Windows 事件日志中的打印服务活动
- 特别关注事件 ID 307 (打印机驱动安装)
-
进程监控:
- 监控
spoolsv.exe的异常行为 - 检查异常的 DLL 加载行为
- 监控
-
漏洞验证:
- 使用官方提供的检测脚本
- 避免使用公开的漏洞利用代码进行测试
七、影响范围
- 影响所有 Windows 版本,包括:
- Windows 7 及更高版本的客户端系统
- Windows Server 2008 R2 及更高版本的服务器系统
八、参考资源
九、总结
PrintNightmare 漏洞因其高危害性和易利用性成为 2021 年最严重的安全漏洞之一。通过深入理解其利用原理和补丁机制,安全团队可以更好地防御此类漏洞。建议所有受影响系统立即应用补丁或缓解措施,并持续监控打印服务相关活动。