摘要
Plug And Pwn不是Windows内核0day漏洞,它是一套攻击方法论。攻击者借助USB硬件仿真设备伪造硬件ID,触发Windows即插即用自动下载微软签名的第三方驱动包,驱动包内部协同安装器(co‑installer)以SYSTEM权限运行。研究人员把多个厂商软件缺陷串联,在完全打满补丁的Windows11上拿到完整系统权限。
攻击分两条路径:物理USB接入攻击;开启USB重定向的RDP远程攻击。整套流程不需要管理员权限,甚至目标机器没有用户登录状态下即可触发。微软无法推送单一系统补丁封堵,风险根源分散在各家外设厂商驱动包。企业运维、红队、终端安全人员需要理解这套攻击链路,搭建检测规则,修改组策略缩小攻击面。
本文会拆解Windows PnP底层执行逻辑,完整复现两条攻击链,给出可直接复制的PowerShell检测脚本、组策略配置模板,梳理历史同类漏洞,给出落地防御方案,最后讨论该攻击对Windows终端安全带来的长期启发。
一、Windows PnP与co‑installer底层运行逻辑
1.1 PnP设备安装完整流程
普通用户眼里,插入USB设备就是系统识别硬件、弹出设备可用提示。底层执行链条远比表层复杂。
Windows内核PnP管理器捕获USB设备上报的HardwareID、CompatibleID。系统本地驱动库没有匹配驱动,就请求Windows Update服务器拉取对应厂商驱动包INF、二进制文件。驱动包经过微软数字签名校验,校验通过后交付给SetupAPI执行安装流程。
SetupAPI运行上下文为NT AUTHORITY\SYSTEM。INF文件中声明的co‑installer(协同安装器DLL/可执行文件)会在设备安装各个阶段被调用。协同安装器由硬件厂商编写,用来完成驱动之外的业务逻辑:创建系统服务、写入受保护注册表键、拉取配置文件、创建用户态后台程序。
关键点:厂商代码运行权限是SYSTEM,这个权限由Windows PnP框架直接赋予,和当前登录用户权限无关。低权限本地用户、未登录会话,只要硬件事件被触发,厂商代码就拿到最高权限执行机会。
1.2 co‑installer为什么会成为攻击突破口
微软文档里co‑installer设计初衷是弥补原生驱动能力不足。2023年之后微软不再对新提交co‑installer组件做签名,但存量大量历史外设驱动包依旧携带该组件,继续通过Windows Update分发到终端机器。
厂商开发人员编写协同安装器时,经常犯下安全错误:
- 使用明文HTTP协议拉取外部配置文件,没有校验服务端身份;
- 没有过滤路径穿越字符,外部可控输入直接拼接文件路径;
- 创建命名管道、本地IPC接口,没有做调用者权限校验,普通用户会话可以调用SYSTEM服务接口;
- DLL搜索路径配置不当,存在DLL劫持机会。
这些漏洞单独看危害有限。但组件运行在SYSTEM上下文,攻击者只要能够触发驱动包自动安装,小缺陷直接升级为系统接管入口。过去Razer Synapse外设驱动就爆出同类攻击,插入USB设备触发SYSTEM权限安装程序,本地低权限用户实现提权。
1.3 SetupAPI日志,唯一完整记录PnP安装事件
所有PnP设备安装、co‑installer调用行为,全部写入C:\Windows\INF\SetupAPI.dev.log。Windows事件查看器默认不会完整记录协同安装器调用细节,排查这类攻击必须读取该日志文件。
日志关键标记字段:
coinstaller:标记协同安装器加载事件;Downloading driver package:从Windows Update下载驱动包;Installing device:设备安装阶段;ExitCode:安装执行返回码。
很多安全产品默认不会采集这份日志,企业终端检测经常丢失这一类攻击线索。
二、Plug And Pwn物理USB攻击链完整拆解
硬件工具:FaceDancer USB仿真设备,运行在Linux主机,软件层面伪造USB设备描述符、硬件ID,目标Windows11机器完全打满系统补丁,无预安装第三方厂商软件,不需要目标机器登录用户,零交互触发攻击链。
2.1 第一步:仿真Sierra Wireless设备获取DNS篡改原语
FaceDancer模拟Sierra无线调制解调器硬件ID。Windows识别硬件ID,自动从Windows Update拉取微软签名驱动包,安装SwiService.exe,程序注册为SYSTEM自动启动服务。
该服务对外暴露本地命名管道\\.\pipe\SwiService,提供SetDNS接口。接口没有做调用者安全校验,本机任意用户会话都可以调用,直接修改系统全局DNS配置。攻击者不需要管理员权限,低权限用户即可调用IPC接口改写DNS服务器地址。
这一步没有代码执行能力,仅拿到DNS篡改能力,作为整个链路前置跳板。
2.2 第二步:仿真Sony FeliCa读卡器,触发路径穿越漏洞
DNS已经被指向攻击者可控服务器,FaceDancer切换设备身份,仿真Sony FeliCa非接触读卡器硬件ID。Windows再次触发PnP自动安装逻辑,下载索尼官方签名驱动包,调用自带co‑installer。
该协同安装器业务逻辑:启动阶段访问厂商HTTP接口拉取设备配置文件。代码实现缺陷:
- 使用HTTP明文传输,没有TLS加密;
- 配置文件路径参数直接来自HTTP返回内容,未过滤
../路径穿越字符。
攻击者受控服务器返回构造过的配置内容,携带路径穿越字符串,让co‑installer把后续DLL输出写入系统目录C:\Windows\System32\。文件写入动作运行于SYSTEM权限,普通用户无法直接写入该目录,这里借助厂商组件完成文件落地。
2.3 第三步:重触发设备安装,加载恶意DLL完成权限接管
恶意DLL已经落地System32目录。攻击者再次向目标主机推送Sony读卡器仿真信号。PnP再次执行设备安装流程,co‑installer加载目标目录下DLL,DLL代码直接在SYSTEM权限上下文执行,攻击者完成系统接管。
整套PoC执行时间数十秒。目标机器就算停留在锁屏未登录界面,只要USB物理接口可达,攻击链完整生效。
三、NoPlug‑Pwn:RDP远程攻击链,不需要物理硬件
很多人误以为该攻击必须物理接触USB接口。研究同时公开远程向量,攻击代号NoPlug‑Pwn,条件:目标RDP服务端开启PnP/底层USB重定向(RemoteFX USB重定向),Windows默认关闭该策略,管理员手动开启才会暴露风险。
现代Windows新版本已经废弃RemoteFX组件,但部分企业服务器、云桌面环境管理员手动配置遗留组策略,开启USB重定向,方便远程会话使用U‑Key、加密狗外设,引入攻击面。
远程链路不需要DNS篡改、路径穿越串联,直接利用Intel RealSense驱动包内部DLL加载逻辑缺陷,通过RDP虚拟USB信号触发整套PnP自动安装,网络侧完成提权,全程无物理接触机器。
RDP重定向开启判定,两条关键组策略:
计算机配置\管理模板\Windows组件\远程桌面服务\设备和资源重定向\允许RemoteFX USB设备重定向- RDP文件参数:
usbdeviceredirection:i:1,开启底层USB重定向通道。
企业云桌面、堡垒机接入服务器,经常为了兼容U盾外设打开该开关,很多运维人员不清楚开启后附带的安全风险。
四、攻击链底层风险归纳
这套攻击和普通漏洞利用有本质区别,不是单一CVE修复就能解决。
- 信任链错位:Windows信任微软签名的第三方驱动包,自动以SYSTEM运行厂商代码。微软只校验二进制签名,无法审查厂商业务逻辑全部安全缺陷。厂商软件出现漏洞,风险直接传导到操作系统最高权限。
- 触发条件低:物理场景只要USB接口可达;远程场景只要RDP USB重定向开启。本地普通低权限账号也可以在本机复现这套链路,不需要管理员。
- 无弹窗无交互:全部后台静默执行,用户看不到任何安装弹窗。锁屏状态攻击依旧有效,取证难度高。
- 没有全局补丁:微软无法修改所有第三方厂商驱动代码。只能靠厂商更新修复自身co‑installer缺陷,管理员调整Windows组策略限制PnP行为。
历史同类漏洞:Razer Synapse、SteelSeries外设协同安装器,同样依托PnP自动安装,实现本地提权。Plug And Pwn研究把单台漏洞利用扩展成完整链式攻击,同时新增RDP远程向量,把风险边界进一步扩大。
五、检测脚本与日志分析实战
下面提供PowerShell脚本,读取SetupAPI日志,扫描异常驱动下载、co‑installer调用事件;同时检查本机RDP USB重定向组策略状态。脚本支持Windows10/Windows11,直接复制运行,不需要第三方依赖。
注意:脚本需要管理员权限执行,才能读取
C:\Windows\INF目录下SetupAPI日志。
<# PlugAndPwn 风险本地检测脚本 功能:1.解析SetupAPI.dev.log,提取驱动下载、co‑installer事件 2.检查RDP RemoteFX USB重定向组策略配置状态 输出:控制台文本,可导出到csv保存日志证据 #>#Requires -RunAsAdministrator$setupApiLogPath="$env:windir\INF\SetupAPI.dev.log"$outputCsv=".\PnP_Detect_Report.csv"Write‑Host"==== Plug And Pwn 风险检测工具 ===="-ForegroundColor Cyan# 1.检查SetupAPI日志是否存在if(-not(Test‑Path$setupApiLogPath)){Write‑Warning"SetupAPI.dev.log 文件不存在,无法分析PnP安装事件"}else{Write‑Host"`n[1] 解析SetupAPI驱动安装日志,提取风险事件"-ForegroundColor Yellow$logContent= Get‑Content$setupApiLogPath-Encoding Unicode$riskLines= @()foreach($linein$logContent){if($line-match"Downloading driver package|coinstaller|Installing device"){$obj=[PSCustomObject]@{TimeStamp =$lineEventType =$matches[0]}$riskLines+=$obj}}if($riskLines.Count-gt0){Write‑Host"共扫描到$($riskLines.Count)条PnP高风险事件"$riskLines|Format‑Table‑AutoSize$riskLines|Export‑Csv‑Path$outputCsv‑Encoding UTF8‑NoTypeInformationWrite‑Host"风险事件已导出至$outputCsv"}else{Write‑Host"日志中未发现下载驱动包、co‑installer调用记录"}}# 2.读取注册表,检查RemoteFX USB重定向策略Write‑Host"`n[2] 检测RDP RemoteFX USB重定向策略状态"‑ForegroundColor Yellow$rdpRegPath="HKLM:\SOFTWARE\Policies\Microsoft\Windows NT\Terminal Services\Client"$usbRedirValue= Get‑ItemProperty‑Path$rdpRegPath‑ErrorAction SilentlyContinue|Select‑Object‑ExpandProperty"fEnableUsbRedirection"‑ErrorAction SilentlyContinueif($usbRedirValue‑eq 1){Write‑Warning"⚠️ RemoteFX USB重定向策略已开启,存在NoPlug‑Pwn远程攻击风险!"}elseif($usbRedirValue‑eq 0){Write‑Host"✅ RemoteFX USB重定向策略已关闭"‑ForegroundColor Green}else{Write‑Host"✅ 未配置USB重定向策略,系统使用默认关闭状态"‑ForegroundColor Green}Write‑Host"`n检测完成。注意:该脚本仅做线索告警,不能判定机器已经被入侵。"5.1 日志人工排查要点
拿到日志输出之后,重点关注这几类行为:
- 机器没有接入对应真实硬件设备,日志出现陌生厂商驱动包下载记录;
- 大量co‑installer加载事件,设备ID对应机器不存在的外设;
- 锁屏时间段(非用户操作时段)触发设备驱动完整安装流程。
安全设备规则建议:SIEM接入SetupAPI.dev.log日志,告警条件:非工作时段发生Windows Update驱动包下载 + co‑installer加载。
六、Windows组策略加固配置清单
没有系统补丁,防御重心落在组策略限制PnP自动安装行为,关闭高危RDP重定向。下面给出可落地配置,域环境可以下发GPO,单机本地gpedit.msc配置。
6.1 关闭RDP RemoteFX USB底层重定向
远程攻击向量的核心开关,所有RDP服务器、云桌面机器必须关闭。
路径:计算机配置 -> 管理模板 -> Windows组件 -> 远程桌面服务 -> 设备和资源重定向
- 策略名:允许RemoteFX USB设备重定向
- 设置:已禁用
注册表等效配置(脚本批量部署):
Windows Registry Editor Version 5.00 [HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows NT\Terminal Services\Client] "fEnableUsbRedirection"=dword:000000006.2 限制PnP自动安装未授权硬件驱动
两条关键策略,阻止系统自动安装不在允许列表内的设备驱动。
- 阻止安装未由其他策略设置描述的设备→ 启用;
- 配置允许安装的硬件ID列表,只加入业务真实需要外设HardwareID。
路径:计算机配置\管理模板\系统\设备安装\设备安装限制
副作用:开启后新外设插上不会自动安装驱动,需要管理员手动添加硬件ID白名单,适合企业标准化终端;个人工作站不建议直接全开,会影响普通USB外设使用。
6.3 设备安装源限制,禁止从Windows Update获取驱动
策略:指定搜索驱动程序的位置,启用,勾选“不要搜索Windows Update”。
该策略会完全阻止PnP自动从WU下载第三方驱动包,直接切断Plug And Pwn攻击链触发源头。
代价:终端无法自动获取外设驱动更新,需要IT运维本地推送驱动包。适合高安全等级服务器,普通办公机器权衡业务后开启。
6.4 物理层面安全管控
物理访问不可控机器,仅靠软件策略无法完全防御。攻击者使用FaceDancer硬件仿真,绕过系统软件层面校验。
- 高安全设备禁用闲置USB端口,BIOS层面锁USB;
- 不允许不受控外来USB设备接入业务主机。
七、同类攻击历史复盘与攻击面拓展
co‑installer提权不是新问题,Plug And Pwn研究把攻击面做完整,同时拓展远程向量,把行业忽略的风险放大。
Razer Synapse漏洞:插入雷蛇外设,PnP触发协同安装器,安装程序以SYSTEM运行,安装GUI窗口可以通过对话框弹出SYSTEM命令行,本地低权限直接提权。漏洞曝光之后微软调整INF签名策略,不再允许新co‑installer签名,但存量旧驱动包继续分发到终端机器。
这类攻击底层思想:利用合法高权限组件的业务逻辑缺陷完成提权。和普通内存漏洞不同,不需要漏洞利用堆溢出,目标瞄准业务逻辑漏洞。
未来潜在攻击面还包括:
- 蓝牙设备PnP自动安装,蓝牙设备同样上报HardwareID,触发驱动自动下载;
- PCIe热插拔设备,同样会调用SetupAPI与co‑installer;
- 虚拟机虚拟硬件仿真,虚拟硬件ID触发宿主机或者虚拟机内PnP安装流程。
很多安全团队红队测试,过去只关注内核漏洞、服务漏洞,很少专门针对PnP协同安装器做审计。外设驱动包属于经常被忽略的攻击面。
八、防御局限性与现实权衡
所有加固方案都存在取舍,没有完美方案。
- 直接关闭Windows Update驱动下载,彻底阻断攻击触发,但新外设无法自动安装驱动,运维成本上涨;
- 使用硬件ID白名单策略,企业标准化终端可行,个人、外勤笔记本设备,经常接入各类未知外设,维护白名单工作量巨大;
- 日志检测只能做告警,不能阻止攻击。攻击者使用合法签名驱动包,杀毒软件基于签名校验无法拦截;
- 第三方厂商驱动包缺陷,只能等待厂商修复,终端管理员没有能力修改驱动包内部代码。
真实环境中,采用分层防御思路:
- 服务器、云桌面:强制关闭RDP USB重定向,关闭WU驱动自动下载;
- 企业办公终端:开启SetupAPI日志采集,SIEM配置告警规则,不强制全盘禁用驱动下载,用检测手段兜底;
- 高安全物理主机:BIOS层面禁用闲置USB接口。
九、对终端安全体系带来的启发
Plug And Pwn暴露出Windows安全模型一处长期被忽视的信任假设:只要驱动包经过微软签名,包内厂商全部业务代码都可信,可以直接SYSTEM执行。
签名只能证明文件发布者身份,不能保证代码没有业务逻辑漏洞。过去安全建设大量投入内核防护、驱动签名拦截,却忽视签名软件内部业务逻辑缺陷带来的权限风险。
很多安全厂商EDR产品,重点监控可执行文件落地、进程创建行为;但PnP场景,恶意动作全部由合法签名厂商二进制完成,恶意DLL落地动作藏在co‑installer内部,传统行为检测容易漏报。安全产品需要增加针对SetupAPI、co‑installer调用的专项检测能力。
软件厂商编写INF协同安装组件时,必须遵守几条底线:
- 禁止明文HTTP拉取配置文件;
- 外部输入严格过滤路径穿越字符;
- IPC、命名管道接口做调用者完整性级别校验,拒绝低权限会话调用高风险接口;
- 尽量放弃co‑installer,改用服务程序,降低特权执行场景攻击面。
结尾互动问题
- 你的企业终端SIEM/EDR是否采集
SetupAPI.dev.log日志?实际运维中遇到过PnP协同安装器相关告警吗? - 如果业务必须开启RDP USB重定向兼容U‑Key,你会设计哪些补偿性安全策略来规避NoPlug‑Pwn这类远程风险?
我之前也写过类似的文章,更多相关内容、心得经验可以来我博客看看~