Like discovering your building's front gate has no lock, the guard is asleep, and every room key is hanging on a hook inside
CVE-2026-8037 is an unauthenticated OS command injection vulnerability in the management API of Progress Kemp LoadMaster, an application delivery controller deployed in over 100,000 instances across 80% of the Fortune 500. The flaw lives in the escape_quotes() function, which allocates heap memory via malloc() without initialization and fails to null-terminate the escaped output. An attacker sends four single quotes in the apiuser parameter to the /accessv2 endpoint; the resulting 16-byte expansion overwrites allocator metadata in an adjacent freed heap chunk. A preceding heap spray fills neighboring allocations with command injection payloads. When __sprintf_chk() reads the unterminated buffer, it continues past the boundary into the sprayed payload, which flows straight into a system() call and executes as root. Affected versions: LoadMaster GA ≤ 7.2.63.1, LTSF ≤ 7.2.54.17, ECS Connection Manager ≤ 7.2.63.1, ObjectScale Connection Manager ≤ 7.2.63.1, and MOVEit WAF sharing the same API code.
The vendor scored this 9.6 CRITICAL using AV:A (adjacent network), reflecting the architectural expectation that the management API sits on a dedicated management VLAN. That's technically honest but operationally naïve. Shadowserver found ~300 LoadMaster management interfaces directly exposed to the internet, and eSentire logged 792 exploit attempts from 65 IPs across 18 countries within 41 days of PoC publication. The NVD independently scored this 9.8 with AV:N, recognizing the real-world exposure pattern. For the vast majority of deployments behind firewalls, any compromised internal host or contractor VPN session reaches the management VLAN anyway. watchTowr published a fully weaponized proof-of-concept on June 29, 2026, and CISA added it to the Known Exploited Vulnerabilities catalog on August 7. The vendor's 9.6 understates the deployed risk — this is a 9.8 in practice.
5 steps from start to impact.
Target Discovery
- Network path to LoadMaster management interface (port 443)
- LoadMaster REST API is enabled (common for automation workflows)
- Well-segmented environments restrict management interface to a dedicated VLAN reachable only from a jumpbox
- Only ~300 of 100,000+ deployments are directly internet-exposed per Shadowserver
http.title:"LoadMaster" or ssl.cert.subject.CN:"kemp". GreyNoise tags scanning activity targeting LoadMaster.Heap Spray via JSON Parameters
/accessv2 containing 60+ key-value pairs (e.g., g0 through g60), each filled with the command injection payload such as '; cat /etc/shadow #'. These allocations populate the heap with attacker-controlled data adjacent to where the escape_quotes() buffer will be allocated. The spray is deterministic — the glibc allocator places same-sized chunks contiguously.- Reachability to the /accessv2 endpoint
- No authentication required
- An IDS/IPS with signatures for shell metacharacters in JSON API parameters could flag this
- Request is a single standard HTTPS POST — nothing anomalous at the network layer
apiuser containing shell metacharacters (;, ', backticks). Nuclei template available via community.Trigger escape_quotes() Overflow
apiuser parameter is set to '''' (four single quotes). The escape_quotes() function expands each ' into '\'' (four bytes), producing 16 bytes of output. Because malloc() was used without initialization and no null terminator is written, the 16-byte expansion overwrites the malloc metadata header of the adjacent freed heap chunk, erasing the allocator's size/flags.- The escape_quotes() function must process the apiuser field before command construction
- Vulnerable firmware version (GA ≤ 7.2.63.1 or LTSF ≤ 7.2.54.17)
- The patched version (GA 7.2.63.2 / LTSF 7.2.54.18) replaces malloc() with calloc() and adds a null terminator — the chain dies here on patched systems
Out-of-Bounds Read into Sprayed Payload
__sprintf_chk() reads the unterminated escape_quotes() output buffer as a C string. Without a null terminator, the read continues past the buffer boundary into the next heap chunk — which contains the attacker's sprayed command injection payload from Step 2. The sprintf output now includes the injected shell commands.- Heap layout must place sprayed data adjacent to the escape buffer — achieved reliably via the 60+ spray parameters
- ASLR and heap randomization provide negligible defense here because the spray is large and the relative positioning is what matters, not absolute addresses
Root Command Execution via system()
system() which constructs a shell command like validuser -b -u '<payload>' -p '<pass>'. The injected semicolons and quotes break out of the intended argument context, and the attacker's commands execute as root on the LoadMaster appliance. Full control of the load balancer is achieved: TLS private keys, traffic interception, configuration modification, and lateral pivot to backend servers.- Successful heap spray and overflow from prior steps
- No additional friction — once the heap layout is achieved, code execution is deterministic
192.42.116[.]58, 192.42.116[.]105, 146.70.139[.]154./accessv2 endpoint becomes unreachable. This is a zero-cost control that eliminates the attack surface completely for organizations that manage LoadMaster exclusively via the GUI. Deploy immediately./accessv2 containing base64-decoded apiuser values with shell metacharacters (;, ', backtick sequences). Block matching requests. This provides defense-in-depth but is bypassable by encoding variations. Deploy within the noisgate mitigation SLA of ≤ 3 days for CRITICAL.192.42.116.58, 192.42.116.105, and 146.70.139.154 to your perimeter firewall and SIEM blocklists immediately. These are confirmed exploitation sources per eSentire TRU. This blocks known actors but does nothing against new IPs — treat as supplementary, not primary. Deploy immediately.malloc() with calloc() and added explicit null termination, eliminating both root causes. The noisgate remediation SLA for CRITICAL is ≤ 90 days, but with KEV listing and active exploitation, aim to complete fleet-wide patching within 2 weeks. Schedule a maintenance window and upgrade all LoadMaster, ECS Connection Manager, and ObjectScale Connection Manager instances.- LoadMaster's own WAF features — the vulnerability is in the management plane API, not the data plane. WAF rules configured for virtual services do not inspect traffic to the management interface.
- MFA or stronger authentication on the management interface — the vulnerability is pre-authentication. The
escape_quotes()bug fires during the authentication parsing stage, before any credential check occurs. MFA is bypassed entirely. - Rate limiting on the management API — a single HTTP request is sufficient for full exploitation. Rate limiting has no meaningful effect on a one-shot attack.
- TLS certificate pinning or mutual TLS on the management interface — while mTLS would restrict which clients can connect, the vulnerability is in the application layer *after* the TLS handshake completes. If the attacker can establish a TLS session (e.g., with a valid client cert or if mTLS is not enforced), the exploit still works.
The supporting signals.
| In-the-Wild Exploitation | Confirmed active. eSentire TRU logged 792 exploitation attempts from 65 unique IPs across 18 countries (incl. Australia, China, Indonesia, Japan, Poland, US) over a 41-day window (June 30 – August 10, 2026). CISA added to KEV on August 7, 2026. Known attacker IPs: 192.42.116.58, 192.42.116.105, 146.70.139.154. |
|---|---|
| Proof-of-Concept | Weaponized PoC public. watchTowr Labs published a full technical walkthrough and working exploit on June 29, 2026. Aggregated on pocindex.io and SecureWithUmer/CVE-2026-PoCs on GitHub. Nuclei community template available. |
| EPSS | 0.99571 (99th percentile) — top 1% of all tracked CVEs by exploitation probability. This is near the theoretical maximum. |
| KEV Status | Listed. Added August 7, 2026. BOD 26-04 mandated federal agencies patch by August 10, 2026 (3-day deadline). |
| CVSS Vector | Vendor: CVSS:3.1/AV:A/AC:L/PR:N/UI:N/S:C/C:H/I:H/A:H (9.6). NVD: CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H (9.8). The discrepancy is AV:A vs AV:N — vendor assumes management VLAN isolation; NVD reflects real-world internet exposure. noisgate aligns with AV:N. |
| Affected Versions | LoadMaster GA: 7.2.60.0 – 7.2.63.1. LoadMaster LTSF: 7.2.45.12 – 7.2.54.17. Also: ECS Connection Manager ≤ 7.2.63.1, ObjectScale Connection Manager ≤ 7.2.63.1, MOVEit WAF (shared API codebase). |
| Fixed Versions | LoadMaster GA 7.2.63.2, LoadMaster LTSF 7.2.54.18. Patch replaces malloc() with calloc() (zero-fills buffer) and adds explicit null terminator after escape loop. |
| Exposure Surface | Shadowserver: ~300 LoadMaster management interfaces internet-exposed. Total installed base: 100,000+ deployments across 80% of Fortune 500. Attackers enumerate via Shodan dork http.title:"LoadMaster" on port 443. |
| Disclosure Date | June 4, 2026 (vendor advisory + patch release). PoC published June 29 (25-day gap). KEV listing August 7 (64 days post-disclosure). |
| Reporting Researcher | Syed Ibrahim Ahmed, TrendAI Research. CVE-2024-1212 (prior LoadMaster injection) discovered by Rhino Security Labs — same component, similar class of bug. |
Sources.
- watchTowr Labs — Full Exploit Analysis & PoC
- CISA KEV Alert — August 7, 2026
- eSentire TRU Advisory — Exploitation Telemetry & IoCs
- The Hacker News — 792 Exploit Attempts, CISA KEV Coverage
- ZeroPath Blog — Technical Summary & Version Matrix
- GitHub Advisory — GHSA-57pc-jm9r-hgj4
- NVD Entry — CVE-2026-8037
- Decryption Digest — Patch Guidance & Exposure Analysis
Why this verdict
- Pre-auth root RCE, single HTTP request: The chain requires zero authentication, zero user interaction, and low attack complexity. Once an attacker reaches the management interface, a single crafted POST to
/accessv2delivers root-level code execution. The EPSS score of 99% and 792 confirmed exploit attempts leave no ambiguity about real-world weaponization. - Active exploitation with public weaponized PoC: watchTowr published a complete, reproducible exploit on June 29, 2026. Exploitation began the same day. eSentire documented 65 attacker IPs across 18 countries. CISA KEV-listed on August 7. This is not theoretical — it is happening now, at scale, against your peers.
- Vendor AV:A understates real-world reachability: The vendor scored this with Attack Vector: Adjacent, assuming the management interface sits on a segmented VLAN. Shadowserver data shows ~300 instances are directly internet-exposed, and for the remaining 99,700+ behind firewalls, any post-initial-access attacker (compromised workstation, contractor VPN, phished employee) typically has a network path to the management VLAN. The NVD correctly scored AV:N. Upgrading from 9.6 to 9.8 reflects this.
- Role multiplier: LoadMaster is a canonical network-edge appliance — effectively 100% of installs occupy the high-value role by definition. Root access on a load balancer yields: (1) TLS private keys for every virtual service, enabling passive decryption of all transit traffic; (2) ability to inject or modify HTTP responses to downstream clients; (3) visibility into backend server IPs, health-check credentials, and topology; (4) a pivot point into every backend server the LB fronts. Blast radius is fleet-scale — a single compromised LoadMaster can expose or redirect traffic for dozens to hundreds of backend applications. This floors the verdict at CRITICAL regardless of management-interface segmentation friction.
Why not higher?
A 9.8 is near the CVSS ceiling. The only path to 10.0 would require Scope:Changed in combination with AV:N — arguing that the vulnerability's impact extends beyond the LoadMaster into downstream systems as a direct, automatic consequence. While root access on a LB *enables* downstream compromise, the pivot to backend systems requires additional attacker steps (credential extraction, lateral movement) that are not part of this CVE's direct impact chain. The 9.8 accurately captures the direct blast radius.
Why not lower?
Every friction point that might support a downgrade is overridden by hard evidence. Management interface segmentation? ~300 are internet-facing and 792 exploit attempts confirm reachability. Niche product with limited exposure? 100,000+ deployments across 80% of the Fortune 500. Theoretical PoC only? watchTowr published a fully weaponized exploit and CISA confirmed active exploitation in the wild. The EPSS score is 99th percentile. There is no defensible argument for anything below CRITICAL.
Crowdsourced verification payload.
Run from an auditor workstation with network access to the LoadMaster management interface. Requires curl and coreutils (sort, grep). No special privileges needed — the script makes only an HTTPS GET to the login page to parse the firmware version, plus an optional authenticated API call. Usage: bash check_cve-2026-8037.sh 10.0.1.50 or bash check_cve-2026-8037.sh lb.corp.local my-api-key
#!/usr/bin/env bash
# CVE-2026-8037 Version Checker for Progress Kemp LoadMaster
# Usage: bash check_cve-2026-8037.sh <host> [api-key]
# Exit: 0=PATCHED 1=VULNERABLE 2=UNKNOWN
set -euo pipefail
TARGET="${1:?Usage: $0 <loadmaster-mgmt-ip-or-hostname> [api-key]}"
API_KEY="${2:-}"
FIXED_GA="7.2.63.2"
FIXED_LTSF="7.2.54.18"
VERSION=""
ver_gte() {
printf '%s\n%s' "$1" "$2" | sort -V | head -n1 | grep -qx "$2"
}
echo "[*] CVE-2026-8037 Check - Target: ${TARGET}"
# Method 1: Authenticated API version query
if [[ -n "$API_KEY" ]]; then
RESP=$(curl -sk --connect-timeout 10 \
-H "Authorization: Bearer ${API_KEY}" \
"https://${TARGET}/access/system/version" 2>/dev/null) || true
VERSION=$(echo "$RESP" | grep -oP '"version"\s*:\s*"\K[^"]+' 2>/dev/null) || true
fi
# Method 2: Parse firmware version from login page
if [[ -z "${VERSION}" ]]; then
RESP=$(curl -sk --connect-timeout 10 "https://${TARGET}/" 2>/dev/null) || true
VERSION=$(echo "$RESP" | grep -oP 'LoadMaster\s+v?\K[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+' 2>/dev/null | head -1) || true
fi
if [[ -z "${VERSION}" ]]; then
echo "[!] Could not determine LoadMaster firmware version."
echo "UNKNOWN"
exit 2
fi
echo "[*] Detected firmware: ${VERSION}"
# Determine branch (GA vs LTSF) and set fixed version
if echo "$VERSION" | grep -qP '^7\.2\.5[0-9]'; then
BRANCH="LTSF"; FIXED="$FIXED_LTSF"
elif echo "$VERSION" | grep -qP '^7\.2\.6[0-9]'; then
BRANCH="GA"; FIXED="$FIXED_GA"
else
echo "[!] Unrecognized firmware branch: ${VERSION}"
echo "UNKNOWN"
exit 2
fi
echo "[*] Branch: ${BRANCH} - Fixed in: ${FIXED}"
if ver_gte "$VERSION" "$FIXED"; then
echo "[+] Firmware ${VERSION} >= ${FIXED}"
echo "PATCHED"
exit 0
else
echo "[-] Firmware ${VERSION} < ${FIXED} - AFFECTED by CVE-2026-8037"
# Probe whether the vulnerable endpoint is reachable
HTTP=$(curl -sk --connect-timeout 5 -o /dev/null -w "%{http_code}" \
"https://${TARGET}/accessv2" 2>/dev/null) || HTTP="000"
if [[ "$HTTP" != "000" ]]; then
echo "[!] WARNING: /accessv2 reachable (HTTP ${HTTP}) - exploit path OPEN"
else
echo "[*] /accessv2 not reachable from this host - management segmentation may be in place"
fi
echo "VULNERABLE"
exit 1
fi