A ghost DLL in a public hallway that any visitor can swap for a master key
CVE-2026-66804 is a local privilege escalation in the Windows Cross Device Service — the background plumbing behind Phone Link, clipboard sync, and cross-device file sharing. The flaw is a dangling COM registration: the system-wide COM class {E9F83CF2-E0C0-4CA7-AF01-E90C70BEF496} points its InProcServer32 at %PROGRAMDATA%\CrossDevice\CrossDevice.Streaming.Source.dll, a path that does not exist on default installations. Because C:\ProgramData is writable by all authenticated users, any standard account can create the directory and drop a payload DLL. When the Windows Camera FrameServer service instantiates the COM object — trivially triggered via Media Foundation virtual-camera APIs — it loads the attacker's DLL as NT AUTHORITY\LOCAL SERVICE. From there, the token's enabled SeImpersonatePrivilege feeds a potato-class exploit (SigmaPotato or GodPotato variant) to obtain NT AUTHORITY\SYSTEM. This is a patch bypass for CVE-2026-50343 ('Dark Elevator'), where July 2026's fix closed the InstallService registry weakness but left this dangling COM registration untouched. Affected: Windows 10 22H2 (< build 19045.7663), Windows 11 24H2 (< 26100.9168), Windows 11 25H2 (< 26200.9168), Windows 11 26H1 (< 28000.2704).
Microsoft rates this Important / HIGH 7.8, and the score is honest. The CVSS vector AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H correctly captures the local-only attack vector, trivial complexity, and full SYSTEM impact. Two fully weaponized GitHub PoCs and a detailed Google Project Zero writeup have moved exploitation from theoretical to script-kiddie accessible. The vendor's temporal metrics still mark exploitability as 'Unproven' (E:U), which is now stale — functional exploit code is public. Despite that lag, the base score of 7.8 remains fair: the local-access prerequisite is a real gate and the blast radius is per-host, not fleet-scale.
5 steps from start to impact.
Obtain standard-user code execution on target
- Local or remote-to-local access as a low-privilege user on a Windows 10 22H2 or Windows 11 host
- Requires a prior initial-access step — the attacker must already be on the box
- Organizations with strong email gateways, MFA on RDP, and endpoint hardening raise this bar significantly
Verify dangling COM registration
HKLM\SOFTWARE\Classes\CLSID\{E9F83CF2-E0C0-4CA7-AF01-E90C70BEF496}\InProcServer32 to confirm it points to %PROGRAMDATA%\CrossDevice\CrossDevice.Streaming.Source.dll and that the directory does not exist. Both PoCs (DavidCarliez, Rat5ak) automate this check. On unpatched default installs, both conditions are met 100% of the time.- COM class registered with InProcServer32 pointing to ProgramData (default on unpatched Win10 22H2/Win11)
- C:\ProgramData\CrossDevice directory absent (default state)
- Virtually none — this is the default configuration on every affected OS version
Plant malicious DLL in ProgramData
C:\ProgramData\CrossDevice\ and drops a crafted CrossDevice.Streaming.Source.dll implementing the virtual-camera COM interface. The DLL's DllGetClassObject entry point contains the payload. This is a simple mkdir + file-copy operation requiring no elevation — ProgramData default ACLs grant Authenticated Users create-subfolder and write permissions.- Write access to C:\ProgramData (default for all authenticated users)
- EDR products monitoring DLL creation in ProgramData subdirectories may flag this — CrowdStrike, SentinelOne, and Defender for Endpoint all have heuristics for suspicious DLL drops
- WDAC or AppLocker in enforced mode blocking unsigned DLLs in ProgramData would stop this step cold
.dll in C:\ProgramData\CrossDevice\; EDR file-write telemetry; YARA rules on unsigned PE files in ProgramDataTrigger Camera FrameServer DLL load
MFEnumDeviceSources with MF_DEVSOURCE_ATTRIBUTE_SOURCE_TYPE_VIDCAP_CATEGORY), which causes the Camera FrameServer service (svchost.exe -k FrameServerGroup) to instantiate the registered COM class. The service calls CoCreateInstance on the dangling CLSID, loading the attacker's DLL into a session-0 process running as NT AUTHORITY\LOCAL SERVICE. Both public PoCs bundle this trigger — DavidCarliez embeds VCamSample, Rat5ak uses a minimal MF API harness.- Camera FrameServer service running (default on all affected SKUs)
- Media Foundation APIs callable by standard users (default)
- Virtually none — the service is always running and the APIs are accessible to any user session
Escalate LOCAL SERVICE → SYSTEM via SeImpersonatePrivilege
NT AUTHORITY\LOCAL SERVICE with SeImpersonatePrivilege enabled. The payload uses a potato-class exploit — DavidCarliez embeds SigmaPotato 1.2.6, Rat5ak uses a GodPotato-derived OXID resolver + named-pipe impersonation chain — to capture a SYSTEM token and spawn an elevated process. The result is an interactive or non-interactive NT AUTHORITY\SYSTEM shell. The entire chain from user click to SYSTEM takes under 3 seconds.- LOCAL SERVICE token with SeImpersonatePrivilege (always enabled for FrameServer)
- Potato-family exploits are well-studied by EDR vendors — CrowdStrike Falcon, SentinelOne, Microsoft Defender for Endpoint all have behavioral detections for OXID resolver abuse, named-pipe impersonation, and suspicious token manipulation
- Windows Defender Credential Guard limits the value of SYSTEM on hardened hosts
mkdir C:\ProgramData\CrossDevice && icacls C:\ProgramData\CrossDevice /inheritance:r /grant:r SYSTEM:(OI)(CI)F /grant:r Administrators:(OI)(CI)F /grant:r "Authenticated Users":(OI)(CI)RXHKLM\SOFTWARE\Classes\CLSID\{E9F83CF2-E0C0-4CA7-AF01-E90C70BEF496} entirely. This eliminates the attack path at step 4 — FrameServer will never attempt to load the nonexistent DLL. Deploy within 30 days per the noisgate mitigation SLA. Caution: this may break Phone Link virtual camera features until the August patch is applied. Requires SYSTEM or admin privileges to modify HKLM.C:\ProgramData\*. This prevents step 4 even if the attacker plants the DLL. Apply within 30 days. Note: DLL enforcement in AppLocker requires Enterprise SKU and has a performance overhead; WDAC is preferred on modern Windows 11.SeImpersonatePrivilege usage by non-system services. CrowdStrike, SentinelOne, and Defender for Endpoint all ship rules for GodPotato/SigmaPotato patterns. This catches step 5 but does not prevent DLL loading — it is a detect-only control.- UAC hardening — The exploit operates entirely within standard-user permissions for the DLL planting steps; no UAC prompt is involved. The privilege escalation occurs inside a system service, not via a UAC elevation request.
- Network firewalls or segmentation — CVE-2026-66804 is a purely local privilege escalation with no network component. Blocking ports or isolating VLANs has zero effect on this attack path.
- Disabling the Windows Camera app — The Camera FrameServer (
svchost.exe -k FrameServerGroup) is a separate OS service from the Camera UWP app. Uninstalling the Camera app does not stop the FrameServer service from loading registered virtual-camera COM DLLs when triggered via Media Foundation APIs. - Credential Guard alone — While Credential Guard protects LSASS secrets, a SYSTEM shell can still tamper with EDR agents, install persistence, access local SAM hashes, read DPAPI blobs, and abuse machine account credentials for lateral movement.
The supporting signals.
| In-the-wild exploitation | No confirmed in-the-wild exploitation. Microsoft's advisory (Aug 11, 2026) states 'Exploitation Less Likely.' Not listed on CISA KEV. No campaigns attributed to this CVE by Mandiant, CrowdStrike, or Talos as of October 2026. |
|---|---|
| Proof of concept | Multiple functional public PoCs. DavidCarliez/CVE-2026-66804-CrossDevice-LPE — bundles SigmaPotato 1.2.6 and VCamSample; one-click user→SYSTEM. Rat5ak/CVE-2026-66804-CrossDevice-Service-EoP — GodPotato-derived chain, tested on Win11 26200.8524. Google Project Zero provided a detailed technical writeup with exploit methodology (Forshaw, Sep 2026). |
| EPSS | 0.00298 (0.298%) — low exploitation probability in the next 30 days. Likely reflects the local-only vector and absence of in-the-wild activity. May lag behind PoC publication. |
| CISA KEV | Not listed. No known deadline or binding directive. |
| CVSS vector | CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H — Local attack vector (no remote), low complexity (deterministic), low privilege (standard user), no user interaction, unchanged scope, full CIA impact. Temporal: E:U/RL:O/RC:C per Microsoft (E:U is stale — PoCs are public). |
| Affected versions | Windows 10 22H2 (all editions), Windows 11 24H2 (x64/ARM64), Windows 11 25H2 (x64/ARM64), Windows 11 26H1 (x64/ARM64). Windows Server SKUs are not affected — Cross Device Service is a workstation feature. |
| Fixed versions | Win10 22H2: KB5120249 (build 19045.7663) · Win11 24H2: KB5121003 (build 26100.9168) or hotpatch KB5120994 · Win11 25H2: KB5121003 (build 26200.9168) or hotpatch KB5120994 · Win11 26H1: KB5121000 (build 28000.2704). All released August 11, 2026. |
| Internet exposure | Not applicable. This is a purely local privilege escalation — no network attack vector. GreyNoise, Shodan, and Censys scanning data are irrelevant. The threat is post-initial-access only. |
| Disclosure timeline | Original Dark Elevator (CVE-2026-50343) reported May 20, 2026, patched July 2026. Bypass (this CVE) reported by Daniel Wade (nadsec) as MSRC Case 119805 / VULN-192287. Microsoft advisory published August 11, 2026, updated August 14. Project Zero blog by James Forshaw published September 2026. |
| Researchers | Daniel Wade (nadsec) — original reporter of the dangling COM bypass via MSRC. James Forshaw (Google Project Zero) — variant analysis and custom COM marshaling technique. Calif.io — original Dark Elevator (CVE-2026-50343) research. |
Sources.
- MSRC Advisory (via CIRCL Vulnerability Lookup)
- NVD — CVE-2026-66804
- Google Project Zero — Windows Dangling COM Object Registrations
- Cyber Kendra — Dark Elevator Incomplete Fix Analysis
- DavidCarliez PoC — CVE-2026-66804-CrossDevice-LPE
- Rat5ak PoC — CVE-2026-66804-CrossDevice-Service-EoP
- Mallory.ai — Windows CrossDevice COM Flaw Analysis
- SentinelOne Vulnerability Database
Why this verdict
- Trivial, deterministic exploitation — Two fully weaponized PoCs on GitHub chain DLL planting → FrameServer COM load → SigmaPotato/GodPotato SYSTEM shell. No memory corruption, no race condition, works every time from a standard user account in under 3 seconds. The exploit complexity is *below* what AV:L/AC:L models — this is as easy as a local privesc gets.
- Massive workstation attack surface — Affects every unpatched Windows 10 22H2 and Windows 11 machine. The
C:\ProgramData\CrossDevicedirectory is absent by default, the dangling COM registration is present by default, andProgramDatagrants Authenticated Users write access. Preconditions are met on effectively 100% of vulnerable hosts with no attacker effort. - Role multiplier: workstation-only, host-level blast radius — Cross Device Service is a consumer/workstation feature absent from all Windows Server SKUs. On workstations (≥95% of the affected installed base), SYSTEM compromise enables credential harvesting (Mimikatz, DPAPI), EDR agent tampering, and persistence — these are meaningful attack-chain enablers but the blast radius per-exploitation is *host-level*, not domain or fleet. Admin workstations and PAWs (<1% of fleet) are the highest-value role, where SYSTEM can pivot to domain admin — but additional steps and controls separate this CVE from that outcome. No canonically high-value infrastructure role is affected; the floor rule does not elevate above HIGH.
Why not higher?
This cannot be CRITICAL because exploitation requires the attacker to already have local code execution on the target workstation — a non-trivial prerequisite that implies a prior initial-access chain. The blast radius is confined to the individual host; there is no remote vector, no wormability, and no direct path to domain compromise. Windows Server SKUs, domain controllers, and all canonically high-value infrastructure roles are unaffected because the Cross Device Service is not present on server editions.
Why not lower?
Dropping to MEDIUM would undervalue the practical threat. The exploit is fully public, deterministic, requires zero user interaction, and achieves total host compromise (SYSTEM) from any standard user account. The affected population is enormous — every Windows 10/11 workstation. This is a textbook 'post-access force multiplier' that any red team or commodity malware author will integrate. Multiple working PoCs, a patch-bypass lineage, and trivial preconditions all argue against downgrading below HIGH.
Crowdsourced verification payload.
Run on each target Windows host from any user session (no elevation required). Save as Check-CVE202666804.ps1 and invoke: powershell -ExecutionPolicy Bypass -File .\Check-CVE202666804.ps1. Exit code 0 = PATCHED, 1 = VULNERABLE, 2 = UNKNOWN.
#Requires -Version 5.1
# CVE-2026-66804 - Windows Cross Device Service LPE Vulnerability Check
# Run on target Windows host as any user. No elevation required.
# Exit codes: 0 = PATCHED, 1 = VULNERABLE, 2 = UNKNOWN
$ErrorActionPreference = 'SilentlyContinue'
$clsid = '{E9F83CF2-E0C0-4CA7-AF01-E90C70BEF496}'
$regKey = "HKLM:\SOFTWARE\Classes\CLSID\$clsid\InProcServer32"
$plantDir = Join-Path $env:ProgramData 'CrossDevice'
$plantDll = Join-Path $plantDir 'CrossDevice.Streaming.Source.dll'
Write-Host '=== CVE-2026-66804 Vulnerability Check ==='
# --- OS info ---
$nv = Get-ItemProperty 'HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion'
$build = [int]$nv.CurrentBuildNumber
$ubr = [int]$nv.UBR
$ver = $nv.DisplayVersion
Write-Host "OS: Windows $ver Build $build.$ubr"
# --- Patched-build lookup (August 2026 cumulative updates) ---
$minUBR = @{
19045 = 7663 # Win10 22H2 KB5120249
26100 = 9168 # Win11 24H2 KB5121003
26200 = 9168 # Win11 25H2 KB5121003
28000 = 2704 # Win11 26H1 KB5121000
}
if ($minUBR.ContainsKey($build) -and $ubr -ge $minUBR[$build]) {
Write-Host "PATCHED - Build $build.$ubr includes the August 2026 fix."
exit 0
}
# --- Check COM registration ---
if (-not (Test-Path $regKey)) {
Write-Host "PATCHED - COM class $clsid InProcServer32 key not found."
exit 0
}
$val = (Get-ItemProperty $regKey -Name '(Default)').'(Default)'
if ([string]::IsNullOrEmpty($val)) {
Write-Host 'UNKNOWN - COM registration exists but default value is empty.'
exit 2
}
$resolved = [Environment]::ExpandEnvironmentVariables($val)
if ($resolved -notlike '*ProgramData*CrossDevice*') {
Write-Host 'PATCHED - InProcServer32 no longer points to writable ProgramData path.'
Write-Host " Current path: $resolved"
exit 0
}
# --- Check for planted DLL (possible active exploitation) ---
if (Test-Path $plantDll) {
$sig = Get-AuthenticodeSignature $plantDll
if ($sig.Status -eq 'Valid' -and $sig.SignerCertificate.Subject -like '*Microsoft*') {
Write-Host 'UNKNOWN - DLL present and Microsoft-signed. Manual review needed.'
exit 2
}
Write-Host "VULNERABLE - ALERT: Non-Microsoft DLL found at $plantDll"
Write-Host ' This may indicate active exploitation. Investigate immediately.'
exit 1
}
# --- Vulnerable: dangling registration, no patch ---
Write-Host 'VULNERABLE - Dangling COM registration found:'
Write-Host " CLSID: $clsid"
Write-Host " Path: $resolved"
Write-Host ' Directory absent. Any standard user can plant a payload for SYSTEM execution.'
exit 1