An unlocked tunnel from the internet straight through your VPN concentrator into Active Directory
CVE-2026-15409 is an unauthenticated server-side request forgery in the SonicWall SMA1000 Work Place web portal (/wsproxy endpoint, TCP/443). The flaw lets any remote attacker — no credentials, no user click — coerce the appliance into opening a WebSocket tunnel to localhost-only services, most critically an Erlang distribution node on port 1050 that accepts a hardcoded cookie (10ecad5b446e86864832904cd439b6b70262). Through that tunnel the attacker speaks native Erlang ETF, calls os:cmd/1, and achieves arbitrary command execution as the couchdb user. Chained with CVE-2026-15410 (a post-auth path-traversal code injection in the remove_hotfix workflow), the attacker escalates to root, extracts LDAP bind credentials encrypted with a static AES key, harvests TOTP MFA seeds, and pivots to Active Directory via secretsdump/DCSync. Affected firmware: SMA 6210, 7210, 8200v, and CMS on versions 12.4.3-03245 through 12.4.3-03434 and 12.5.0-02283 through 12.5.0-02800. Fixed in 12.4.3-03453 and 12.5.0-02835.
SonicWall's CVSS 10.0 / CRITICAL rating is entirely justified — arguably one of the few CVSS-10 scores in 2026 that genuinely earns the number. The SSRF is not the garden-variety 'scan an internal port' type: the hardcoded Erlang cookie turns it into an unauthenticated RCE with zero additional prerequisites, and the appliance's design role as a credential-bearing perimeter device means post-exploitation impact is domain-scale. Rapid7 MDR discovered active zero-day exploitation *before* disclosure on July 14, 2026. Within 48 hours a threat actor had scanned 2,197 Shodan-sourced targets, exploited 250 appliances, exfiltrated LDAP configs from 168 of them (534 records across 160 AD domains), and completed full DCSync against 5 domains. CISA added it to KEV the same day with a 3-day federal remediation deadline and confirmed ransomware association. This is not a paper tiger.
6 steps from start to impact.
Internet reconnaissance
cve-2026-15409-check.py (bulk scanner found in the campaign's open directory).- Internet access to SMA1000 Work Place portal on TCP/443
- None — the portal is internet-facing by design; Shodan indexes it automatically
http.html:"SMA1000" or ssl.cert.subject.CN:"sma". GreyNoise tags for SMA1000 scanning activity.SSRF via /wsproxy WebSocket tunnel
/wsproxy with a forged bmID parameter (prefix -3389) and a host parameter pointing to localhost:1050 (the internal Erlang distribution port). The Work Place service upgrades the connection (HTTP 101) and begins proxying raw TCP between the attacker and the localhost-only Erlang node. No authentication check is performed. Tool: cve-2026-15409-exploit.py (Ch4120N PoC, Metasploit module exploit/linux/http/sonicwall_sma1000_ssrf_rce).- Network reach to /wsproxy on the Work Place interface
- None — endpoint is exposed on the same port as the legitimate user portal
extraweb_access.log entries with wsproxy AND =-3389 AND HTTP 101 status. Nuclei template available.Erlang distribution handshake with hardcoded cookie
[email protected] node using the hardcoded cookie 10ecad5b446e86864832904cd439b6b70262. This cookie is identical across all tested SMA1000 appliances — it is compiled into the firmware and not configurable. The handshake authenticates the attacker as a trusted Erlang peer. Tool: Ch4120N PoC implements the full ETF handshake over wss://.- Active WebSocket tunnel from step 2
- Knowledge of the hardcoded Erlang cookie (public since July 15, 2026)
- None — the cookie is static and publicly documented
[email protected] in Erlang logs.Arbitrary command execution as couchdb
os:cmd/1 on the remote node, executing arbitrary OS commands as the couchdb user (UID 1010, group daemon). This is a low-privileged but fully functional shell with read access to appliance configuration files including policy_file.xml (LDAP bind credentials encrypted with a static 32-byte AES key). Tool: os:cmd/1 via Erlang RPC, automated in Ch4120N PoC and Metasploit module.- Authenticated Erlang session from step 3
- couchdb user is low-privileged — cannot directly modify system configs or install persistence as root
beam.smp (Erlang VM). File access: reads of /etc/sonicwall/policy_file.xml or writes to /tmp/.Privilege escalation to root via CVE-2026-15410
remove_hotfix workflow accessible on the internal AMC port 8188. From the couchdb shell, the attacker reaches AMC on localhost (port 8188 is bound to 127.0.0.1) and triggers the vulnerable endpoint with traversal sequences to execute a malicious script as root. This gives full control of the appliance. Tool: Custom exploit script targeting /usr/local/bin/remove_hotfix with ../ traversal.- Shell access from step 4
- CVE-2026-15410 present (same affected versions)
- Requires the companion CVE — but both ship in the same firmware and both are unpatched together
ctrl-service.log entries showing remove_hotfix invocations with path traversal sequences (../). File integrity monitoring on /usr/local/bin/.Credential harvest and domain compromise
policy_file.xml containing LDAP bind credentials (decryptable with a static AES key shipped in firmware), TOTP MFA seeds, and session databases from /tmp/temp.db*. The documented campaign deployed a standalone Linux Impacket binary (secretsdump) to /tmp, extracted SAM/LSA secrets from 9 AD environments, and executed full DCSync replication against 5 domains. The attacker now holds every password hash in those forests. Tools: ldap_extract.py, decrypt_ldap_password.py, auto_secretsdump.py, auto_dcsync.py / dcsync_domains.py (all found in the campaign's open directory by Hunt.io).- Root access from step 5
- Appliance configured with LDAP/AD integration (standard deployment)
- Requires AD-integrated deployment — but SMA1000's primary use case is enterprise remote access backed by AD/LDAP
/wsproxy. This breaks step 2 of the attack path. However, this is fragile — path normalization bypasses, encoding tricks, or WAF rule ordering issues may allow evasion. Do NOT rely on this as the sole control. Treat as defense-in-depth alongside the IP ACL above.extraweb_access.log for /wsproxy requests with =-3389 and HTTP 101 status. Check ctrl-service.log for remove_hotfix with path traversal. Check /var/lib/unit/conf.json for /__api__/login or /__api__/logout routes. Check Windows DCs for Event ID 4624 type 3 logons from the SMA1000's internal IP without correlated VPN sessions. Check for Event ID 4662 indicating DCSync. If any IoC is found, treat the appliance and downstream AD environment as compromised — re-image the appliance, reset all domain passwords, revoke all TOTP seeds.- MFA on the Work Place portal does not help — the SSRF bypasses all authentication, including MFA. The attacker never logs in as a user; they exploit the proxy layer beneath the auth stack.
- IDS/IPS signatures for known exploit payloads are unreliable — the attack uses a legitimate WebSocket upgrade (HTTP 101) followed by Erlang binary protocol inside the encrypted tunnel. Standard network IDS cannot inspect the post-upgrade traffic without TLS termination and protocol-aware parsing.
- SonicWall Capture ATP / sandboxing does not help — this is not a file-based or malware-delivery attack. The exploit is protocol-level abuse of a legitimate service endpoint.
- Disabling unused SMA1000 features is not possible — the
/wsproxyendpoint cannot be disabled independently of the Work Place portal, which IS the product's primary function.
The supporting signals.
| In-the-wild status | Confirmed zero-day exploitation prior to July 14, 2026 disclosure. Rapid7 MDR discovered active attacks. CISA KEV confirms ransomware association. Hunt.io documented a campaign that compromised 168 appliances across France, India, Italy, US, UK, Canada, Germany — extracting 534 LDAP configs from 160 AD domains and completing DCSync against 5. |
|---|---|
| CISA KEV | Added July 14, 2026. Federal remediation deadline: July 17, 2026 (3 days). Known ransomware use: Yes. |
| EPSS | 0.06795 (6.8% probability of exploitation in next 30 days) — estimated ~97th percentile. For context, any score above 0.05 typically indicates a top-3% risk CVE. This aligns with confirmed mass exploitation. |
| PoC availability | Multiple public exploits. Ch4120N/CVE-2026-15409 — full Python PoC automating WebSocket→Erlang→RCE chain. Metasploit module (exploit/linux/http/sonicwall_sma1000_ssrf_rce). Nuclei template for detection. Campaign tooling (bulk scanner, LDAP extractor, auto-DCSync) found in attacker open directory per Hunt.io. |
| CVSS vector | CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:C/C:H/I:H/A:H — 10.0. Network attack vector, low complexity, no privileges, no interaction, scope change (reaches beyond the vulnerable component into internal services/AD), full CIA impact. The scope-change and full-impact scores are justified by the documented SSRF→localhost→Erlang→RCE→AD chain. |
| Affected versions | SMA 6210, 7210, 8200v, CMS: 12.4.3-03245, -03387, -03434 and 12.5.0-02283, -02624, -02800. SMA 100 series and SonicWall SSL-VPN firewalls are not affected. |
| Fixed versions | 12.4.3-03453 or later, 12.5.0-02835 or later. Available via mysonicwall.com. No workaround exists — SonicWall advisory SNWLID-2026-0008 explicitly states patching is the only remediation. |
| Exposure data | Shodan: ~1,517 unique SMA1000 hosts (2,197 entries) visible at time of campaign. Broader SonicWall footprint: ~197,000 addresses. Campaign scanner identified 250 exploitable and 163 confirmed vulnerable from the primary list. These appliances are internet-facing by design. |
| Disclosure timeline | Pre-July 14: zero-day exploitation in the wild. July 14, 2026: SonicWall advisory SNWLID-2026-0008, CISA KEV addition, Rapid7 disclosure. July 15: Rapid7 detailed analysis, authenticated scanner plugins. July 16: campaign weaponization with multithreaded tooling observed. July 17: UK Borough Council of King's Lynn breach detected. |
| Credited researchers | Rapid7 MDR team (discovery of in-the-wild exploitation), Scott Caveza (Tenable Research Special Operations — analysis), Ch4120N (public PoC author), Hunt.io (campaign forensics and open-directory analysis). |
Sources.
- SonicWall Advisory SNWLID-2026-0008
- Rapid7 MDR Zero-Day Discovery & Analysis
- Hunt.io — UK Council Attack & Campaign Forensics
- Tenable — CVE-2026-15409 & 15410 Zero-Day Analysis
- CISA KEV Addition Alert (July 14, 2026)
- Ch4120N Public PoC — GitHub
- BleepingComputer — SonicWall Zero-Day Coverage
- Arctic Wolf Security Bulletin
Why this verdict
- Zero friction in the attack chain. The SSRF requires zero authentication, zero user interaction, and targets an endpoint (
/wsproxy) on the same TCP/443 port that end-users must reach — there is no configuration that exposes the VPN portal without exposing the vulnerable endpoint. The hardcoded Erlang cookie eliminates the only remaining gate between SSRF and RCE. Every prerequisite is met by default in every deployment. - Weaponization is complete and commoditized. A full PoC (Ch4120N), a Metasploit module, a Nuclei template, and campaign-grade automation tooling (bulk scanner, LDAP extractor, auto-DCSync) are all publicly available. The bar for exploitation is script-kiddie level. Time from disclosure to mass exploitation was 48 hours.
- Role multiplier: SMA1000 is canonically a network edge appliance — 100% of installs occupy the high-value role by definition. The SMA1000 exists solely as an internet-facing secure remote access gateway. It stores LDAP bind credentials, TOTP MFA seeds, and session tokens for every user who authenticates through it. The documented chain succeeds in this canonical role and the blast radius is domain-scale to fleet-scale: the Hunt.io campaign demonstrated credential extraction from 168 appliances → 160 AD domains → full DCSync on 5 domains. This is not a theoretical high-value scenario; it is the measured outcome.
- KEV-listed with ransomware association and 3-day federal deadline. CISA added both CVE-2026-15409 and CVE-2026-15410 on disclosure day with a July 17 remediation deadline — the shortest window CISA assigns. The KEV entry confirms known ransomware use, indicating the chain feeds directly into ransomware deployment after domain compromise.
- No compensating control breaks the chain without patching. SonicWall explicitly states there are no workarounds. The vulnerable endpoint cannot be disabled independently of the Work Place portal. WAF rules might filter the specific
bmIDpattern but the attacker controls the full WebSocket negotiation. The only reliable mitigation is firmware upgrade.
Why not higher?
CVSS 10.0 is the mathematical ceiling — it cannot go higher. The vendor score is exactly correct: unauthenticated, remote, low-complexity, no user interaction, scope change, full CIA impact. There is no dimension left to increase.
Why not lower?
Every downgrade criterion fails. Friction: none — the target surface is internet-facing by design, no auth required, hardcoded secrets, public exploits. Role narrowing: impossible — 100% of SMA1000 installs ARE the high-value network edge role. Exploit maturity: fully weaponized with Metasploit, PoC, and documented mass-exploitation campaigns. Blast radius: domain-scale compromise demonstrated against 160 AD environments. Installed base: SonicWall SMA1000 is a widely deployed enterprise VPN platform with ~1,500+ internet-visible instances. Any score below 10.0 would misrepresent the risk to defenders.
Crowdsourced verification payload.
Run this script from any Linux/macOS workstation with curl and network access to the target SMA1000 appliance. Usage: bash check_cve_2026_15409.sh <target_host> where <target_host> is the FQDN or IP of the SMA1000 Work Place portal. No special privileges required — it performs only an HTTP probe, no exploitation.
#!/usr/bin/env bash
# check_cve_2026_15409.sh — Remote vulnerability check for CVE-2026-15409
# SonicWall SMA1000 Work Place SSRF via /wsproxy
# Safe, non-exploitative probe: checks for WebSocket upgrade on /wsproxy
# Exit codes: 0=VULNERABLE, 1=PATCHED, 2=UNKNOWN
set -euo pipefail
if [ $# -lt 1 ]; then
echo "Usage: $0 <target_host> [port]"
echo "Example: $0 sma.example.com 443"
exit 2
fi
TARGET="$1"
PORT="${2:-443}"
URL="https://${TARGET}:${PORT}/wsproxy?host=127.0.0.1&port=1050&bmID=-3389test"
TIMEOUT=10
echo "[*] CVE-2026-15409 Check — SonicWall SMA1000 /wsproxy SSRF"
echo "[*] Target: ${TARGET}:${PORT}"
echo "[*] Date: $(date -u +%Y-%m-%dT%H:%M:%SZ)"
echo ""
# Step 1: Check if the host is reachable and looks like SMA1000
echo "[*] Step 1: Checking if target is reachable..."
HTTP_CODE=$(curl -sk -o /dev/null -w '%{http_code}' --connect-timeout "$TIMEOUT" "https://${TARGET}:${PORT}/" 2>/dev/null || echo "000")
if [ "$HTTP_CODE" = "000" ]; then
echo "[-] Target unreachable or connection refused."
echo "UNKNOWN"
exit 2
fi
echo "[+] Target responded with HTTP ${HTTP_CODE}"
# Step 2: Probe /wsproxy with WebSocket upgrade headers
echo "[*] Step 2: Probing /wsproxy endpoint..."
RESPONSE=$(curl -sk -i --connect-timeout "$TIMEOUT" --max-time 15 \
-H "Upgrade: websocket" \
-H "Connection: Upgrade" \
-H "Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==" \
-H "Sec-WebSocket-Version: 13" \
"$URL" 2>/dev/null || echo "CURL_FAILED")
if echo "$RESPONSE" | grep -q "CURL_FAILED"; then
echo "[-] Failed to probe /wsproxy endpoint."
echo "UNKNOWN"
exit 2
fi
# Step 3: Analyze the response
WSPROXY_STATUS=$(echo "$RESPONSE" | head -1 | grep -oP '\d{3}' | head -1 || echo "000")
echo "[*] /wsproxy responded with HTTP ${WSPROXY_STATUS}"
if [ "$WSPROXY_STATUS" = "101" ]; then
echo ""
echo "[!] ============================================"
echo "[!] VULNERABLE — CVE-2026-15409"
echo "[!] The /wsproxy endpoint accepted a WebSocket"
echo "[!] upgrade to localhost:1050 without auth."
echo "[!] Patch IMMEDIATELY to 12.4.3-03453+ or"
echo "[!] 12.5.0-02835+."
echo "[!] ============================================"
echo ""
echo "VULNERABLE"
exit 0
elif [ "$WSPROXY_STATUS" = "403" ] || [ "$WSPROXY_STATUS" = "404" ] || [ "$WSPROXY_STATUS" = "400" ]; then
echo ""
echo "[+] PATCHED — /wsproxy returned ${WSPROXY_STATUS}"
echo "[+] The endpoint appears to reject the SSRF"
echo "[+] proxy request. Verify firmware version is"
echo "[+] >= 12.4.3-03453 or >= 12.5.0-02835."
echo ""
echo "PATCHED"
exit 1
else
echo ""
echo "[?] UNKNOWN — Unexpected response code ${WSPROXY_STATUS}"
echo "[?] Manually verify the SMA1000 firmware version."
echo "[?] Check AMC > System > Status for hotfix version."
echo "[?] Vulnerable: 12.4.3-03434 and below, 12.5.0-02800 and below"
echo "[?] Patched: 12.4.3-03453+, 12.5.0-02835+"
echo ""
echo "UNKNOWN"
exit 2
fi