Critical CVSS 7.5 EPSS 0.00425 🔬 Patch diffed 2026-07 archive

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

7.5
CVSS HIGH
Critical
MS Severity
Not Exploited
MS Exploit Status
Less Likely
MS Exploit Likelihood
Category Remote Code Execution
Released Jul 14 2026
Last Updated Jul 14 2026
Publicly Disclosed No
CISA KEV Not Listed
Known Exploits None Known
EPSS Score 0.00425 — 0.35291 percentile
NVD CVSS 7.5 HIGH — differs from MSRC

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
ATTACK VECTOR
Network
ATTACK COMPLEXITY
High
PRIVILEGES REQUIRED
Low
USER INTERACTION
None
SCOPE
Unchanged
CONFIDENTIALITY
High
INTEGRITY
High
AVAILABILITY
High
EXPLOIT CODE MATURITY
Unproven
REMEDIATION LEVEL
Official Fix
REPORT CONFIDENCE
Confirmed
Temporal Score: 7.7

EPSS Score

0.00425
probability of exploitation in the next 30 days
0.35291 percentile - updated 2026-08-14
View on FIRST.org

Affected Products

27 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

9 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

ghidriff · spoolsv.exe (KB5101649)

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).

Pre-patch version 10.0.28000.2336 Download
Post-patch version 10.0.28000.2525 Download
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.)
View full diff report View RCA report

Attack Path

A printer-handle close races an in-flight remote-notification refresh, freeing the _PRINTHANDLE while still in use

Attack path for CVE-2026-58608 A printer-handle close races an in-flight remote-notification refresh, freeing the _PRINTHANDLE while still in use 01 — ENTRY Authenticated attacker drives the spooler's remote-notification interface Registers for printer change notifications and opens/closes printer handles over the network. AV:N / PR:L / UI:N. 02 — CONTROLLED INPUT Closes a printer handle while a refresh is in flight RouterRefreshPrinterChangeNotification has released RouterNotifySection and is calling the provider when InternalClosePrinter runs. 03 — MISSING CHECK _PRINTHANDLE freed while a refresh still uses it (CWE-362 -> CWE-416) Pre-patch nothing keeps the handle alive across the provider callback, so the close HeapFrees it during the refresh - a use-after-free. 04 — IMPACT Freed printer-handle reuse -> remote code execution The freed _PRINTHANDLE is reclaimed/reused in the spooler, giving an authenticated network attacker code execution (Critical, 8.8).

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.

Exploits & PoC

Detection Rules

Acknowledgments