CVE-2026-58608 — Windows Print Spooler Remote Code Execution Vulnerability
Executive Summary
Concurrent execution using shared resource with improper synchronization ('race condition') in Windows Print Spooler Components allows an authorized attacker to execute code over a network.
Overview
CVSS Vector
CVSS:3.1/AV:N/AC:H/PR:L/UI:N/S:U/C:H/I:H/A:H/E:U/RL:O/RC:C
EPSS Score
Affected Products
| Product | KB Article | Severity | Impact | Restart Required |
|---|---|---|---|---|
| Windows 10 Version 1607 for 32-bit Systems | 5099535 (Security Update) |
Critical | Remote Code Execution | Yes |
| Windows 10 Version 1607 for x64-based Systems | 5099535 (Security Update) |
Critical | Remote Code Execution | Yes |
| Windows 10 Version 1809 for 32-bit Systems | 5099538 (Security Update) |
Critical | Remote Code Execution | Yes |
| Windows 10 Version 1809 for x64-based Systems | 5099538 (Security Update) |
Critical | Remote Code Execution | Yes |
| Windows 10 Version 21H2 for 32-bit Systems | 5099539 (Security Update) |
Critical | Remote Code Execution | Yes |
| Windows 10 Version 21H2 for ARM64-based Systems | 5099539 (Security Update) |
Critical | Remote Code Execution | Yes |
| Windows 10 Version 21H2 for x64-based Systems | 5099539 (Security Update) |
Critical | Remote Code Execution | Yes |
| Windows 10 Version 22H2 for 32-bit Systems | 5099539 (Security Update) |
Critical | Remote Code Execution | Yes |
| Windows 10 Version 22H2 for ARM64-based Systems | 5099539 (Security Update) |
Critical | Remote Code Execution | Yes |
| Windows 10 Version 22H2 for x64-based Systems | 5099539 (Security Update) |
Critical | Remote Code Execution | Yes |
| Windows 11 Version 24H2 for ARM64-based Systems | 5101650 (Security Update) |
Critical | Remote Code Execution | Yes |
| Windows 11 Version 24H2 for x64-based Systems | 5101650 (Security Update) |
Critical | Remote Code Execution | Yes |
| Windows 11 Version 25H2 for ARM64-based Systems | 5101650 (Security Update) |
Critical | Remote Code Execution | Yes |
| Windows 11 Version 25H2 for x64-based Systems | 5101650 (Security Update) |
Critical | Remote Code Execution | Yes |
| Windows 11 Version 26H1 for ARM64-based Systems | 5101649 (Security Update) |
Critical | Remote Code Execution | Yes |
| Windows 11 version 26H1 for x64-based Systems | 5101649 (Security Update) |
Critical | Remote Code Execution | Yes |
| Windows Server 2012 | 5099445 (Monthly Rollup) |
Critical | Remote Code Execution | Yes |
| Windows Server 2012 (Server Core installation) | 5099445 (Monthly Rollup) |
Critical | Remote Code Execution | Yes |
| Windows Server 2012 R2 | 5099444 (Monthly Rollup) |
Critical | Remote Code Execution | Yes |
| Windows Server 2012 R2 (Server Core installation) | 5099444 (Monthly Rollup) |
Critical | Remote Code Execution | Yes |
| Windows Server 2016 | 5099535 (Security Update) |
Critical | Remote Code Execution | Yes |
| Windows Server 2016 (Server Core installation) | 5099535 (Security Update) |
Critical | Remote Code Execution | Yes |
| Windows Server 2019 | 5099538 (Security Update) |
Critical | Remote Code Execution | Yes |
| Windows Server 2019 (Server Core installation) | 5099538 (Security Update) |
Critical | Remote Code Execution | Yes |
| Windows Server 2022 | 5099540 (Security Update) |
Critical | Remote Code Execution | Yes |
| Windows Server 2025 | 5099536 (Security Update) |
Critical | Remote Code Execution | Yes |
| Windows Server 2025 (Server Core installation) | 5099536 (Security Update) |
Critical | Remote Code Execution | Yes |
Patches
| Article | Type | Restart |
|---|---|---|
5099535 |
Security Update | Yes |
5099538 |
Security Update | Yes |
5099539 |
Security Update | Yes |
5101650 |
Security Update | Yes |
5101649 |
Security Update | Yes |
5099445 |
Monthly Rollup | Yes |
5099444 |
Monthly Rollup | Yes |
5099540 |
Security Update | Yes |
5099536 |
Security Update | Yes |
Patch Diff
Race condition (CWE-362) leading to use-after-free (CWE-416) in the Windows Print Spooler spoolsv.exe remote-notification path, authenticated network remote code execution (Critical, AV:N, PR:L, CVSS 8.8). The remote-notification refresh path (RouterRefreshPrinterChangeNotification) releases the RouterNotifySection critical section before invoking the provider callback (to avoid holding a lock across a slow call). PRE: no additional synchronization was held across that call, so InternalClosePrinter could free the _PRINTHANDLE from the spooler heap while a concurrent refresh was still using it - a race yielding a use-after-free (per the MSRC FAQ: create then close a printer handle without properly invalidating the related notification handle). Because the spooler is reachable over the network by an authenticated user, the freed-object reuse is an RCE primitive (Critical 8.8). Diff of spoolsv.exe 10.0.28000.2336 -> .2525 (Jul 14 2026, KB5101649, 26H1) confirms the fix: gated behind CFR flag Feature_1137672506, InternalClosePrinter (ratio 0.68) now drains in-flight refreshes before freeing - it sets a close-pending flag at handle+0x6C and, while the in-flight refresh count at handle+0x68 is nonzero, waits on a new condition variable RemoteRefreshDrainCV (SleepConditionVariableCS) holding RouterNotifySection; the refresh path increments the +0x68 count for the provider callback and an RAII guard decrements it and wakes RemoteRefreshDrainCV on completion. So the close can no longer HeapFree the _PRINTHANDLE while a refresh still references it. Cross-checked against an independent writeup (functions and offsets +0x68/+0x6C match; the writeup cites Feature_1674543418 for the same fix while the analysed ghidriff shows Feature_1137672506).
| Function | Address | Change | Note |
|---|---|---|---|
InternalClosePrinter |
code change |
code (drains in-flight remote refreshes before freeing the handle, CFR-gated) | Post (Feature_1137672506): sets close-pending at handle+0x6C, then while (*(handle+0x68) != 0) SleepConditionVariableCS(&RemoteRefreshDrainCV, &RouterNotifySection, INFINITE) to wait for outstanding refreshes to drain before HeapFree of the _PRINTHANDLE; clears +0x6C under RouterNotifySection afterward. |
RouterRefreshPrinterChangeNotification (PrvRouterRefreshPrinterChangeNotification) |
code change |
code (acquires the handle / bumps in-flight count for the provider callback) | The refresh path releases RouterNotifySection before the provider callback; post-patch it increments the +0x68 in-flight refresh count for the duration, and an RAII guard decrements it and wakes RemoteRefreshDrainCV on completion so a draining close is released. |
RemoteRefreshDrainCV (new) / SleepConditionVariableCS |
code change |
added (drain condition variable) | New condition variable used to block the close path until in-flight refreshes finish; no pre-patch counterpart. |
Feature_1137672506 |
gate |
added (CFR gate) | CFR flag gating the drain-on-close synchronization; the original unsynchronized close ships when disabled. (An independent writeup cites Feature_1674543418 for the same fix.) |
Attack Path
A printer-handle close races an in-flight remote-notification refresh, freeing the _PRINTHANDLE while still in use
Derived from the patch delta: the checks added by the vendor identify which fields crossed a trust boundary unvalidated. Reachability and privilege are taken from the call chain in the RCA report.