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 漏洞分析

  1. 漏洞位置AddPrinterDriverEx 函数

  2. 关键参数:第三个参数 flag 包含未公开的值 APD_INSTALL_WARNED_DRIVER = 0x00008000

  3. 绕过机制

    • 通过 bittest 检查 flag 的第 0xf 位
    • 当该位为 1 时,v12 值为 0,绕过权限检查
    • 成功调用 InternalAddPrinterDriverEx
  4. 补丁修复

    • 增加了三个关键检查函数:
      • YIsElevated
      • YIsElevationRequered
      • RunningAsLUA
    • v12==0v13==1v9==1 时,清除 flag 中的 0x8000 位

三、PrintNightmare 漏洞分析

1. 漏洞利用原理

PrintNightmare 是对 CVE-2021-1675 补丁的绕过,主要利用 RpcAsyncAddPrinterDriver API:

  • 该 API 同样可以设置 APD_INSTALL_WARNED_DRIVER flag
  • 未实施与 AddPrinterDriverEx 相同的权限检查
  • 完美绕过 bittest 检查,实现恶意 DLL 加载

2. 利用流程详解

  1. 初始调用

    spoolsv!TRemoteWinspool::RpcAsyncAddPrinterDriver
    

    调用 TFunction4 设置回调

  2. 回调设置

    • TFunction4 设置对 YAddPrinterDriverEx 的调用
    • v7 偏移 128 处为 YAddPrinterDriverEx
  3. 异步调用

    • 通过 a1 偏移 128 处的函数指针调用 YAddPrinterDriverEx
    • APD_INSTALL_WARNED_DRIVER flag 保留,绕过权限检查
  4. DLL 加载

    • 成功加载攻击者指定的恶意 DLL
    • 实现任意代码执行

四、漏洞补丁分析

1. RpcAddPrinterDriverEx 补丁

  • 新增检查函数:

    • YIsInAdministratorGroup:检查当前用户是否在管理员组
    • YIsElevationRequired:通过注册表项 NoWarningNoElevationOnInstall 判断是否需要提升权限
    • YRestrictDriverInstallationToAdministrators:通过注册表项判断是否允许向管理员组安装驱动
  • 关键逻辑:

    • 非管理员用户 (v9, v12, v13 为 false)
    • v12 为 false 时,清除 APD_INSTALL_WARNED_DRIVER flag
    • YRestrictDriverInstallationToAdministrators 返回 true 且 v13 为 false 时,阻止驱动安装

2. RpcAsyncAddPrinterDriver 补丁

  • 新增权限检查:
    • YIsElevationReuqred 返回 true 时
    • 清除 flag 中的 APD_INSTALL_WARNED_DRIVER

五、防护措施

1. 官方补丁

  • 立即安装微软官方补丁 (2021年7月6日发布)
  • 补丁 KB5004945 及后续更新

2. 临时缓解措施

若无法立即安装补丁:

  1. 禁用 Print Spooler 服务

    net stop spooler
    sc config spooler start= disabled
    
  2. 通过组策略限制

    • 配置 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"
  3. 注册表修改

    HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows NT\Printers\PointAndPrint
    

    设置:

    • RestrictDriverInstallationToAdministrators = 1
    • NoWarningNoElevationOnInstall = 0

3. 网络防护

  • 防火墙规则阻止 TCP 端口 135、139、445 和 UDP 端口 137、138
  • 限制 SMB 协议访问

六、检测方法

  1. 日志监控

    • 监控 Windows 事件日志中的打印服务活动
    • 特别关注事件 ID 307 (打印机驱动安装)
  2. 进程监控

    • 监控 spoolsv.exe 的异常行为
    • 检查异常的 DLL 加载行为
  3. 漏洞验证

    • 使用官方提供的检测脚本
    • 避免使用公开的漏洞利用代码进行测试

七、影响范围

  • 影响所有 Windows 版本,包括:
    • Windows 7 及更高版本的客户端系统
    • Windows Server 2008 R2 及更高版本的服务器系统

八、参考资源

  1. 微软官方公告
  2. PrintNightmare GitHub PoC
  3. mimikatz 利用代码

九、总结

PrintNightmare 漏洞因其高危害性和易利用性成为 2021 年最严重的安全漏洞之一。通过深入理解其利用原理和补丁机制,安全团队可以更好地防御此类漏洞。建议所有受影响系统立即应用补丁或缓解措施,并持续监控打印服务相关活动。

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 补丁修复 : 增加了三个关键检查函数: YIsElevated YIsElevationRequered RunningAsLUA 当 v12==0 、 v13==1 且 v9==1 时,清除 flag 中的 0x8000 位 三、PrintNightmare 漏洞分析 1. 漏洞利用原理 PrintNightmare 是对 CVE-2021-1675 补丁的绕过,主要利用 RpcAsyncAddPrinterDriver API: 该 API 同样可以设置 APD_INSTALL_WARNED_DRIVER flag 未实施与 AddPrinterDriverEx 相同的权限检查 完美绕过 bittest 检查,实现恶意 DLL 加载 2. 利用流程详解 初始调用 : 调用 TFunction4 设置回调 回调设置 : TFunction4 设置对 YAddPrinterDriverEx 的调用 v7 偏移 128 处为 YAddPrinterDriverEx 异步调用 : 通过 a1 偏移 128 处的函数指针调用 YAddPrinterDriverEx APD_INSTALL_WARNED_DRIVER flag 保留,绕过权限检查 DLL 加载 : 成功加载攻击者指定的恶意 DLL 实现任意代码执行 四、漏洞补丁分析 1. RpcAddPrinterDriverEx 补丁 新增检查函数: YIsInAdministratorGroup :检查当前用户是否在管理员组 YIsElevationRequired :通过注册表项 NoWarningNoElevationOnInstall 判断是否需要提升权限 YRestrictDriverInstallationToAdministrators :通过注册表项判断是否允许向管理员组安装驱动 关键逻辑: 非管理员用户 ( v9 , v12 , v13 为 false) 当 v12 为 false 时,清除 APD_INSTALL_WARNED_DRIVER flag 当 YRestrictDriverInstallationToAdministrators 返回 true 且 v13 为 false 时,阻止驱动安装 2. RpcAsyncAddPrinterDriver 补丁 新增权限检查: 当 YIsElevationReuqred 返回 true 时 清除 flag 中的 APD_INSTALL_WARNED_DRIVER 位 五、防护措施 1. 官方补丁 立即安装微软官方补丁 (2021年7月6日发布) 补丁 KB5004945 及后续更新 2. 临时缓解措施 若无法立即安装补丁: 禁用 Print Spooler 服务 : 通过组策略限制 : 配置 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" 注册表修改 : 设置: RestrictDriverInstallationToAdministrators = 1 NoWarningNoElevationOnInstall = 0 3. 网络防护 防火墙规则阻止 TCP 端口 135、139、445 和 UDP 端口 137、138 限制 SMB 协议访问 六、检测方法 日志监控 : 监控 Windows 事件日志中的打印服务活动 特别关注事件 ID 307 (打印机驱动安装) 进程监控 : 监控 spoolsv.exe 的异常行为 检查异常的 DLL 加载行为 漏洞验证 : 使用官方提供的检测脚本 避免使用公开的漏洞利用代码进行测试 七、影响范围 影响所有 Windows 版本,包括: Windows 7 及更高版本的客户端系统 Windows Server 2008 R2 及更高版本的服务器系统 八、参考资源 微软官方公告 PrintNightmare GitHub PoC mimikatz 利用代码 九、总结 PrintNightmare 漏洞因其高危害性和易利用性成为 2021 年最严重的安全漏洞之一。通过深入理解其利用原理和补丁机制,安全团队可以更好地防御此类漏洞。建议所有受影响系统立即应用补丁或缓解措施,并持续监控打印服务相关活动。