SonicWall SMA1000 WorkPlace SSRF → Internal Erlang RPC Remote Code Execution (CVE-2026-15409)
by Ryan Emmons (Rapid7) · 2026-07-15
- Severity
- Critical
- CVE
- CVE-2026-15409 (SNWLID-2026-0008)
- Category
- network
- Affected product
- SonicWall SMA1000 Appliance — WorkPlace interface (websocket proxy service)
- Affected versions
- SMA1000 appliances; PoC developed/tested against ex_sra_vm_12.5.0-02002.ova with the June 2026 hotfix applied (the last build prior to the fix)
- Disclosed
- 2026-07-15
- Patch status
- unpatched
Tags
References
Archive entry
intelseclab/poc-archiveMetadata
| Field | Value |
|---|---|
| Date Added | 2026-07-15 |
| Last Updated | 2026-07-15 |
| Author / Researcher | Ryan Emmons (Rapid7) |
| CVE / Advisory | CVE-2026-15409 (SNWLID-2026-0008) |
| Category | network |
| Severity | Critical |
| CVSS Score | 10.0 (CVSS 3.1, AV:N/AC:L/PR:N/UI:N/S:C/C:H/I:H/A:H) |
| Status | Weaponized — unauthenticated, non-root remote code execution confirmed against a real appliance build |
| Tags | sonicwall, sma1000, workplace, ssrf, erlang, rpc, cwe-918, unauthenticated, remote, kev, actively-exploited |
| Related | CVE-2026-15410 (post-auth privesc to root, chained after this) |
Affected Target
| Field | Value |
|---|---|
| Software / System | SonicWall SMA1000 Appliance — WorkPlace interface (websocket proxy service) |
| Versions Affected | SMA1000 appliances; PoC developed/tested against ex_sra_vm_12.5.0-02002.ova with the June 2026 hotfix applied (the last build prior to the fix) |
| Language / Platform | Erlang/OTP (BEAM VM) backend behind an HTTPS/websocket front end |
| Authentication Required | No |
| Network Access Required | Yes — direct reachability to the WorkPlace service (typically port 443) |
Summary
The SMA1000 WorkPlace interface exposes a websocket-based remote-access proxy (wsproxy) that lets an authenticated remote-access session request a proxied connection to a destination host/port/service combination (e.g. SSH, TELNET). The proxy does not restrict which internal destination it will connect to: an unauthenticated attacker can point it at 127.0.0.1/0.0.0.0 on port 1050 (or 8188, observed in the wild) — the appliance’s own internal Erlang distribution port. Once the websocket is redirected there, the attacker completes a standard Erlang inter-node distribution handshake using a cookie value that is hardcoded and consistent across appliances, and then issues arbitrary Erlang RPC calls (os:cmd/1, file:read_file/1, etc.) against the node — resulting in unauthenticated remote code execution as the low-privilege couchdb user. CISA has confirmed active in-the-wild exploitation, added this to KEV on 2026-07-14, and the researcher’s own notes describe an observed follow-on privilege-escalation chain to root via the related CVE-2026-15410.
Vulnerability Details
Root Cause
Tracked as CWE-918 (Server-Side Request Forgery). The WorkPlace wsproxy service accepts client-controlled host, port, and serviceType parameters (plus a bmID bookmark identifier) and blindly connects the proxied websocket tunnel to whatever destination is requested — with no restriction confining it to legitimate remote-access targets. This lets an attacker redirect the tunnel to the appliance’s own loopback interface and reach an internal-only Erlang distribution listener (part of the appliance’s BEAM VM cluster infrastructure), which was never intended to be reachable from outside the box. From there, the Erlang inter-node distribution protocol’s own authentication (an MD5 challenge/response keyed on a shared “cookie”) is defeated because the cookie value is hardcoded and identical across appliances rather than being a per-install secret — so the attacker can complete the handshake and issue arbitrary RPC calls into the node.
Attack Vector
- Connect to the target’s WorkPlace websocket proxy endpoint (
wss://target/wsproxy?...) without any authentication. - Set
bmIDto any value beginning with-3389(arbitrary suffix),serviceTypetoSSH(or an alternate likeTELNET),hostto0.0.0.0(or another loopback-equivalent form), andportto1050(the appliance’s internal Erlang distribution port; port 8188 was also observed exploited in the wild). - Once the websocket tunnel is established to the internal Erlang port, perform the standard Erlang distribution handshake (
send_name→recv_status→recv_challenge→send_challenge_reply→recv_challenge_ack) using the hardcoded cookie value. - Issue an RPC call (e.g.
rexmodulecallrequest foros:cmd/1) to execute an arbitrary OS command as thecouchdbprocess user. - Optionally chain to CVE-2026-15410 (SMA1000 AMC code injection, targeting
localhost:8188’s “remove hotfix” XML-RPC path-traversal handler) from the resulting shell to escalate to root.
Impact
Unauthenticated remote code execution on internet-facing SMA1000 secure remote-access appliances, initially as a low-privilege service account (couchdb) with a documented path to root privilege escalation via a companion vulnerability. Given SMA1000’s role as an enterprise remote-access gateway, compromise here can expose everything the appliance brokers access to.
Environment / Lab Setup
Target: SonicWall SMA1000 appliance (WorkPlace service reachable on port 443);
PoC developed/verified against ex_sra_vm_12.5.0-02002.ova + June 2026 hotfix
Attacker: Python 3 + the `websockets` library (for the ws-tunneled variant) or a
direct TCP socket (if port 1050/8188 is reachable without the proxy)
Tools: cve-2026-15409.py (this folder)
Setup Steps
| |
Proof of Concept
See
cve-2026-15409.py(full, unmodified) andupstream-README.mdin this folder — mirrored from remmons-r7/rapid7-CVE-2026-15409. Verified before ingestion: read the full 531-line script — it implements the Erlang External Term Format (ETF) encoder/decoder and the full distribution handshake (name packet, status, challenge, challenge-reply, challenge-ack, MD5 digest per OTP’sdist_util.erlscheme) from scratch using only the standard library pluswebsockets, then performs a genuinerex-module RPC call (os:cmd/1,file:read_file/1, orerlang:node/0) over the authenticated distribution channel. No obfuscation, no unrelated network calls, no destructive default behavior — the author’s own notes candidly describe exact field values (bmIDprefix, hardcoded cookie, alternate ports observed in the wild) consistent with genuine, tested exploitation rather than a template or guess.
Step-by-Step Reproduction
| |
Exploit Code
| |
Expected Output
Authenticated to couchdb@127.0.0.1
Peer flags: 0xd07df7fbd
Peer creation: 1784069352
RPC os:cmd/1 => uid=1010(couchdb) gid=1(daemon) groups=1(daemon)
/opt/couchdb
SMAAppliance.sma
Detection & Indicators of Compromise
Remediation
| Action | Detail |
|---|---|
| Patch | Apply SonicWall’s fix per SNWLID-2026-0008 — upgrade SMA1000 firmware past the version tested here (post June 2026 hotfix). |
| Workaround | Restrict network exposure of the WorkPlace interface to trusted networks/VPN only where possible; monitor wsproxy bookmark requests for internal-address destinations. |
| Incident response if already compromised | Treat as full appliance compromise given the documented chain to root via CVE-2026-15410 — rotate all credentials/secrets the appliance had access to and rebuild from a known-clean image. |
References
- SonicWall PSIRT SNWLID-2026-0008
- CISA KEV catalog entry — CVE-2026-15409
- Public PoC — remmons-r7/rapid7-CVE-2026-15409
Notes
Surfaced via a --days 4 only 2026 CVE discovery sweep on 2026-07-15. CISA added this CVE (and 4 others: Oracle E-Business Suite CVE-2026-46817, SonicWall SMA1000 CVE-2026-15410, Microsoft AD FS CVE-2026-56155, Microsoft SharePoint CVE-2026-56164) to KEV on 2026-07-14/07-15 — none of these were caught by the standard NVD lastModified-window query, since KEV additions don’t always re-touch a CVE’s NVD record; they were found by directly diffing the KEV catalog’s own dateAdded field against the discovery window instead.
Of the 5 fresh KEV entries checked, this was the only one with a real, working exploit: the researcher (Ryan Emmons, Rapid7) fully implements the Erlang distribution protocol from scratch and demonstrates genuine command execution. The other 4 were checked and rejected before ingestion per this archive’s verify-before-ingest standard: CVE-2026-46817’s only public “PoC” is a passive endpoint prober that never exercises the actual vulnerable code path; CVE-2026-15410’s only public “PoC” explicitly self-describes as a blind guess since “the real vulnerable endpoint and parameter are NOT public”; CVE-2026-56164’s repo claims a working exploit script that does not actually exist in the repository (only a README referencing a tinyurl.com link) — a phantom-PoC pattern consistent with scam/dropper lures seen elsewhere this archive has declined to credit; and CVE-2026-56155 had no public PoC repos at all.
| |