Leaving the service elevator key under the doormat so any tenant can ride it to the penthouse
CVE-2026-50343, nicknamed Dark Elevator by its discoverer Calif.io, is a local privilege escalation in the Windows InstallService (InstallService). The service runs as NT AUTHORITY\SYSTEM inside svchost.exe and decides which fulfillment plugin DLL to load by reading a StaticPluginMap registry key under HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\InstallService\State. That key ships with ACLs that let any standard interactive user create subkeys and write values. A second flaw compounds the first: a Windows-shipped CrossDevice COM class registers its InprocServer32 DLL at a path under %PROGRAMDATA% where unprivileged users can plant files. By writing a crafted registry value that points InstallService at the attacker-controlled COM class and then triggering AppInstallManager.SearchForAllUpdatesAsync(), a normal user gets the SYSTEM service to load their DLL — no memory corruption, no UAC prompt, no reboot. Every supported Windows desktop and server release is affected: Windows 10 1809/21H2/22H2, Windows 11 24H2/25H2/26H1, and Windows Server 2019/2022/2025. The fix shipped in the July 2026 Patch Tuesday cumulative updates.
Microsoft rated this HIGH at CVSS 7.8, and that score is honest. The AV:L/PR:L requirements mean an attacker must already have a local shell as a standard user — this is post-initial-access, not an internet-facing entry point. However, the exploit is a pure logic bug with 100% reliability, a full public PoC with prebuilt binaries is available on GitHub, and the blast radius on high-value targets (domain controllers, AD CS servers, Hyper-V hosts) is domain-takeover-grade. The vendor severity accurately reflects the technical reality; the public weaponization makes urgency higher than EPSS alone would suggest.
5 steps from start to impact.
Obtain standard-user shell on target
- Local or remote interactive logon as a standard user
- Target runs an affected, unpatched Windows build
- Requires prior compromise or authorized insider access — this is inherently a post-initial-access technique
- EDR agents detect common initial-access payloads (phishing droppers, LOLBin abuse) before the attacker reaches this step
Write malicious StaticPluginMap registry value
HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\InstallService\State\PlugInList or StaticPluginMap that points to a COM CLSID they control. Because the ACLs on this key incorrectly grant BUILTIN\Users write access, no elevation is needed. The Calif.io PoC automates this with a stager binary.- Write access to the InstallService State registry key (present by default on unpatched systems)
- Registry modification under HKLM by a standard user is an anomalous event that well-tuned SIEM rules will flag
- Some hardened environments use registry auditing policies (SACL) on HKLM hives
Plant payload DLL in writable ProgramData path
%PROGRAMDATA% subdirectory where the CrossDevice COM class expects its InprocServer32 binary. Standard users have write access to this path by default. The DLL can be any payload — reverse shell, beacon, credential dumper — compiled as a COM-compatible in-process server.- Write access to the target path under %PROGRAMDATA% (default on Windows)
- Ability to drop a file to disk (not blocked by application control)
- Application control policies (WDAC, AppLocker) that restrict DLL loading to signed binaries will block the planted DLL
- EDR file-write telemetry flags new unsigned DLLs in ProgramData
Trigger InstallService plugin load
AppInstallManager.SearchForAllUpdatesAsync() via COM or uses the PoC stager to trigger InstallService to re-read its plugin map. The service follows the attacker-written registry value, resolves the COM CLSID, and loads the planted DLL into its own svchost.exe SYSTEM process. Code execution as SYSTEM is achieved.- InstallService must be running (it is by default on all affected Windows)
- The COM activation path must not be blocked by a security product
- If the planted DLL is unsigned, Defender SmartScreen or AV may quarantine it before load
- Some EDR products hook COM activation and flag unusual InprocServer32 loads in SYSTEM processes
Execute as SYSTEM
- Successful DLL load in step 4
- Credential-dumping tools (Mimikatz, nanodump) are signature-detected by most EDR
- Post-exploitation lateral movement generates network telemetry detectable by NDR
BUILTIN\Users and Authenticated Users on HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\InstallService\State and its subkeys. This directly breaks step 2 of the attack chain by preventing the registry write. Apply via Group Policy (Registry security template) or a SCCM compliance baseline. Deploy within 30 days per the noisgate mitigation SLA for HIGH.HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\InstallService\State, and Event ID 7 for unsigned DLL loads by svchost.exe. Feed to SIEM with alerting rules. This does not prevent exploitation but provides near-real-time detection. Deploy within 30 days.- UAC hardening — The exploit does not trigger UAC at any step. The attacker writes to HKLM via permissive ACLs (not elevation), and the DLL is loaded by a service, not by the user's process. UAC level settings are irrelevant.
- Network segmentation / firewall rules — This is a local privilege escalation. Network controls do not affect the attack path since everything happens on-host between user-mode processes, the registry, and a SYSTEM service.
- Credential Guard — While Credential Guard protects LSASS-held domain credentials from post-exploitation dumping, it does not prevent the SYSTEM shell itself. The attacker still achieves SYSTEM and can abuse it for persistence, service installation, and local data access.
- Disabling Windows Update service — InstallService is a separate service from Windows Update (wuauserv). Disabling Windows Update does not stop InstallService from running or being exploitable.
The supporting signals.
| In-the-Wild Status | No confirmed exploitation in the wild. Not listed in CISA KEV as of 2026-10-07. However, SecurityOnline notes that LPE chains with published PoCs tend to reach commodity toolkits quickly. |
|---|---|
| Proof-of-Concept | Multiple public PoCs available. califio/publications contains full source, build scripts, and prebuilt binaries. Rat5ak/CVE-2026-50343-InstallService-EoP is a standalone reimplementation. At least 3 PoC repos tracked on GitHub. |
| EPSS | 0.00298 (0.3%) — low probability of exploitation in the next 30 days per FIRST EPSS model. Rapid7 reports ~3%. Either way, below the 90th percentile, but public PoC availability may not yet be reflected in the score. |
| CVSS Vector | CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H — Local attack vector, low complexity, low privileges required, no user interaction, full CIA impact. Temporal: E:F/RL:O/RC:C (Functional exploit, Official fix, Confirmed). |
| Affected Versions | Windows 10 1809, 21H2, 22H2; Windows 11 24H2, 25H2, 26H1; Windows Server 2019, 2022, 2025. Essentially every supported Windows release. |
| Fixed Versions / KBs | July 2026 Patch Tuesday: KB5099538 (Win10 1809 / Server 2019), KB5099539 (Win10 21H2/22H2), KB5099540 (Server 2022), KB5101649 (Win11 26H1), KB5101650 (Win11 24H2/25H2), KB5099536 (Server 2025). |
| Scanning / Exposure | Not remotely exploitable — no Shodan/GreyNoise/Censys exposure data applies. Vulnerability scanners (Qualys QID, Tenable plugin, Rapid7 content) detect missing KBs via authenticated scans. Check Point released IPS signature CPAI-2026-8456. |
| Disclosure Timeline | Reported to Microsoft: 2026-05-20. Patch released: 2026-07-14 (July Patch Tuesday). Public PoC and write-up by Calif.io: 2026-08-04. |
| Reporting Researcher | Calif.io research team, published under their MADBugs program. Technical write-up: Dark Elevator. |
| Related Work | Google Project Zero published Windows Exploitation Techniques: Dangling COM Object Registrations in September 2026, covering the same class of COM registration hijack primitives. CVE-2026-66804 is a related dangling COM bug. |
Sources.
Why this verdict
- Public weaponized PoC with prebuilt binaries — Calif.io and at least two GitHub repos provide complete, compile-and-run exploit code. The exploit is a pure logic bug with 100% reliability, no memory corruption, and no race conditions. This compresses time-to-commodity-adoption significantly.
- Attacker position is post-initial-access —
AV:L/PR:Lmeans the attacker already has a standard-user shell. This is not an entry vector; it is a privilege-escalation step in a multi-stage chain. This inherently limits the reachable population to hosts that are already partially compromised. - Universal Windows footprint but local-only reach — Every supported Windows desktop and server is affected, meaning the vulnerability is present on virtually 100% of enterprise endpoints. However, exploitation requires per-host local execution, not a single remote spray.
- Role multiplier: On workstations (majority of the install base), user-to-SYSTEM grants credential dumping, persistence, and lateral-movement staging — blast radius is host-level, elevated to domain-level if cached domain admin creds are present. On domain controllers (Windows Server with AD DS, ~2-5% of Windows Server installs, well above 1% threshold), SYSTEM = domain admin equivalent — the chain ends in DCSync, Golden Ticket, or direct AD object manipulation, yielding domain/fleet-scale blast radius. On AD CS servers, SYSTEM enables certificate theft and rogue issuance. On Hyper-V hosts, SYSTEM on the parent partition can access guest VMs. The DC/ADCS role outcome floors the verdict at HIGH.
- No in-the-wild exploitation yet — Not KEV-listed, EPSS is 0.3%, no threat intel reporting active campaigns. This prevents an upgrade to CRITICAL despite the PoC quality.
- Friction from EDR coverage — Modern EDR products (CrowdStrike, MDE, SentinelOne) detect the registry write, unsigned DLL load in SYSTEM svchost, and post-exploitation credential access. This provides meaningful detection-layer friction in well-defended environments.
Why not higher?
An upgrade to CRITICAL would require either confirmed in-the-wild exploitation, a remotely reachable attack surface, or the affected component being *canonically* a high-value-role-only product (≥10% of installs in high-value roles). While Windows Server runs on DCs, the InstallService vulnerability affects all Windows equally — DCs represent a small fraction of the total install base. The local-access prerequisite means this cannot be mass-exploited remotely, and no active campaigns have been observed.
Why not lower?
A downgrade below HIGH would ignore the domain-takeover blast radius on DCs and AD CS servers, the 100%-reliable public PoC with prebuilt binaries, and the universal Windows footprint. The floor rule applies: the DC role outcome (domain takeover) with DCs representing ≥1% of Windows Server installs anchors the verdict at HIGH. Additionally, the pure-logic nature of the exploit means it will not age out — it works on every boot until patched.
Crowdsourced verification payload.
Run this script on each target Windows host with standard user privileges (no admin required for the registry ACL check; Get-HotFix may need admin). Invoke: powershell -ExecutionPolicy Bypass -File .\Check-CVE-2026-50343.ps1. Returns exit code 0 (PATCHED), 1 (VULNERABLE), or 2 (UNKNOWN).
#Requires -Version 5.1
<#
.SYNOPSIS
CVE-2026-50343 (Dark Elevator) - Vulnerability Check
.DESCRIPTION
Checks for July 2026 patch KBs and validates InstallService
registry ACLs to determine if the host is vulnerable.
#>
[CmdletBinding()]
param()
$ErrorActionPreference = 'SilentlyContinue'
$fixKBs = @('KB5099536','KB5099538','KB5099539','KB5099540','KB5101649','KB5101650')
$regPath = 'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\InstallService\State'
# --- Check 1: Patch KB installed? ---
try {
$hotfixes = (Get-HotFix | Select-Object -ExpandProperty HotFixID) 2>$null
$matched = $fixKBs | Where-Object { $hotfixes -contains $_ }
if ($matched) {
Write-Host "PATCHED - July 2026 fix KB detected: $($matched -join ', ')"
exit 0
}
} catch {
# Get-HotFix may fail without admin; continue to registry check
}
# --- Check 2: Registry key ACL ---
if (Test-Path $regPath) {
try {
$acl = Get-Acl -Path $regPath
$writableByUsers = $acl.Access | Where-Object {
($_.IdentityReference.Value -match '(?i)(BUILTIN\\Users|Everyone|Authenticated Users|INTERACTIVE)') -and
($_.AccessControlType -eq 'Allow') -and
(($_.RegistryRights -band 2) -ne 0) # SetValue = 2
}
if ($writableByUsers) {
$identities = ($writableByUsers | ForEach-Object { $_.IdentityReference.Value }) -join ', '
Write-Host "VULNERABLE - InstallService State key writable by: $identities. No July 2026 patch KB found."
exit 1
} else {
Write-Host "PATCHED - InstallService State registry ACLs are restrictive (no standard-user write)."
exit 0
}
} catch {
Write-Host "UNKNOWN - Could not read ACL on $regPath : $_"
exit 2
}
} else {
Write-Host "UNKNOWN - Registry path $regPath not found. InstallService may not be present."
exit 2
}