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
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. |
noisgate verdict.
The decisive factor is attacker position: exploitation requires an existing local foothold on a Windows host with the WatchGuard agent installed, which makes this a post-compromise privilege-escalation path rather than an initial-access event. SYSTEM impact keeps it out of LOW, but the combination of local-only reachability, chain dependency, and negligible exploitation evidence keeps it out of HIGH.
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.
What to do — in priority order.
- Harden local execution policy — Use WDAC or AppLocker to restrict unsigned or user-writable binaries and DLLs on endpoints running WatchGuard Agent. This directly raises friction against the malicious-file and process-injection stages of the chain; because the verdict is MEDIUM, there is no mitigation SLA — go straight to the 365-day remediation window, but apply this sooner on admin workstations and jump hosts if already available.
- Tighten user rights on WatchGuard hosts — Reduce local interactive logon where not needed, remove stale local users, and review who can write to service-adjacent directories. This cuts off the low-privileged foothold and file-placement assumptions the chain relies on; with MEDIUM severity, fold it into normal hardening work while patching inside the 365-day window.
- Hunt for service tampering — Create detections for WatchGuard service changes, unexpected child processes, suspicious module loads, and abrupt security-agent stoppage. These controls do not fix the bug, but they improve odds of catching abuse if an attacker is already on the host; use them as part of standard monitoring while remediation is scheduled.
- Prioritize high-value endpoint rings — Move shared admin endpoints, jump boxes, help-desk systems, and any Windows servers running the agent into the earliest upgrade ring. Even without a formal mitigation SLA, those systems amplify the value of a local SYSTEM escalation and deserve earlier treatment than ordinary user laptops.
- 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.
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
}
If you remember one thing.
1.25.03.0000 in your normal endpoint release train rather than let it drift. For formal tracking, treat the upgrade as due within the noisgate remediation SLA of 365 days, while using existing application-control and EDR telemetry to watch for service tampering or suspicious local privilege escalation attempts in the meantime.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
What defenders are saying.
Crowdsourced verification outputs.
Results submitted by users who ran the verification payload against their environment.