← Back to Feed CACHED · 2026-10-06 19:26:29 · CACHE_KEY CVE-2026-50343
CVE-2026-50343 · CWE-269 · Disclosed 2026-07-14

Windows InstallService Local Privilege Escalation via StaticPluginMap Registry Hijack

ASSESSED — NOISGATE
Vendor
—
—
—
Reassessed
—
—
—
Verdict: —
Do you agree?
01 · The Real Story

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.

"Reliable user-to-SYSTEM LPE with public PoC. Patch now; DCs and servers are the real risk."
02 · The Attack Path

5 steps from start to impact.

STEP 01

Obtain standard-user shell on target

The attacker needs an interactive session or command execution context running as a standard (non-admin) user on a Windows host. This can come from phishing, lateral movement with stolen credentials, a compromised service account, or RDP access. No administrator rights are needed — any domain user or local user account suffices.
Conditions required:
  • Local or remote interactive logon as a standard user
  • Target runs an affected, unpatched Windows build
Where this breaks in practice:
  • 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
Detection/coverage: EDR telemetry on process creation, RDP logon events (Event ID 4624 type 10), lateral movement detections
STEP 02

Write malicious StaticPluginMap registry value

The attacker writes a registry value under 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.
Conditions required:
  • Write access to the InstallService State registry key (present by default on unpatched systems)
Where this breaks in practice:
  • 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
Detection/coverage: Sysmon Event ID 13 (Registry value set) on the InstallService\State path; CrowdStrike, Defender for Endpoint, and SentinelOne all generate alerts on HKLM writes by non-admin processes
STEP 03

Plant payload DLL in writable ProgramData path

The attacker drops a malicious DLL to the %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.
Conditions required:
  • Write access to the target path under %PROGRAMDATA% (default on Windows)
  • Ability to drop a file to disk (not blocked by application control)
Where this breaks in practice:
  • 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
Detection/coverage: EDR file-creation alerts; WDAC/AppLocker audit-mode logs; Defender AV real-time scanning of new DLLs
STEP 04

Trigger InstallService plugin load

The attacker calls 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.
Conditions required:
  • InstallService must be running (it is by default on all affected Windows)
  • The COM activation path must not be blocked by a security product
Where this breaks in practice:
  • 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
Detection/coverage: Sysmon Event ID 7 (Image loaded) showing an unsigned DLL loaded by svchost.exe hosting InstallService; process-injection detections in EDR
STEP 05

Execute as SYSTEM

With code running inside a Microsoft-signed SYSTEM process, the attacker can create privileged local accounts, dump credentials (SAM, LSA secrets, cached domain creds), install services for persistence, disable security agents, access other users' data, and pivot laterally. On a domain controller, SYSTEM equates to domain admin — the attacker can perform DCSync, modify AD objects, or issue Golden Tickets.
Conditions required:
  • Successful DLL load in step 4
Where this breaks in practice:
  • Credential-dumping tools (Mimikatz, nanodump) are signature-detected by most EDR
  • Post-exploitation lateral movement generates network telemetry detectable by NDR
Detection/coverage: Credential access alerts (LSASS access); service creation events (Event ID 7045); EDR behavioral detections for SYSTEM-context post-exploitation
03 · Compensating Control

1
HIGH 7.8→LOW 3.1
SEVERITY REDUCED
Lock down InstallService State registry ACLs — Remove write permissions for 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.
2
HIGH 7.8→LOW 2.5
SEVERITY REDUCED
Enforce WDAC or AppLocker DLL rules — Deploy a Windows Defender Application Control (WDAC) policy or AppLocker DLL rules that restrict DLL loading in SYSTEM processes to Microsoft-signed or enterprise-signed binaries only. This blocks step 3 (DLL planting) even if the registry write succeeds. Requires testing against line-of-business applications. Deploy within 30 days.
3
HIGH 7.8→MEDIUM 5.5
SEVERITY REDUCED
Enable Sysmon or EDR registry monitoring on InstallService paths — Deploy Sysmon with a configuration that logs Event ID 13 for registry writes under 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.
4
HIGH 7.8→IGNORE 0.0
SEVERITY REDUCED
Apply July 2026 cumulative updates — Install the relevant KB (KB5099536/KB5099538/KB5099539/KB5099540/KB5101649/KB5101650) for your Windows version. This is the definitive fix — Microsoft corrected both the registry ACLs and the COM registration path. Deploy within 180 days per the noisgate remediation SLA for HIGH, but prioritize DCs, AD CS servers, and Hyper-V hosts within 30 days.
What doesn't work
  • 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.
04 · Intelligence Metadata

The supporting signals.

In-the-Wild StatusNo 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-ConceptMultiple 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.
EPSS0.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 VectorCVSS: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 VersionsWindows 10 1809, 21H2, 22H2; Windows 11 24H2, 25H2, 26H1; Windows Server 2019, 2022, 2025. Essentially every supported Windows release.
Fixed Versions / KBsJuly 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 / ExposureNot 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 TimelineReported 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 ResearcherCalif.io research team, published under their MADBugs program. Technical write-up: Dark Elevator.
Related WorkGoogle 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.

  1. Microsoft Security Advisory
  2. Calif.io - Dark Elevator Write-up
  3. Calif.io GitHub PoC Repository
  4. SecurityOnline - Public Exploit Code Released
  5. Rapid7 Vulnerability Database
  6. Qualys July 2026 Patch Tuesday Review
  7. Check Point IPS Advisory CPAI-2026-8456
  8. Rat5ak GitHub PoC
05 · The Call

Final Verdict
= UNCHANGED to HIGH (7.8/10)

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:L means 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.

06 · Verification

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

noisgate-verify.ps1
POWERSHELLREAD-ONLYSAFE
#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
}