PrintNightmare is the collective name for a family of vulnerabilities in the Windows Print Spooler service (spoolsv.exe) that allow a low-privileged, authenticated user to install an arbitrary printer driver and have it execute code with SYSTEM privileges — locally, or remotely against a domain controller or file/print server. The Print Spooler runs, by default, on every supported version of Windows from Windows 7 through Windows 11 and on every Windows Server release from 2008 through 2022 (Microsoft Security Response Center, 2021; Wikipedia, 2021). Because the service is enabled out of the box and because Active Directory domain controllers typically run it as well, the practical blast radius of PrintNightmare was, at disclosure, effectively "every Windows domain in existence."
What makes PrintNightmare significant is not a single CVE but the pattern it set: an accidental, uncoordinated disclosure in June 2021 triggered a rushed out-of-band patch, and every subsequent fix closed one specific abuse path while leaving the underlying architectural primitive — a low-privileged RPC call that ends in SYSTEM-context file/DLL operations chosen by the caller — intact. Between June 2021 and August 2024, five separate CVEs (CVE-2021-1675, CVE-2021-34527, CVE-2021-34481, CVE-2022-21999, CVE-2024-38198) were required to progressively narrow the same underlying weakness class in the same subsystem (Paragmali, 2024; 0patch/SafeBreach, 2022; Microsoft Security Update Guide, 2024).
PrintNightmare matters in 2026 not as breaking news but as a standing reference case: it is one of the clearest public examples of a "patch cascade" — where CISA issued a rare Emergency Directive (ED 21-04) forcing federal agencies to disable a core OS service network-wide (CISA, 2021), where ransomware operators (Vice Society, Magniber, Conti) weaponized the bug for lateral movement within weeks of disclosure (BleepingComputer, 2021; Cybereason, 2021), and where the FIRST.org EPSS model still scores the primary CVE at 0.998 — a near-certainty of continued exploitation attempts against any system left unpatched (FIRST.org EPSS API, accessed 2026-08-30).
Who is at risk today: any environment still running end-of-support Windows builds, any environment that has not applied the full patch lineage through August 2024, and any environment relying on Point-and-Print convenience defaults for non-administrative printer driver installation. Legacy healthcare, manufacturing, and OT-adjacent IT networks — where Windows Server upgrade cycles lag — remain the highest-probability targets for opportunistic exploitation of this now five-year-old vulnerability family.
The Print Spooler exposes two functionally symmetric RPC entry points for installing printer drivers: RpcAddPrinterDriverEx (MS-RPRN) and RpcAsyncAddPrinterDriver (MS-PAR). Both ultimately invoke the same internal driver-installation logic, which copies a caller-supplied driver package — including an attacker-controlled DLL (pDataFile) — into the spooler's driver store and then loads it in the context of the spooler service, which runs as SYSTEM. The vulnerability is that this code path does not verify the supplied file paths are local to the target machine before fetching and caching them, and does not restrict the operation to administrators (SentinelOne Vulnerability Database, 2021; Cato Networks, 2021).
Microsoft's June 8, 2021 patch (targeting CVE-2021-1675) added an authorization check to only one of the two entry points, RpcAddPrinterDriverEx. Because the two RPC methods are semantically interchangeable from the exploit's perspective, the fix was trivially bypassed by routing the same attack through RpcAsyncAddPrinterDriver — this became the true "PrintNightmare" RCE, CVE-2021-34527, disclosed weeks later (@cube0x0; Rapid7, 2021).
The deeper architectural failure is Point-and-Print, a decades-old Windows feature designed so that any domain user could install a shared network printer's driver without administrator credentials — treating "printer driver" as a benign artifact rather than as SYSTEM-privileged code. That design decision, made in an era before driver signing was consistently enforced and before printers were treated as an attack surface, is the actual root cause underneath every CVE in this family. Patching the RPC calls narrows the exploitation surface; it does not remove the design assumption that non-admin users should be able to trigger privileged driver loads at all.
The lifecycle begins with two independent research efforts converging on the same subsystem. In March 2021, researchers Zhipeng Huo (Tencent Xuanwu Lab), Piotr Madej (AFINE), and Yunhai Zhang (NSFOCUS TIANJI Lab) reported a Print Spooler local-privilege-escalation issue to Microsoft, which was quietly patched on June 8, 2021 as CVE-2021-1675 and classified as a low-severity Elevation of Privilege bug. Separately, Zhiniang Peng, Xuefeng Li, and Lewis Lee of Sangfor Technologies (China) had independently found a related remote code execution primitive in the same driver-install code path, which they intended to unveil at the Tianfu Cup hacking competition and again at Black Hat USA in August 2021.
The pivotal event: on June 29, 2021, Sangfor's team — believing their separate RCE finding had already been fully remediated by Microsoft's June 8 patch for CVE-2021-1675 — published a full technical write-up and working proof-of-concept exploit to GitHub, seeing no further embargo value in withholding it. This was an accidental, good-faith misjudgment, not a hostile leak: Sangfor had misidentified their bug as already-patched. Within hours, security researchers determined the PoC in fact bypassed the June patch entirely; Sangfor deleted the repository, but by then it had already been forked and mirrored widely (Infosecurity Magazine, 2021; The Record, 2021; Sangfor, 2021).
Microsoft confirmed the distinct, unpatched RCE on June 30, 2021, assigned CVE-2021-34527, and shipped an emergency out-of-band patch on July 6–7, 2021 (KB5004945) — six business days after the accidental leak. That patch was bypassed within roughly five weeks via the Point-and-Print elevation-suppression default, prompting a third patch generation in August 2021 (CVE-2021-34481) that flipped the RestrictDriverInstallationToAdministrators registry default. Microsoft subsequently admitted in a September 14, 2021 advisory that "there is no combination of mitigations that is equivalent to setting RestrictDriverInstallationToAdministrators to 1" — a rare public concession that partial mitigations were insufficient. The cascade continued with SpoolFool (CVE-2022-21999, patched February 2022) and a further race-condition variant (CVE-2024-38198, patched August 13, 2024), each closing one specific abuse path against the same underlying RPC/driver-load primitive (Paragmali, 2024).
PrintNightmare is a textbook case of coordinated vulnerability disclosure failing not through malice but through cross-organization ambiguity. Two separate research teams found two separate (but related) bugs in the same code path around the same time, and neither had full visibility into what the other had reported or what Microsoft had actually fixed. Sangfor's assumption that their RCE was "already patched" because a similarly-described EoP bug (CVE-2021-1675) had shipped a fix eleven days earlier is the direct proximate cause of the premature disclosure — a reminder that CVE descriptions and patch scopes are not always legible enough, even to skilled researchers, to confirm a specific exploit chain is actually closed.
The vendor response, taken in isolation, was fast: Microsoft shipped an out-of-band emergency patch within roughly a week of confirming the unpatched RCE, including patches for Windows 7 — an operating system whose extended support had already ended, a strong signal of how seriously Microsoft assessed the severity (Wikipedia, 2021). But "fast" and "complete" were not the same thing here: the emergency patch, and the two generations that followed it, each addressed the specific abuse path demonstrated in the leaked PoC rather than the general privilege-boundary defect, which is why the community's skepticism (crystallized in CERT/CC's blunt June 30 statement) proved justified repeatedly over the following three years.
The core exploit chain for CVE-2021-34527 (the primary RCE variant): an attacker with any valid domain credentials (even a low-privilege standard user account) connects to a target's Print Spooler RPC endpoint — locally, or remotely over the MS-RPRN/MS-PAR named-pipe interface if the Spooler is remotely accessible, which is the default and expected configuration on domain controllers running the print service for the domain. The attacker calls RpcAsyncAddPrinterDriver, supplying a driver package descriptor whose pDataFile field points to an attacker-hosted DLL (served, for example, from an SMB share the attacker controls). The Spooler service, running as SYSTEM, fetches this file without verifying it originates locally, stages it into the driver store, and loads it as a printer driver DLL — executing attacker code with SYSTEM privileges the moment the "driver" is installed.
Against a domain controller specifically, this converts any authenticated domain account into a path to full domain compromise: SYSTEM on a DC is equivalent to Domain Admin. This is why CISA's Emergency Directive 21-04 (July 13, 2021) singled out domain controllers for immediate Spooler shutdown ahead of general workstation patching (CISA, 2021).
| CVE | Component | Affected Versions | Fixed Version / KB | Status |
|---|---|---|---|---|
| CVE-2021-1675 | RpcAddPrinterDriverEx (MS-RPRN) | Windows 7–10, Server 2008–2019 (pre-2021-06-08) | KB5003637 et al. (2021-06-08) | Superseded — incomplete, bypassed via MS-PAR |
| CVE-2021-34527 | RpcAsyncAddPrinterDriver (MS-PAR) — true "PrintNightmare" | All supported Windows + Windows 7 (out-of-band) | KB5004945 / KB5004946 et al. (2021-07-06/07) | Superseded — Point-and-Print default left gap |
| CVE-2021-34481 | Point-and-Print elevation suppression default | All supported Windows (RestrictDriverInstallationToAdministrators=0) | KB5005010 / KB5005033 (2021-08-10) | Superseded — SpoolDirectory vector remained |
| CVE-2022-21999 (SpoolFool) | Spooler SpoolDirectory / printer-port symlink handling | All Windows desktop + server versions (default config) | 2022-02-08 Patch Tuesday | Superseded — race-condition variant found 2024 |
| CVE-2024-38198 | Print Spooler data-authenticity check (race condition) | Windows 10/11 all channels, Server 2016–2022 | 2024-08-13 Patch Tuesday | Current — no further public bypass reported as of 2026-09-02 |
No card currently on file in this repository documents Vice Society, Magniber, or Conti as named threat actors — see Section 10. Exploitation of PrintNightmare has skewed heavily toward ransomware affiliate tooling and generic post-exploitation frameworks (it is a stock module in several open-source LPE/lateral-movement toolkits) rather than being a signature technique of any single tracked nation-state APT, which is consistent with its nature as a broad, low-skill-barrier privilege-escalation primitive rather than a targeted espionage tool.
PrintNightmare is the clearest publicly documented case of a vendor patching the demonstrated exploit rather than the underlying design defect, and paying for it in installments. Each of the five CVEs closed the specific technical path shown in the most recent public PoC — the MS-RPRN entry point, then MS-PAR, then the Point-and-Print elevation default, then the SpoolDirectory symlink trick, then a race condition in the data-authenticity check — while the shared precondition underneath all five (a low-privileged, remotely reachable RPC interface that can direct a SYSTEM-context process to load caller-supplied code) was never itself redesigned. This is the "whack-a-mole" anti-pattern: it produces short-term compliance (a CVE is closed, a KEV deadline is met) without reducing the actual attack surface class, and it guarantees a security team's work is never finished for as long as the underlying primitive exists.
The Print Spooler itself is a case study in accumulated legacy risk. It is architecturally a 1990s-era Windows NT print subsystem, extended over three decades to support remote administration, driver distribution, and enterprise print-server convenience features — each addition widening its privileged attack surface without a corresponding security re-architecture. Point-and-Print specifically encodes a security tradeoff that made sense when printer drivers were assumed to be trustworthy binary blobs distributed by IT departments, and that assumption never survived contact with a threat landscape where any domain-authenticated account (including a compromised low-privilege user) is treated as a potential attacker. This is a recurring pattern across the industry: features built for administrative convenience decades ago — "any user can install this specific kind of privileged software without asking an admin" — routinely become the default LPE/RCE vector once attacker tradecraft catches up. PrintNightmare is functionally the same lesson as print-driver and font-parser vulnerabilities before it, and the appearance of a fifth CVE in this family as late as August 2024 — three years after the original panic patch — demonstrates that the industry's response to this class of bug remains reactive rather than structural: patch the demonstrated path, wait for the next researcher to find the next path.
The organizational lesson is equally important: CISA's willingness to issue an Emergency Directive mandating an entire OS service be disabled on domain controllers — rather than waiting for a "complete" patch — reflects a mature response to exactly this pattern. When a vendor's patch cadence cannot keep pace with a shared architectural primitive, the correct interim control is often to remove the exposed surface (disable the service where it is not needed) rather than trust each successive patch to be the last one required.
Behavioral indicators independent of the specific CVE variant: any RPC-initiated driver install by a non-administrative account; a spooler process handle opening files outside the expected driver-store path; and new DLLs appearing in %SystemRoot%\System32\spool\drivers\ that do not correspond to a known, IT-approved driver push. On domain controllers, any driver-install event at all should be treated as anomalous, since DCs should not be servicing end-user print jobs.
Hypothesis 1 — Historical compromise via unpatched Spooler. Hunt for spoolsv.exe process trees with unexpected child processes or network connections in EDR telemetry going back to the earliest available retention (ideally covering 2021-06 forward for environments that existed then). A single historical hit is sufficient grounds for a full incident response, since successful exploitation grants SYSTEM and is rarely a one-off event in a real intrusion.
Hypothesis 2 — Point-and-Print misconfiguration persists. Query endpoint configuration management (GPO reporting, Intune, SCCM) across the fleet for hosts where RestrictDriverInstallationToAdministrators is absent or set to 0, and where NoWarningNoElevationOnInstall or UpdatePromptSettings permit non-admin driver installation. These are the residual, config-only exposure even on fully-patched code.
Hypothesis 3 — Spooler exposed where it shouldn't be. Enumerate domain controllers and servers with no legitimate print function where the Spooler service is still running (a common oversight after the immediate 2021 remediation window closed and operational pressure eased). This is the single highest-value, lowest-effort finding a hunt team can produce for this vulnerability family.
Because this is a five-CVE lineage rather than a single patch, "patched" only means something if all five generations are applied — an environment current only through the 2021 emergency patches remains exposed to SpoolFool and the 2024 race-condition variant. Given the historical pattern of driver-install regressions accompanying these patches, apply to a representative pilot group (including any legacy print-server infrastructure) before fleet-wide deployment, but do not delay deployment indefinitely — the EPSS score (0.998) reflects sustained, near-certain scanning and exploitation attempts against unpatched hosts.
RestrictDriverInstallationToAdministrators = 1 via GPO on every host where the Spooler must remain enabled, and confirm Point-and-Print's NoWarningNoElevationOnInstall / UpdatePromptSettings keys are not silently re-permitting non-admin driver installs.\pipe\spoolss) at the host firewall for any system where the Spooler cannot be disabled outright.| Port | Proto | Service | Vulnerable Condition | Notes |
|---|---|---|---|---|
| 445 | TCP | SMB / Microsoft-DS | MS-RPRN/MS-PAR reachable via named pipe \PIPE\spoolss over SMB | Primary real-world exploitation path inside AD environments — most orgs already permit 445 between domain members |
| 135 | TCP | MSRPC (Endpoint Mapper) | Discloses registered MS-RPRN/MS-PAR interface bindings and the dynamic port they resolve to | Must never be internet-exposed; internal network segmentation is the primary control, per CISA ED 21-04 |
| 139 | TCP | NetBIOS Session Service | Legacy SMB transport — alternate path to the same \PIPE\spoolss named pipe as port 445 | Same exposure risk as 445; disable where legacy NetBIOS/SMB1 is not operationally required |
| 49152–65535 | TCP | MSRPC (dynamic ncacn_ip_tcp endpoint) | Direct RPC/TCP binding to MS-PAR once resolved via the port 135 endpoint mapper | Varies per host/boot; frequently missed by firewall rules that only enumerate well-known ports 135/445 |
Presence of both MS-RPRN and MS-PAR bindings confirms the Spooler service is running and network-reachable — a necessary precondition for exploitation — but is not sufficient to confirm vulnerability, since both interfaces remain identically registered and enumerable on fully-patched hosts. This is the single most important operational lesson in this section: for PrintNightmare, network reconnaissance identifies attack-surface candidates, not patch status. Patch-level ground truth requires endpoint-level inventory (confirming KB5004945 and each subsequent cumulative update through 2024-08-13 is installed), not a remote scan of any kind.
Version not reliably discriminated via banner. The interface-binding response is byte-for-byte identical before and after applying KB5004945 or any subsequent PrintNightmare-family patch, because Microsoft's fix validates the caller's authorization inside the RPC method implementation rather than changing the interface's advertised UUID, provider, or version. This is the clearest illustration in this card of why banner-based vulnerability scanning cannot detect PrintNightmare patch status — see the NSE and detection-tooling discussion below for the practical consequence.
No dedicated built-in NSE script exists for any CVE in the PrintNightmare family (CVE-2021-1675, CVE-2021-34527, CVE-2021-34481, CVE-2022-21999, CVE-2024-38198) as of this compile. Community-maintained, non-NSE tooling fills the gap instead: Impacket's rpcdump.py (interface enumeration, shown above), the standalone Python subnet scanner "ItWasAllADream" (tests exploitability over MS-PAR/MS-RPRN across a CIDR range and generates a CSV report), and cube0x0's CVE-2021-1675 Impacket/C# reference implementation, which doubles as a practical vulnerability-confirmation tool when run against a non-production target. None of these are nmap-native, and all require separate installation.