Threat Overview
CVE-2026-9586 is a critical unauthenticated SQL injection vulnerability in Sangoma Switchvox that leads to operating-system command execution. Horizon3.ai and Defused Cyber observed valid exploitation attempts beginning August 30, 2026. The vulnerable /pa endpoint accepts XML beginning with PolycomIPPhone; attacker-controlled PhoneIP data reaches an unparameterized PostgreSQL query. Horizon3 demonstrated stacked queries using PostgreSQL COPY TO PROGRAM to execute operating-system commands.
Observed exploitation included nc 176.65.148.184 39323 | sh and subsequent process enumeration using curl, top, awk, and base64. Evidence of injected SQL can appear in /var/log/switchvox/db-quirks.log. These are confirmed researcher-observed indicators, but infrastructure and command syntax can change.
References
- Horizon3.ai – September 1, 2026: https://horizon3.ai/attack-research/disclosures/cve-2026-9586-sangoma-switchvox-rce/
- The Hacker News – September 2, 2026: https://thehackernews.com/2026/09/attackers-exploit-critical-switchvox.html
- Sangoma Switchvox documentation: https://sangomakb.atlassian.net/wiki/spaces/Switchvox/
Impacted Systems
- Sangoma Switchvox SMB Edition.
- Confirmed vulnerable build: Switchvox SMB Edition 8.3 (104997).
- Public sources are inconsistent about earlier versions; older versions should not be assumed safe.
- Fixed version: Switchvox 8.4.0.2.
- Vulnerable endpoint: unauthenticated HTTP
/pa. - Attacker prerequisite: network access to the Switchvox web interface; no credentials or user interaction required.
- Observed exploitation source: 176.65.148.184.
Why this matters
Active exploitation provides a direct unauthenticated route into enterprise VoIP infrastructure and can create a privileged Linux foothold.
Exploitation Status
Confirmed active exploitation. Valid honeypot exploitation attempts were recorded beginning August 30, including reverse-shell commands and process enumeration.
What this hunt looks for
The published source IP, POST requests to /pa, XML and SQL-injection indicators, Switchvox database artifacts, PostgreSQL or web processes spawning shells, reverse-shell behavior, and new outbound destinations.
Required logs
- CommonSecurityLog with HTTP URL/method telemetry
- Syslog from Switchvox/Linux where available
- DeviceProcessEvents and DeviceNetworkEvents where Linux endpoint telemetry is deployed
Hunt 1 – First-Pass: Published Exploitation Source IP
CommonSecurityLog
| where TimeGenerated >= ago(30d)
| where SourceIP == "176.65.148.184" or DestinationIP == "176.65.148.184"
| project TimeGenerated, DeviceVendor, DeviceProduct, SourceIP, SourcePort, DestinationIP, DestinationPort, Protocol, DeviceAction, RequestURL=tostring(column_ifexists("RequestURL","")), Message
| sort by TimeGenerated ascHunt 2 – POST Requests to /pa
CommonSecurityLog
| where TimeGenerated >= ago(30d)
| extend HttpMethod=tostring(column_ifexists("RequestMethod",""))
| extend Url=tostring(column_ifexists("RequestURL",""))
| where HttpMethod =~ "POST"
| where Url endswith "/pa" or Url has "/pa?"
| project TimeGenerated, SourceIP, DestinationIP, DestinationHostName, HttpMethod, Url, DeviceAction, Message
| sort by TimeGenerated ascHunt 3 – PolycomIPPhone and SQL Injection Indicators
CommonSecurityLog
| where TimeGenerated >= ago(30d)
| extend Url=tostring(column_ifexists("RequestURL",""))
| extend Msg=tostring(column_ifexists("Message",""))
| where Url endswith "/pa" or Url has "/pa?"
| where Msg has_any ("PolycomIPPhone","PhoneIP","COPY","TO PROGRAM","pg_sleep","auto_phone_config")
| project TimeGenerated, SourceIP, DestinationIP, DestinationHostName, Url, DeviceAction, Msg
| sort by TimeGenerated ascHunt 4 – Database Quirks Log Indicators
Syslog
| where TimeGenerated >= ago(30d)
| where SyslogMessage has_any ("db-quirks.log","auto_phone_config","COPY","TO PROGRAM","PolycomIPPhone","PhoneIP")
| project TimeGenerated, Computer, HostIP, ProcessName, SeverityLevel, SyslogMessage
| sort by TimeGenerated ascHunt 5 – PostgreSQL or Web Processes Spawning Shells
DeviceProcessEvents
| where TimeGenerated >= ago(30d)
| where InitiatingProcessFileName in~ ("postgres","postgres.exe","httpd","apache2","nginx","perl","perl.exe")
| where FileName in~ ("bash","sh","nc","ncat","curl","wget","python","python3","cmd.exe","powershell.exe","pwsh.exe")
| project TimeGenerated, DeviceName, AccountName, FileName, ProcessCommandLine, InitiatingProcessFileName, InitiatingProcessCommandLine, SHA256
| sort by TimeGenerated ascHunt 6 – Published Reverse-Shell Behavior
DeviceProcessEvents
| where TimeGenerated >= ago(30d)
| where ProcessCommandLine has_any ("176.65.148.184","39323","top -bn1","base64 -d","base64 -w0","nc ")
| project TimeGenerated, DeviceName, AccountName, FileName, ProcessCommandLine, InitiatingProcessFileName, InitiatingProcessCommandLine, SHA256
| sort by TimeGenerated ascHunt 7 – New Public Destinations From Switchvox-Related Processes
let Baseline = DeviceNetworkEvents
| where TimeGenerated between (ago(30d) .. ago(7d))
| where InitiatingProcessFileName in~ ("postgres","postgres.exe","httpd","apache2","nginx","perl","perl.exe")
| where RemoteIPType == "Public"
| summarize by DeviceId, RemoteIP, RemotePort;
DeviceNetworkEvents
| where TimeGenerated >= ago(7d)
| where InitiatingProcessFileName in~ ("postgres","postgres.exe","httpd","apache2","nginx","perl","perl.exe")
| where RemoteIPType == "Public"
| join kind=leftanti Baseline on DeviceId, RemoteIP, RemotePort
| project TimeGenerated, DeviceName, InitiatingProcessFileName, InitiatingProcessCommandLine, RemoteIP, RemoteUrl, RemotePort, ActionType
| sort by TimeGenerated descHunt 8 – Suspicious Linux Shell and Download Activity
Syslog
| where TimeGenerated >= ago(30d)
| where SyslogMessage has_any ("switchvox","postgres","PhoneAppsHandler","db-quirks")
| where SyslogMessage has_any ("nc ","curl ","wget ","/bin/bash","/bin/sh","base64","chmod ","TO PROGRAM")
| project TimeGenerated, Computer, HostIP, ProcessName, SeverityLevel, SyslogMessage
| sort by TimeGenerated ascDetection Notes
- Highest signal is a
/paPOST correlated with PolycomIPPhone, PhoneIP, COPY TO PROGRAM, or suspicious PostgreSQL execution. - 176.65.148.184 is confirmed from observed exploitation but should not be treated as the only infrastructure.
- The local db-quirks.log artifact is only visible if forwarded into Sentinel.
- Endpoint Device* tables may not exist for the appliance.
- Legitimate Linux utilities require correlation with Switchvox/PostgreSQL context.