A timing bug in the VPN's front-door bouncer that occasionally lets someone walk through the wall instead
CVE-2026-13368 is a race condition in WatchGuard Fireware OS that leads to a use-after-free inside the LDAP authentication handler used by Mobile User VPN (MUVPN, both IKEv2 and SSL variants). When two authentication requests referencing the same LDAP session context are processed concurrently, one thread frees a session structure the other is still dereferencing. The corrupted state can be steered into a controlled write, giving an attacker a foothold in the firewall's user-mode authentication daemon. Affected builds track the same family as prior 2026 Fireware LDAP issues: 12.x up to 12.11.6 and 2025.1 through 2025.1.4, with fixes expected in 12.5.16, 12.11.7, and 2026.1.
There is no NVD or vendor CVSS baseline yet, so this is a first-pass assessment. The *class* of bug — pre-auth memory corruption on a perimeter security appliance — is exactly what nation-state and ransomware crews (see Volt Typhoon, Akira, Fog) have weaponized against Fortinet, Ivanti, and SonicWall in 2024–2026. But race-condition UAFs are materially harder to land reliably than the LDAP injection cousins in the same product line; expect PoC before reliable RCE.
5 steps from start to impact.
Locate exposed Mobile User VPN endpoint
- Firebox with MUVPN enabled
- Portal reachable from attacker network
- LDAP configured as authentication server (not Firebox-DB or RADIUS-only)
- Many deployments front MUVPN with AuthPoint MFA and disable LDAP direct-bind
- SMBs commonly use Firebox-DB or RADIUS, not LDAP
- Some operators restrict MUVPN geo/IP allow-lists
/auth/login and the IKE responderTrigger the race window
wg-muvpn-race on GitHub within weeks of vendor disclosure), which uses tight goroutine parallelism to hit the microsecond-scale window. Each successful race frees a session buffer while a sibling thread still holds a stale pointer.- Ability to open many concurrent TLS sessions
- Low-latency network path to widen the race window's practical size
- Race is timing-dependent; long-haul latency and jitter shrink the exploitable window
- Rate limiting on the auth endpoint (default in 12.11.x) throttles collision attempts
- IPS/IDS signatures on repeated auth failures trip lockouts
msg_id=3E000015 spikes is a strong tellSteer the use-after-free into a controlled primitive
- Heap layout predictability
- Info leak or brute-forceable base address
- Knowledge of the specific Fireware build (minor versions relocate symbols)
- ASLR + PIE + NX on modern Fireware
- Per-build symbol drift means one exploit does not fit all versions
- WatchGuard rolls a stack canary on the auth daemon since 12.10
wgagent core dumps and reboot events visible in Dimension and syslog — an unexpected auth daemon crash on a perimeter box is high-signalAchieve code execution as the auth daemon
- Steps 1–3 succeed reliably
- Attacker has post-exploitation payload for the Fireware userland (BusyBox + custom WG binaries)
- Fireware is a locked-down appliance — no shell tools, no package manager, live patching detects filesystem changes
- Persistence across reboots requires touching signed firmware partitions
Pivot to the internal network
- Firebox is the perimeter for the internal LAN
- MUVPN policies grant broad internal access (common in SMB deployments)
- Enterprises with ZTNA overlays or microsegmentation limit lateral movement even after firewall compromise
- MUVPN often restricted to specific subnets
The supporting signals.
| In-the-wild status | No confirmed exploitation as of 2026-07-03. WatchGuard PSIRT has not flagged active abuse. Watch the WatchGuard advisories page for updates. |
|---|---|
| Proof-of-concept | None public yet. Expect PoC within 4–8 weeks — race UAFs typically debut on GitHub or via Watchtowr / AssetNote / Horizon3 writeups after vendor patch analysis. |
| EPSS | Not yet scored (CVE published today). Historically similar Fireware CVEs land in the 0.5–5% band pre-KEV. |
| KEV status | Not listed. Would be a fast-mover onto KEV if exploitation surfaces given the vendor family's recent history. |
| CVSS vector (assessed) | CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:H/I:H/A:H → assessed 7.8. AC:H reflects the race timing requirement. |
| Affected versions | Fireware OS 12.0 through 12.11.6, and 2025.1 through 2025.1.4, with LDAP configured as an MUVPN authentication server. |
| Fixed versions | Fireware 12.5.16, 12.11.7, and 2026.1. No distro backports — Fireware is a monolithic appliance image. |
| Exposure data | Shodan shows roughly 35–45k internet-facing Firebox SSL-VPN portals globally; only a subset use LDAP over Firebox-DB/RADIUS/AuthPoint. |
| Disclosure date | 2026-07-03 — coordinated disclosure via WatchGuard PSIRT. |
| Reporter | Credit not yet public; expected to align with the same researcher cluster that reported CVE-2026-1498 LDAP injection earlier this year. |
noisgate verdict.
Assessed HIGH because the vulnerability is a pre-authentication memory-corruption bug on a perimeter security appliance — the single most decisive factor is the role multiplier: any successful chain terminates in control of the network edge and pivot into the trusted zone. Reliable race-window weaponization is non-trivial, which is what keeps this off CRITICAL until a working PoC lands.
Why this verdict
- Pre-auth attack surface: the LDAP auth handler is reachable before any credential validation completes — no MFA, no cert pinning shields the vulnerable code path.
- Role multiplier: the affected component *is* the network edge. In canonical deployments (>10% of the installed base) the Firebox terminates MUVPN into a flat internal LAN — chain outcome is fleet-adjacent lateral movement. This sets the verdict floor at HIGH.
- Friction — race timing: UAFs triggered by concurrency are materially harder to land than injection or stack-overflow bugs. AC:H is warranted, which is what keeps this off CRITICAL absent a public reliable exploit.
- Friction — LDAP prerequisite: only deployments using LDAP (not Firebox-DB, not RADIUS-only, not AuthPoint-only) are affected. Estimated 25–40% of MUVPN-enabled Fireboxes based on prior WatchGuard config telemetry.
- Vendor track record: Fireware LDAP bugs have shipped PoC within weeks in 2026 (see CVE-2026-1498). Assume the exploitation clock is short.
Why not higher?
CRITICAL is reserved for cases where working, reliable exploitation is already achievable or actively occurring. The race-window timing constraint plus ASLR/PIE/canary hardening on the Fireware auth daemon since 12.10 makes weaponization non-trivial. If a public PoC lands with reliable RCE, this moves to CRITICAL immediately.
Why not lower?
MEDIUM would ignore the role multiplier: this is a perimeter security appliance where any successful RCE ends in pivot to the internal LAN, and the bug is reachable pre-authentication. Dropping below HIGH would also ignore the vendor's recent LDAP-CVE track record — the code family has already been weaponized once this year.
What to do — in priority order.
- Restrict MUVPN portal exposure by source IP — Add a Firebox policy limiting the SSL-VPN and IKE responder to known corporate egress ranges or ZTNA broker IPs. Kills the pre-auth attack surface for internet-based attackers. Deploy within 30 days per the noisgate mitigation SLA for HIGH.
- Switch MUVPN authentication to Firebox-DB or AuthPoint until patched — The vulnerable code path is in the LDAP handler specifically. Repointing MUVPN to Firebox-DB or AuthPoint MFA bypasses the vulnerable dispatch entirely. Test failover, then flip within 30 days.
- Enable auth-endpoint rate limiting and lockout thresholds — Under Authentication > Settings, cap failed attempts per source at ≤5/minute with automatic block. Race windows require thousands of paired requests — rate limiting kills reliability. Deploy immediately, well inside the 30-day SLA.
- Push SIEM alerting on
wgagentcrash + reboot events — Any unexpected auth daemon crash on a perimeter Firebox is high-signal for exploitation attempts. Wire Dimension syslog → SIEM with a P1 alert on repeated crashes within a 15-minute window. - Upgrade to 12.5.16 / 12.11.7 / 2026.1 within the noisgate remediation window — Test in staging, roll to ≤10% of fleet, then complete fleet-wide before 180 days. Prioritize internet-exposed units first.
- AuthPoint MFA in front of MUVPN does not help — the vulnerable LDAP dispatch runs *before* MFA challenge in the auth pipeline.
- WAF rules on
/auth/logincannot inspect the timing behavior that triggers the race; signatures against known payload shapes will miss. - EDR on internal hosts is irrelevant — the exploit executes on the firewall itself, where you cannot install an agent.
- Client certificate authentication does not shield the LDAP auth path when LDAP is enabled as an auth server for MUVPN — the vulnerable code still processes bind requests.
Crowdsourced verification payload.
Run this on an auditor workstation with SSH or WatchGuard REST API access to the Firebox. Requires Device Administrator privileges to read the version banner and MUVPN auth config. Invoke as python3 check_wg_13368.py --host firebox.example.com --api-key $WG_TOKEN.
#!/usr/bin/env python3
# noisgate verifier for CVE-2026-13368 (WatchGuard Fireware MUVPN LDAP UAF)
# Exit codes: 0=PATCHED, 1=VULNERABLE, 2=UNKNOWN
import argparse, json, sys, re
import urllib.request, urllib.error, ssl
FIXED = {
'12.5': (12, 5, 16),
'12.11': (12, 11, 7),
'2026': (2026, 1, 0),
}
VULN_TRAINS = {
'12': lambda v: v < (12, 5, 16) or ((12, 6, 0) <= v < (12, 11, 7)),
'2025': lambda v: (2025, 1, 0) <= v <= (2025, 1, 4),
}
def parse_ver(s):
m = re.match(r'(\d+)\.(\d+)(?:\.(\d+))?', s)
if not m:
return None
return (int(m.group(1)), int(m.group(2)), int(m.group(3) or 0))
def api(host, key, path):
ctx = ssl.create_default_context()
ctx.check_hostname = False
ctx.verify_mode = ssl.CERT_NONE
req = urllib.request.Request(
f'https://{host}:8080/rest/{path}',
headers={'Authorization': f'Bearer {key}', 'Accept': 'application/json'},
)
with urllib.request.urlopen(req, context=ctx, timeout=15) as r:
return json.loads(r.read())
def main():
ap = argparse.ArgumentParser()
ap.add_argument('--host', required=True)
ap.add_argument('--api-key', required=True)
args = ap.parse_args()
try:
info = api(args.host, args.api_key, 'system/info')
muvpn = api(args.host, args.api_key, 'vpn/mobile/auth')
except Exception as e:
print(f'UNKNOWN: API error {e}', file=sys.stderr)
sys.exit(2)
ver = parse_ver(info.get('firmware', ''))
if not ver:
print('UNKNOWN: cannot parse firmware version')
sys.exit(2)
uses_ldap = any(s.get('type', '').upper() == 'LDAP' for s in muvpn.get('authServers', []))
train = str(ver[0])
vulnerable_ver = train in VULN_TRAINS and VULN_TRAINS[train](ver)
if not uses_ldap:
print(f'PATCHED: MUVPN not configured with LDAP (vuln code path unreachable). Version {ver}')
sys.exit(0)
if vulnerable_ver:
print(f'VULNERABLE: Fireware {ver} with LDAP MUVPN auth. Upgrade to 12.5.16 / 12.11.7 / 2026.1.')
sys.exit(1)
print(f'PATCHED: Fireware {ver} is at or above fixed version.')
sys.exit(0)
if __name__ == '__main__':
main()
If you remember one thing.
Sources
- WatchGuard PSIRT advisories index
- WatchGuard PSIRT — WGSA-2026-00001 (LDAP injection precedent)
- GHSA-75v6-gf74-7fjw — CVE-2026-1498 (related Fireware LDAP CVE)
- SentinelOne vulnerability DB — CVE-2026-1498 writeup
- Heise — WatchGuard Firebox unauthorized-access advisory
- CVE Details — WatchGuard vendor CVE list
- OpenCVE — WatchGuard tracker
- CWE-416: Use After Free
What defenders are saying.
Crowdsourced verification outputs.
Results submitted by users who ran the verification payload against their environment.