A phone system field meant to hold a Polycom handset’s IP address turned out to be a direct line into a PostgreSQL database with superuser rights — and by the time anyone outside Sangoma knew about it, attackers had already worked out how to ride that line all the way to a root shell. Horizon3.ai’s researchers reported the bug in April 2026. Sangoma patched it in July. On 30 August, honeypots watching for exactly this attack started recording it happening for real.

An XML tag with no manners

Switchvox, Sangoma’s small-business VoIP phone system, exposes an unauthenticated HTTP endpoint called /pa that exists to receive status notifications from Polycom desk phones. According to Horizon3’s technical writeup, the handler checks only that an incoming POST body starts with a <PolycomIPPhone> tag, then parses the rest as XML and pulls out a PhoneIP value. That value is meant to be an IP address. Instead of being validated as one, it gets concatenated directly into a SQL query string that Switchvox’s tel_notify() function runs against its PostgreSQL backend — no parameterization, no escaping, no authentication required to reach any of it.

From there the path to code execution is a known one: PostgreSQL’s COPY TO PROGRAM command lets a query pipe its output into an arbitrary shell command, running with whatever privileges the database connection holds. Horizon3 says that connection runs as PostgreSQL superuser, which is effectively total control of the box. Their own proof-of-concept used COPY TO PROGRAM to open a reverse shell with nc; the attackers Horizon3 later caught in its honeypots used the identical technique, down to the same nc | sh pattern, against a different IP.

Reported in April, patched in July, exploited in August

The timeline matters here as much as the bug. Horizon3 reported this flaw — one of twelve it found in Switchvox — to Sangoma on 10 April 2026 and had a pre-release patch to validate by 21 April. Sangoma shipped the fix, version 8.4.0.2, on 14 July. Horizon3 seeded honeypots to watch for exploitation in early May, well before the patch even landed, anticipating that a public writeup — or simple binary diffing of the patched release against the old one — would eventually hand attackers the same bug.

That’s what happened. On 30 August, Horizon3’s honeypots recorded exploitation attempts from a single IP address, 176.65.148.184, sending the same PolycomIPPhone payload pattern against multiple sensors in quick succession. Zach Hanley, the Horizon3 researcher who published the disclosure, called the pattern deliberate: “Given the quick succession of exploit attempts across multiple honeypots from the same source IP, we believe that it is likely that most internet exposed Switchvox instances will be or have already been targeted.” By 2 September, BleepingComputer reported dozens of additional source IPs had joined in, with some now dropping second-stage cryptomining malware after the initial reverse shell.

Shodan scans cited in Horizon3’s writeup put roughly 4,000 internet-exposed Switchvox instances online, most of them in the United States — the entire population of systems still running 8.3 or earlier is the attack surface. Horizon3 also notes that the injection leaves a trail: successful exploitation attempts show up in /var/log/switchvox/db-quirks.log on affected boxes, giving defenders a concrete place to check rather than having to guess whether they were hit.

A KEV listing puts a federal deadline on it

CVE-2026-9586 carries a CVSS 4.0 score of 9.3, and on 2 September 2026 CISA added it to its Known Exploited Vulnerabilities catalog alongside six other actively-exploited flaws, including the SonicWall SMA1000 chain and the Kestra and LiteLLM bugs Tech-Bee has covered separately. The Hacker News’s rundown of that batch describes the Switchvox flaw in almost identical terms to Horizon3’s own writeup: a single crafted HTTP request that lets an unauthenticated attacker “execute arbitrary SQL statements against the backend PostgreSQL database,” escalating from there to remote code execution. A KEV listing carries a federal remediation deadline — 5 September for this entry — a signal reserved for vulnerabilities CISA has independently confirmed are being exploited, not merely theorized about.

Twelve bugs, one that mattered most

Horizon3’s April disclosure to Sangoma wasn’t a single-bug report — it covered twelve separate vulnerabilities the firm found in Switchvox during one research pass. CVE-2026-9586 is the one that turned into a live incident, but the volume is itself worth noting: a single vendor audit surfacing a dozen flaws in one product is a sign of how much unexamined attack surface accumulates in appliance software that mostly runs unattended once it’s deployed, quietly handling phone traffic in a network closet somewhere until a researcher — or an attacker — finally looks closely at it.

Why a phone system is worth breaking into

Switchvox isn’t a target because of what it stores; it’s a target because of where it sits. Hanley’s disclosure describes exactly this: compromised VoIP servers function as “pivot points into organizations from external into internal networks.” A phone system typically has legitimate reasons to talk to a company’s internal network — extensions, voicemail servers, call routing — which makes it a plausible-looking hop for an attacker who has just landed a root shell on an internet-facing box and now needs to reach something more valuable behind it.

The lessons that generalise

A patch’s release date is not when the clock starts — the disclosure report date is. Horizon3 reported this bug in April; Sangoma’s July patch gave attackers a functioning before-and-after diff to reverse engineer. Four and a half months of lead time between report and in-the-wild exploitation is not evidence of a slow attacker — it’s evidence that unpatched systems stay exploitable for as long as they stay unpatched, regardless of how old the underlying bug report is.

Any field that claims to hold a fixed-format value — an IP address, a phone extension, a MAC address — needs to be validated as that format, not merely well-escaped as a string. The PhoneIP field’s actual sin wasn’t missing escaping; it was being trusted to already look like an IP address when nothing enforced that. Format validation and injection defense are two different controls, and this bug shows what happens when a system only has one of them.

Database accounts used by application code should never hold superuser privileges. Every step of this exploit chain — the injection, the COPY TO PROGRAM pivot, the resulting shell — depends on the Switchvox application’s database connection having far more power than serving phone-status callbacks requires. A scoped, least-privilege database role would have turned a SQL injection into an information-disclosure bug instead of a root compromise.

Edge appliances with no obvious “crown jewel” data are still worth attacking, because they’re worth standing on. A VoIP box is a foothold, not a payday, and treating internet-facing infrastructure as low-priority because it doesn’t hold customer records misreads what attackers actually want from it.


Tech-Bee is an independent technology publication. This piece is drawn from Horizon3.ai’s technical disclosure of CVE-2026-9586, and from reporting by BleepingComputer, Help Net Security and SentinelOne’s vulnerability database.