Someone left a SYSTEM-privileged valet key inside a wallet nobody asked for
CVE-2026-49176 is a local elevation-of-privilege vulnerability in the Windows WalletService, the inbox service that manages secure tokens and payment credentials on Windows 10, Windows 11, and Windows Server 2016+ with Desktop Experience. The flaw is classified as CWE-59 (Improper Link Resolution Before File Access), meaning a low-privileged local user can create an NTFS junction or object-directory symlink that tricks WalletService — running as LocalSystem — into performing a privileged file operation on an attacker-controlled path. Successful exploitation yields NT AUTHORITY\SYSTEM on the local host. The service ships with Manual startup and is stopped by default, so exploitation likely requires triggering the service first. All currently-supported Windows client and server editions with Desktop Experience are affected; Server Core is not impacted. Microsoft patched it in the July 14, 2026 cumulative update.
Microsoft rated this Important / 7.8, which is the standard CVSS envelope for any local-access, low-privilege, no-interaction EoP that lands SYSTEM. That score is mechanically accurate but doesn't reflect real-world risk for an enterprise fleet. The vulnerability requires the attacker to already have code execution on the target machine (AV:L), there is no public proof-of-concept, no active exploitation, the EPSS is a paltry 0.4%, and the affected service is a consumer-grade wallet helper — not a domain controller role, not a security agent, not a hypervisor. The vendor severity oversells urgency; this is standard patch-cycle material, not emergency remediation.
5 steps from start to impact.
Obtain local code execution
- Low-privileged local session on a Windows 10/11 or Server Desktop Experience host
- Requires prior compromise — phishing, credential theft, or lateral movement already succeeded
- EDR / endpoint protection should flag initial access payloads
Ensure WalletService is running
svchost.exe to load WalletService.dll into a shared-process host running as LocalSystem. This is a low bar but adds a step.- WalletService binary (
WalletService.dll) present on the target OS - Ability to trigger service start as a low-privilege user
- On Server Core installs, WalletService is not present — the entire attack surface is absent
- Organizations that have disabled WalletService via GPO or Intune are immune
Create symlink / junction redirection
\RPC Control, to construct a pseudo-symlink. This redirects a privileged file operation that WalletService will perform (write, move, or delete) from its intended target to an attacker-chosen path — typically a protected system location. Tools like CreateSymlink.exe (from James Forshaw's symboliclink-testing-tools) or custom code can do this without admin rights.- Write access to at least one user-writable directory
- Ability to create object-directory symlinks (default user right on Windows)
- Microsoft's RedirectionGuard mitigation (shipped mid-2025) hardens many inbox services against junction traversal — if enabled via WDAC policy, the symlink may be blocked
- Sysmon or EDR rules watching for junction creation in
\RPC Controlcan detect this step
\RPC ControlTrigger privileged file operation
LocalSystem, the redirected operation succeeds with full SYSTEM privileges — writing to, overwriting, or deleting the attacker's chosen target file. This typically enables arbitrary DLL planting or overwriting a service binary.- Symlink/junction in place before the service's file operation fires
- Race condition window (TOCTOU) must be won — CWE-59 bugs often have a timing component
- Timing sensitivity — the race may fail on first attempt, requiring retries
- RedirectionGuard or similar kernel-mode mitigations can block the follow
svchost.exe to system32Achieve SYSTEM execution
NT AUTHORITY\SYSTEM. Blast radius is limited to this single host.- Successful arbitrary file write from step 4
- A loadable target (DLL search-order hijack, service binary overwrite)
- WDAC / AppLocker code-integrity policies block unsigned DLL loads
- EDR behavioral detection on DLL side-loading from unusual paths
The supporting signals.
| In-the-Wild Exploitation | None observed. Not listed in CISA KEV. No vendor acknowledgment of active exploitation. No campaign reporting from CrowdStrike, Mandiant, or Proofpoint as of 2026-07-27. |
|---|---|
| Proof-of-Concept | No public PoC. No repositories found on GitHub, Exploit-DB, or VulnCheck XDB. The CWE-59 symlink technique is well-documented generically (James Forshaw's symboliclink-testing-tools), but no weaponized exploit specific to this CVE exists. |
| EPSS Score | 0.00403 (0.4% probability of exploitation in 30 days). This places it in roughly the 40th percentile — well below the threshold where EPSS-driven prioritization would flag it. |
| KEV Status | Not listed. No CISA KEV entry as of 2026-07-27. |
| CVSS Vector | CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H — Local access, low complexity, low privilege, no user interaction, scope unchanged, full CIA impact. Temporal score ~6.8. |
| Affected Versions | Windows 10 (all supported builds), Windows 11 (21H2, 22H2, 23H2, 24H2), Windows Server 2016/2019/2022/2025 with Desktop Experience. Server Core is not affected (WalletService not present). |
| Fixed Versions | July 14, 2026 cumulative updates. KB numbers vary by OS build — deploy via WSUS/SCCM/Intune/Windows Update. No standalone hotfix or out-of-band patch. |
| Scanning / Exposure | Not remotely exploitable — no Shodan/Censys/GreyNoise/FOFA exposure surface. The attack surface is entirely local. Internet-facing scan data is irrelevant for this CVE. |
| Disclosure Date | 2026-07-14 (July 2026 Patch Tuesday). Coordinated disclosure; no prior public knowledge. |
| Prior WalletService CVEs | Third WalletService EoP in 2026: CVE-2026-20853 (January 2026) and CVE-2026-32080 (use-after-free, earlier in 2026). Recurring attack surface in the same component. |
noisgate verdict.
The single most decisive downgrade factor is the local-access prerequisite combined with a consumer-grade, non-infrastructure service — the attacker must already have code execution on the host, and WalletService is not a domain controller, hypervisor, identity provider, security agent, or any other high-value-role component, so successful exploitation yields SYSTEM on exactly one workstation with no direct path to fleet compromise. No PoC, no exploitation evidence, and an EPSS of 0.4% confirm the threat actor community has not prioritized this vector.
Why this verdict
- Local-only attack vector: AV:L means the attacker is already on the box with code execution. This prerequisite implies post-initial-access — the hardest part of the kill chain is behind them, but it also means the vuln adds one hop (user→SYSTEM) to an already-compromised host, not a new entry point.
- Consumer-grade blast radius: WalletService manages payment tokens and wallet objects. It is not a domain-critical, fleet-critical, or security-critical component. Gaining SYSTEM via WalletService is functionally identical to dozens of other LPE primitives available to an attacker who's already on the box — it doesn't uniquely enable lateral movement, credential harvesting, or domain escalation beyond what other post-exploitation tools provide.
- Role multiplier: (a) *Low-value role (workstation):* Chain succeeds; blast radius = single host SYSTEM. (b) *Typical role (member server with Desktop Experience):* Chain succeeds if WalletService is present (Manual/stopped); blast radius = single host SYSTEM. (c) *High-value role (domain controller / hypervisor / IdP):* DCs typically run Server Core where WalletService is absent — chain fails. On the minority of Desktop Experience DCs, the attacker already needs local low-privilege access to the DC itself, which is an extremely high bar that implies near-total compromise already. WalletService is NOT canonically a high-value-role component — <1% of WalletService instances sit on DCs. Floor rule does not apply.
- No exploitation signal: Zero PoC, zero in-the-wild, not KEV-listed, EPSS at 0.4%. The threat actor community has not invested in weaponizing this despite the CWE-59 technique being well-understood.
- Service default state: WalletService is Manual/stopped. The attacker must trigger it before exploitation, adding friction that most automated post-exploitation frameworks won't handle out of the box.
Why not higher?
Upgrading to HIGH would require either active exploitation evidence, a public PoC lowering the exploitation bar, or a high-value-role blast radius. None of these conditions are met. WalletService is a consumer-oriented helper service, not infrastructure plumbing. The local-access prerequisite means this vuln cannot open a new attack surface — it only accelerates one step in a chain that already requires initial compromise. There are dozens of alternative LPE primitives available to attackers at this stage.
Why not lower?
Dropping to LOW or IGNORE would undercount the reliable, low-complexity path from any authenticated user to SYSTEM with no user interaction. CWE-59 symlink bugs in Windows services are a proven, repeatable technique class — even without a public PoC, the research community (Forshaw, CICADA8, ZDI) has published extensive tooling and methodology for this exact pattern. The fact that WalletService has had three EoP CVEs in 2026 alone suggests the component's code quality is poor, raising the likelihood a PoC will eventually surface.
What to do — in priority order.
- Disable WalletService via GPO or Intune — Set
WalletServicestartup type to Disabled via Group Policy (Computer Configuration → Windows Settings → System Services) or Intune configuration profile. This eliminates the attack surface entirely. The service is non-essential for enterprise-managed endpoints — it supports consumer payment/wallet features that most organizations don't use. No noisgate mitigation SLA applies for MEDIUM; go straight to the remediation window. - Enable RedirectionGuard via WDAC policy — Microsoft's RedirectionGuard (shipped mid-2025) mitigates many CWE-59 junction-traversal attacks at the kernel level. If your fleet is running Windows 11 23H2+ or Server 2025+, enable it via Windows Defender Application Control policy to harden all inbox services against symlink abuse, not just WalletService.
- Enforce WDAC or AppLocker code-integrity policies — Even if the attacker achieves arbitrary file write via the symlink, code-integrity policies prevent execution of unsigned or untrusted DLLs. This breaks the final step of the chain (planted DLL → SYSTEM shell). Deploy in enforce mode on high-value endpoints.
- Monitor for junction creation in \RPC Control — Deploy Sysmon (Event ID 11) or EDR rules to alert on file/directory creation in
\RPC Controlor junction creation by non-admin users. This provides detective coverage for the symlink-planting step across all CWE-59 LPE variants, not just this CVE.
- Network segmentation / firewall rules — This is a local-only vulnerability. No network traffic is involved. Firewall rules, VLAN isolation, and micro-segmentation have zero effect on exploitation.
- **Disabling the Wallet *app* in Edge or Windows Settings** — The browser-level wallet feature and the underlying WalletService are separate components. Disabling the Edge Wallet UI does not stop the service from being triggerable via COM/API.
- Antivirus signature scanning — No public PoC or known malware sample exists. AV signatures won't detect exploitation of this specific CVE. Behavioral EDR detection of symlink abuse is the correct detective control, not signature-based AV.
Crowdsourced verification payload.
Run this script on each target Windows host as any user (no admin required for the checks). Invoke with: powershell -ExecutionPolicy Bypass -File .\Check-CVE-2026-49176.ps1. It checks whether WalletService exists, its startup state, and whether the July 2026 cumulative update has been applied.
# Check-CVE-2026-49176.ps1
# Checks for CVE-2026-49176: Windows WalletService EoP (CWE-59)
# No admin privileges required. Exit codes: 0=PATCHED, 1=VULNERABLE, 2=UNKNOWN
$ErrorActionPreference = 'Stop'
try {
# Step 1: Check if WalletService exists
$svc = Get-Service -Name 'WalletService' -ErrorAction SilentlyContinue
if (-not $svc) {
Write-Host 'PATCHED - WalletService not present (likely Server Core). Not affected.'
exit 0
}
# Step 2: Check if WalletService is disabled (compensating control)
$svcStartup = (Get-WmiObject Win32_Service -Filter "Name='WalletService'").StartMode
if ($svcStartup -eq 'Disabled') {
Write-Host "PATCHED - WalletService is Disabled (compensating control in place). StartMode: $svcStartup"
exit 0
}
# Step 3: Check for July 2026 cumulative update via hotfix history
# July 2026 Patch Tuesday was 2026-07-14
$patchDate = [DateTime]'2026-07-14'
$hotfixes = Get-HotFix | Where-Object { $_.InstalledOn -ge $patchDate } | Sort-Object InstalledOn -Descending
if ($hotfixes.Count -gt 0) {
$latest = $hotfixes[0]
Write-Host "PATCHED - Cumulative update installed on or after 2026-07-14. Latest KB: $($latest.HotFixID) installed $($latest.InstalledOn.ToString('yyyy-MM-dd'))"
exit 0
}
# Step 4: Fallback - check OS build via UBR (Update Build Revision)
$ubr = (Get-ItemProperty 'HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion' -ErrorAction SilentlyContinue).UBR
$build = (Get-ItemProperty 'HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion' -ErrorAction SilentlyContinue).CurrentBuildNumber
$displayVersion = (Get-ItemProperty 'HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion' -ErrorAction SilentlyContinue).DisplayVersion
Write-Host "VULNERABLE - WalletService present (StartMode: $svcStartup), no July 2026 cumulative update detected."
Write-Host " OS Build: $build.$ubr | Version: $displayVersion"
Write-Host ' Action: Apply July 2026 cumulative update or disable WalletService.'
exit 1
} catch {
Write-Host "UNKNOWN - Error during check: $($_.Exception.Message)"
exit 2
}If you remember one thing.
WalletService via GPO on your managed endpoints — it's a consumer payment feature that virtually no enterprise workload depends on. Prioritize your July Patch Tuesday energy on the two actively exploited zero-days Microsoft flagged this month instead.Sources
- Microsoft Security Update Guide — CVE-2026-49176
- Windows News — Microsoft Patches WalletService Privilege Escalation Flaw
- Microsoft Learn — Security Guidelines for Disabling System Services in Windows Server
- Microsoft MSRC Blog — RedirectionGuard: Mitigating Unsafe Junction Traversal
- CICADA8 — How to Abuse Symlinks and Get LPE in Windows
- ZDI — Breaking Barriers: Techniques for Privilege Escalation on Windows
- FIRST — EPSS Data and Statistics
What defenders are saying.
Crowdsourced verification outputs.
Results submitted by users who ran the verification payload against their environment.