This is a spare master key hidden inside the janitor’s closet, not the front door to the building
CVE-2026-6787 is a *local* flaw in WatchGuard Agent on Windows caused by a hard-coded cryptographic key. On affected WatchGuard Agent for Windows versions up to and including 1.25.02.0000, a low-privileged local user can abuse that embedded key to help include attacker-controlled code into an existing process. On its own, this is already bad design; in practice, WatchGuard frames it as part of a chained privilege-escalation path to NT AUTHORITY\SYSTEM alongside CVE-2026-6788.
The vendor's HIGH label matches the *technical impact* but overshoots the *enterprise patch priority* once you audit the friction. This is not unauthenticated remote access, not internet-reachable, not KEV-listed, and not backed by meaningful EPSS or public exploitation evidence. The real risk is that endpoint agents run with elevated trust, so once an attacker already lands on a Windows host, this can turn a minor foothold into full local control.
4 steps from start to impact.
Gain a low-privileged foothold on a Windows endpoint
- Attacker has local code execution or a valid low-privileged account
- Target runs WatchGuard Agent for Windows
<= 1.25.02.0000
- This is already post-initial-access; the attacker is on the box
- Only endpoints with the Windows agent installed are in scope
- EDR, application control, and user-rights hardening can stop or expose the foothold stage
Abuse the embedded key to influence a trusted process
- Attacker can read or reverse engineer local agent components
- The vulnerable code path is reachable by an unprivileged local user
- There is no broadly circulated exploit kit or commodity PoC
- Reverse engineering effort is higher than one-click LPEs
- Modern EDR can flag suspicious code injection or tampering against security software processes
Chain with CVE-2026-6788 to complete SYSTEM escalation
CVE-2026-6787 and CVE-2026-6788 as *chained agent service vulnerabilities* enabling local privilege escalation to SYSTEM. The second bug is an uncontrolled search path issue, which likely supplies the attacker-controlled file-loading leg needed to convert process influence into privileged execution. *Weaponized tool:* attacker-controlled DLL/binary placed in a searched path, again with no public named exploit released.- The companion flaw
CVE-2026-6788is also present - The attacker can place files in a reachable path/location
- This is not a clean single-bug win; it depends on a chain
- File-write controls, WDAC/AppLocker, and EDR can break the malicious-file stage
- Some environments restrict writable paths well enough to raise attacker cost
Operate as NT AUTHORITY\SYSTEM and blind the host
- Privilege escalation chain succeeds
- Host defenses do not block privileged post-exploitation actions
- Blast radius is one host at a time unless the attacker already has lateral movement capability
- Enterprise logging often catches service disablement, scheduled task creation, or token abuse after SYSTEM is gained
- Perimeter firewall changes do not solve this, because the exploit path is local rather than internet-exposed.
- MFA does not stop an attacker who already has local code execution or has stolen a session on the endpoint.
- Network vulnerability scans alone are weak here; they can inventory the version, but they cannot meaningfully validate exploitability of a local chain from off-host.
The supporting signals.
| In-the-wild status | No public evidence of active exploitation found. CVE-2026-6787 is not in CISA KEV, and the Baden-Württemberg cyber defense note said there were *no current findings on attackers* at publication. |
|---|---|
| Proof-of-concept availability | No verified public PoC repo or named exploit tool surfaced in primary-source review. That raises attacker effort compared with commodity LPE bugs. |
| EPSS | 0.00013 per the user-supplied intel and mirrored by Tenable — effectively near-floor exploitation likelihood, which is strong downward pressure on urgency. |
| KEV status | Not listed in the CISA Known Exploited Vulnerabilities Catalog as reviewed. No KEV date applies. |
| CVSS vector reality check | CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H means local access and low privileges are enough, but *local* is doing a lot of work. This is post-compromise severity, not edge-exposure severity. |
| Affected versions | WatchGuard Agent on Windows <= 1.25.02.0000 is affected, per WatchGuard and NVD. |
| Fixed version | Vendor fix is WatchGuard Agent on Windows 1.25.03.0000. No workaround was published by WatchGuard. |
| Exposure / scanning reality | There is no meaningful internet exposure census here because this is an endpoint-local agent flaw, not a remotely reachable service bug. *Inference from the local attack vector and product role:* Shodan/Censys-style external enumeration is largely irrelevant to prioritization. |
| Disclosure date | Published by WatchGuard on 2026-05-06; NVD published on 2026-05-06 and added v3.1 enrichment on 2026-05-11. |
| Reporter / attribution | WatchGuard's public advisory does not credit an external researcher. Public reporting attributes the issue to WatchGuard's PSIRT disclosure only. |
Sources.
- WatchGuard advisory WGSA-2026-00013
- NVD entry for CVE-2026-6787
- CVE.org record for CVE-2026-6787
- NVD entry for CVE-2026-6788
- CISA Known Exploited Vulnerabilities Catalog
- Government of Canada alert on WatchGuard advisories
- WatchGuard Agent supported operating systems
- Tenable CVE page mirroring EPSS for CVE-2026-6787
Why this verdict
- Downgrade for attacker position:
AV:L+PR:Lmeans the attacker already has code execution or a user session on the endpoint. That is a major real-world narrowing versus remotely reachable bugs. - Downgrade for chain dependency: WatchGuard explicitly describes this as part of a *chained* path with
CVE-2026-6788, soCVE-2026-6787is not the whole kill chain by itself. - Downgrade for exploitation pressure: EPSS is effectively floor-level, there is no KEV entry, and no verified public PoC or campaign evidence turned up in primary-source review.
- Hold at MEDIUM for impact: If the chain is used successfully, the result is
NT AUTHORITY\SYSTEMon a protected endpoint, which is absolutely meaningful for lateral movement, defense evasion, and persistence.
Why not higher?
This is not an unauthenticated remote bug, not an internet-facing service issue, and not a one-bug-to-domain-compromise story. The reachable population is limited to hosts running a specific Windows agent, and the attacker must already be on the machine with at least low privileges before this matters.
Why not lower?
Local privilege escalation on an endpoint security or management agent is still operationally important because those components sit in trusted positions on the box. Once exploited, the attacker can jump from a weak foothold to SYSTEM and then disable controls or establish durable persistence, so dismissing it as hygiene would understate the damage potential.
Crowdsourced verification payload.
Run this on the target Windows host or through your EDR/RMM remote shell. Invoke with powershell.exe -ExecutionPolicy Bypass -File .\check-watchguard-agent-cve-2026-6787.ps1; no admin rights are usually required for registry reads, but elevated rights help if you want to expand it later to inspect service paths.
# check-watchguard-agent-cve-2026-6787.ps1
# Purpose: Detect whether WatchGuard Agent for Windows is vulnerable to CVE-2026-6787 based on installed version.
# Output: VULNERABLE / PATCHED / UNKNOWN
# Exit codes: 0=PATCHED, 1=VULNERABLE, 2=UNKNOWN
$ErrorActionPreference = 'SilentlyContinue'
$fixedVersion = [version]'1.25.3.0'
function Get-WGAgentVersion {
$paths = @(
'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\*',
'HKLM:\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall\*'
)
$hits = foreach ($path in $paths) {
Get-ItemProperty $path | Where-Object {
$_.DisplayName -match 'WatchGuard Agent'
} | Select-Object DisplayName, DisplayVersion, Publisher, InstallLocation
}
if ($hits) {
$best = $hits | Where-Object { $_.DisplayVersion } | Select-Object -First 1
if ($best -and $best.DisplayVersion) {
return $best.DisplayVersion
}
}
# Fallback: inspect common service binary paths if uninstall entry was not found
$candidatePaths = @(
'C:\Program Files\WatchGuard\*\*.exe',
'C:\Program Files (x86)\WatchGuard\*\*.exe'
)
foreach ($pattern in $candidatePaths) {
$file = Get-ChildItem -Path $pattern -Recurse -File | Select-Object -First 1
if ($file) {
return $file.VersionInfo.ProductVersion
}
}
return $null
}
$rawVersion = Get-WGAgentVersion
if (-not $rawVersion) {
Write-Output 'UNKNOWN: WatchGuard Agent not found or version could not be determined.'
exit 2
}
# Normalize 4-part version like 1.25.03.0000 -> 1.25.3.0
try {
$normalized = ($rawVersion -replace '^v','').Trim()
$parts = $normalized.Split('.')
while ($parts.Count -lt 4) { $parts += '0' }
$parts = $parts[0..3] | ForEach-Object { [int]$_ }
$installedVersion = [version]::new($parts[0], $parts[1], $parts[2], $parts[3])
}
catch {
Write-Output "UNKNOWN: Found WatchGuard Agent version '$rawVersion' but failed to parse it."
exit 2
}
if ($installedVersion -lt $fixedVersion) {
Write-Output "VULNERABLE: WatchGuard Agent version $installedVersion is older than fixed version $fixedVersion."
exit 1
}
else {
Write-Output "PATCHED: WatchGuard Agent version $installedVersion is at or above fixed version $fixedVersion."
exit 0
}