In 2022 a 3CX employee installed X_TRADER, a retired trading application whose official installer had been trojanized, on a personal computer. The attackers stole the employee's corporate credentials, reached 3CX's Windows and macOS build environments, and in early 2023 shipped validly signed 3CX DesktopApp releases containing malware (CVE-2023-29059). Customers' EDR products flagged the behavior from 2023-03-22, and vendors published on 2023-03-29. Isolating build systems from personal devices and corporate credentials, and verifying builds independently, would have broken the chain.
- Mandiant called it the first cascading software supply-chain compromise it had seen: one vendor's trojanized software led to another vendor's trojanized release.
- Affected: Windows 18.12.407 and 18.12.416 (Update 7); macOS 18.11.1213, 18.12.402, 18.12.407 and 18.12.416.
- The malicious builds were validly signed by 3CX, so signature checks passed; behavior-based EDR raised the alarm.
- The entry point was a personal computer with corporate VPN credentials, two days from first infection to VPN access.
- 3CX said most installations held the files dormant and were never chosen for the next stage; the attackers picked their targets.
- Mandiant attributed the activity to UNC4736, a cluster with a North Korean nexus; that is an assessment, not a court finding.
Incident at a glance
- Dates
- to
- Category
- Supply-chain compromise
- Organizations
- 3CX
- Trading Technologies (X_TRADER)
- Impact
- 3CX built and signed DesktopApp releases for Windows (18.12.407, 18.12.416) and macOS (18.11.1213, 18.12.402, 18.12.407, 18.12.416) that loaded further malware. 3CX said most installations held the files dormant; the attackers chose which customers received later stages.
- How it was found
- Customers' EDR products flagged the signed app's behavior from 2023-03-22; CrowdStrike, SentinelOne and Sophos published on 2023-03-29.
Timeline
- Trading Technologies retires X_TRADER; the installer stays downloadable from its website.
- The attackers begin registering infrastructure; Trading Technologies' website is compromised.
- A 3CX employee installs the trojanized X_TRADER on a personal computer; two days later the attackers use the employee's credentials on 3CX's VPN.
- The GitHub repository later used to serve encoded C2 addresses is in use from this date.
- SentinelOne sees a spike in behavioral detections of the signed app.
- CrowdStrike, SentinelOne and Sophos publish their findings.
- 3CX confirms the affected versions and advises its browser-based PWA; CVE-2023-29059 is published.
- 3CX publishes Mandiant's interim results, attributing the activity to UNC4736.
- 3CX and Mandiant name the initial intrusion vector: the trojanized X_TRADER.
| Setting | Value | Note | Source |
|---|---|---|---|
| Affected Windows builds | 3CX DesktopApp (Electron) 18.12.407 and 18.12.416 | Shipped in 3CX Update 7. | 3CX security alert (2023-03-30) |
| Affected macOS builds | 18.11.1213 (Update 6), 18.12.402, 18.12.407 and 18.12.416 (Update 7) | 3CX corrected the macOS list on 2023-04-01. | 3CX security alert |
| CVE | CVE-2023-29059, CVSS 3.1 base score 7.8 (NVD and CISA ADP) | The record assigns no CWE; this guide maps it to CWE-506. Not in the CISA KEV catalog. | CVE record; CISA KEV |
| Initial access | Trojanized X_TRADER installer X_TRADER_r7.17.90p608.exe, signed by Trading Technologies | X_TRADER was retired in 2020 but still downloadable in 2022; the certificate expired in October 2022. | 3CX and Mandiant (2023-04-20) |
| First detections | 2023-03-22 | SentinelOne saw a spike in behavioral detections; users asked whether they were false positives. | SentinelOne; Sophos |
| Vendor response | Uninstall the desktop app and use the browser-based PWA; new builds signed with a new certificate | 3CX said the malicious domains and GitHub repository were taken down. | 3CX security alert |
- Inventory desktop applications across endpoints, including per-user installs, and compare versions with vendor advisories rather than relying on signature checks.
- Confirm that personal and unmanaged devices cannot reach the VPN or build systems, and that VPN access requires phishing-resistant MFA bound to a managed device.
- Check that build and signing environments sit in a separate network segment reachable only from managed admin workstations, with EDR coverage.
- Rebuild a release on an independent builder and compare the outputs before signing.
- Review your EDR exception list for rules that exempt signed vendor software, and require investigation before any is added.
- Applies to
- 3CX DesktopApp (Electron) Windows 18.12.407, 18.12.416; macOS 18.11.1213, 18.12.402, 18.12.407, 18.12.416
- Trading Technologies X_TRADER Trojanized installer X_TRADER_r7.17.90p608.exe (retired product, still hosted in 2022)
Software vendors whose employees can reach build systems from personal or unmanaged devices, and organizations that deploy signed desktop applications from vendors.
- Part of
- Workflow: Build an AppSec program. Collection: case studies
Learning goals and prerequisites
What you will learn
- Trace the cascade from a trojanized third-party installer to signed 3CX releases.
- Explain why signature checks passed and how behavioral detection caught the release.
- Check endpoints for affected versions without relying on code signatures.
- Choose the workstation, network and build controls that would have broken each link, mapped to SSDF and SLSA.
Before you start
Security and platform engineers at software vendors who own build and signing infrastructure, and endpoint and IT teams who deploy vendor desktop applications
- Know how a desktop application is built, signed and updated.
- Know what EDR behavioral detection reports and how exemptions work.
- For the code: PowerShell on Windows or a shell on macOS.
Refresh first: Protect the path from pull request to release
Go to the guided practice3CX makes a business phone system with a desktop softphone, 3CX DesktopApp, built with Electron for Windows and macOS. At the end of March 2023, endpoint security products began flagging the app's behavior on customer machines. The releases were genuine: 3CX had built and signed them. The attackers had compromised 3CX's Windows and macOS build environments, and the builds included a trojanized library that loaded further malware.
Mandiant's investigation traced 3CX's compromise to a different software supply-chain attack. In 2022 a 3CX employee installed X_TRADER, a trading application from Trading Technologies, on a personal computer. The installer came from Trading Technologies' own website and was signed with its certificate, but it had been trojanized. Mandiant described this as the first cascading software supply-chain compromise it had observed.
| When | Event | Source |
|---|---|---|
| 2020 | Trading Technologies retires X_TRADER; the installer remains downloadable from its website. | 3CX (2023-04-20); Mandiant |
| February 2022 | The attackers begin registering infrastructure, and Trading Technologies' website, tradingtechnologies[.]com, is compromised; Google TAG reported it in March 2022. | SentinelOne; Mandiant |
| 2022 (date not published) | A 3CX employee installs the trojanized X_TRADER on a personal computer; the VEILEDSIGNAL backdoor steals the employee's 3CX credentials. | 3CX and Mandiant (2023-04-20) |
| Two days later | First evidence of compromise in 3CX's corporate network: a VPN login with the employee's credentials. | 3CX and Mandiant (2023-04-20) |
| October 2022 | The X_TRADER code-signing certificate expires. | Mandiant |
| 2022-12-08 | The GitHub file storage later used to serve encoded C2 addresses is in use from this date. | Sophos |
| Early 2023 | Trojanized DesktopApp builds ship: macOS 18.11.1213 in Update 6; Windows and macOS 18.12.x in Update 7. | 3CX security alert |
| 2023-03-22 | SentinelOne sees a spike in behavioral detections of 3CXDesktopApp; users ask whether they are false positives. | SentinelOne; Sophos |
| 2023-03-29 | CrowdStrike, SentinelOne and Sophos publish; CrowdStrike reports beaconing, second-stage payloads and a few hands-on-keyboard intrusions. | CrowdStrike; SentinelOne; Sophos |
| 2023-03-30 | 3CX confirms the affected versions, advises using its browser-based PWA, and plans new builds with a new certificate; CVE-2023-29059 is published. | 3CX; CVE record |
| 2023-04-11 | 3CX publishes Mandiant's interim results: TAXHAUL and COLDCAT on Windows, attribution to UNC4736. | 3CX |
| 2023-04-20 | 3CX and Mandiant publish the initial intrusion vector: the trojanized X_TRADER. | 3CX; Mandiant |
- Personal computer: the trojanized X_TRADER installer deployed VEILEDSIGNAL, a modular backdoor with administrator-level access.
- Corporate network: the attackers used the employee's stolen 3CX credentials on the VPN two days later, then moved laterally with the Fast Reverse Proxy tool disguised as
MsMpEng.exeand harvested more credentials. - Build environments: on the Windows build environment they ran the TAXHAUL launcher and COLDCAT downloader, persisting through DLL hijacking of the
IKEEXTservice as LocalSystem; on the macOS build server, the POOLRAT backdoor persisted as a LaunchDaemon. - Release: the shipped Windows app side-loaded a trojanized but working
ffmpeg.dll, which carried on with the rest of the chain using an encrypted payload appended tod3dcompiler_47.dll. After waiting one to four weeks, it fetched icon files from GitHub with encoded C2 addresses. - Selection: the next stage, ICONICSTEALER, collected browser history and the app's configuration; 3CX said most installations had the files dormant and were never chosen for more.
Customers' endpoint detection caught it by behavior: a signed softphone loading an unexpected payload and beaconing to unfamiliar infrastructure. SentinelOne saw detections rise from 2023-03-22, a week before public reports. On 3CX's forum, users first asked whether the alerts were false positives, which is the normal reaction when security software flags a signed, widely used application.
That week is the lesson for customers. An alert on a signed vendor binary is exactly what a build compromise looks like, so exempting the binary to stop the noise would have hidden it. Treat a new behavioral detection on trusted software as an incident until the vendor and your own analysis rule it out.
Look at the installed version, not the signature: the affected builds were signed by 3CX and passed signature checks. The PowerShell below reads per-user and per-machine install records on Windows and shows the signer of the bundled ffmpeg.dll; the shell script checks macOS application bundles. Pair a version hit with EDR and DNS history for the period the version was installed.
# Windows: installed 3CX desktop apps (per-user and per-machine installs)
$bad = '18.12.407', '18.12.416'
Get-ItemProperty 'HKCU:\Software\Microsoft\Windows\CurrentVersion\Uninstall\*',
'HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall\*' -ErrorAction SilentlyContinue |
Where-Object { $_.DisplayName -like '*3CX*' } |
Select-Object DisplayName, DisplayVersion, InstallLocation,
@{ Name = 'Affected'; Expression = { $bad -contains $_.DisplayVersion } }
# The trojanized builds were validly signed, so a good signature is not a clean bill:
Get-ChildItem "$env:LOCALAPPDATA\Programs" -Recurse -Filter 'ffmpeg.dll' -ErrorAction SilentlyContinue |
Where-Object { $_.FullName -like '*3CX*' } |
ForEach-Object { Get-AuthenticodeSignature $_.FullName } |
Select-Object Path, Status, @{ Name = 'Signer'; Expression = { $_.SignerCertificate.Subject } }codesign shows who signed the bundle. For the affected releases it would show 3CX's own developer identity, which is why the version is the field that matters.
# macOS: affected builds were 18.11.1213, 18.12.402, 18.12.407 and 18.12.416
for app in /Applications/3CX*.app "$HOME"/Applications/3CX*.app; do
[ -d "$app" ] || continue
version=$(/usr/libexec/PlistBuddy -c 'Print CFBundleShortVersionString' "$app/Contents/Info.plist")
case "$version" in
18.11.1213|18.12.402|18.12.407|18.12.416) echo "AFFECTED: $app $version" ;;
*) echo "not a listed version: $app $version" ;;
esac
codesign -dv --verbose=2 "$app" 2>&1 | grep -E '^(Authority|TeamIdentifier)='
doneEach link in the chain had a standard control that would have stopped it or made it far harder. NIST's SSDF practice PO.5 asks for separate, protected development and build environments; the SLSA Build track asks for builds isolated from each other and from the people and systems around them, with provenance a consumer can verify.
| Link in the chain | Control | SSDF practice or SLSA requirement | Guide |
|---|---|---|---|
| Personal computer with corporate credentials | Corporate access only from managed devices; phishing-resistant MFA bound to the device; no corporate secrets on personal machines | SSDF PO.5 | /domains/supply-chain/ci-cd/developer-workstation-security/ |
| Retired software still installed | Inventory endpoints and remove end-of-life software; treat a vendor's retired installer as unmaintained | SSDF PO.5, PW.4 | /domains/supply-chain/dependencies/project-health-and-intake/ |
| Lateral movement to build systems | Separate network segment for build and signing; access only from admin workstations; EDR on build hosts | SSDF PO.5; SLSA Build L3 isolation | /domains/supply-chain/ci-cd/build-integrity/ |
| Tampered build output | Ephemeral builders; independent rebuild and comparison before signing | SSDF PS.2, PW.6; SLSA verification | /domains/supply-chain/builds/reproducibility-and-hermeticity/ |
| Malicious release signed with the real key | Signing only in an isolated release step, after verification; provenance naming the source and builder | SSDF PS.2; SLSA Build L2-L3 provenance | /domains/supply-chain/provenance/artifact-signature-policy/ |
| Customer-side detection | Investigate behavioral alerts on signed software; no blanket exemptions for vendor binaries | SSDF RV.1 (customer process) | /domains/runtime/detection/runtime-detection-response/ |
- Your supply chain includes the software your employees install, not only the dependencies your code imports.
- A build environment reachable from a corporate VPN account is reachable from every device that holds that account's credentials.
- A valid signature tells you whose key signed, not that the build was clean; compare against an independent build or provenance.
- End-of-life software is a supply-chain risk even when its vendor still hosts the installer.
- Behavioral detection on endpoints caught what signatures and reputation did not, but only for the customers who did not exempt the alerts.
The public reports do not give the date the employee installed X_TRADER, the number of 3CX customers who received second-stage payloads, or a full list of victims; 3CX said most installations were never infected beyond the dormant files. How Trading Technologies' website and installer were compromised is described only through Google TAG's report of a February 2022 compromise. Attribution to UNC4736 and its North Korean nexus is Mandiant's assessment; CrowdStrike attributed the activity to a group it tracks as LABYRINTH CHOLLIMA, and the names are not interchangeable.
Guided practice
It is 2023-03-30. You run endpoint security for a company that uses 3CX, and you also ship your own desktop app. Decide the status of each item and what to do. Treat the facts as true.
Supplied scenario material
E1: Windows laptop, 3CX DesktopApp 18.12.416 installed 2023-03-14; EDR blocked a child process on 2023-03-23 and an analyst added an exemption for 3CXDesktopApp.exe on 2023-03-24 as a false positive.
E2: Windows laptop, 3CX DesktopApp 18.12.416 installed 2023-03-27; EDR quarantined ffmpeg.dll the same day; no outbound connections to the published domains.
E3: macOS laptop, 3CX DesktopApp 18.11.1100.
E4: Your own build server for your desktop product: a Windows VM in the corporate network, reachable over RDP from any VPN user with the build-admin group; two engineers in that group use personal computers for VPN access.
E5: An engineer's personal computer has a retired trading tool installed from its vendor's website in 2022.1. Decide E1
What is E1's status, and what was the mistake?
Expected result and reasoning
Affected version, and the exemption let the malware run after 2023-03-24. Treat E1 as compromised: isolate it, collect EDR and DNS data from 2023-03-14, check for second-stage activity, rotate credentials used on it, remove the app and the exemption, and review other exemptions for signed vendor software.
2. Decide E2
What is E2's status?
Expected result and reasoning
Affected version, but EDR quarantined the malicious library before it ran and there is no outbound connection to the indicators. Remove the app, keep the evidence, confirm no persistence, and move users to the PWA; a lower-priority investigation than E1.
3. Clear E3
Is E3 affected?
Expected result and reasoning
No: 18.11.1100 is not one of the affected macOS versions (18.11.1213, 18.12.402, 18.12.407, 18.12.416). Hold updates until 3CX ships new builds, then update.
4. Fix E4
List the changes that would stop the 3CX path into your own build.
Expected result and reasoning
Move the build server to a separate segment reachable only from managed admin workstations, not from VPN users; require managed devices and phishing-resistant MFA for VPN and build access; make builders ephemeral with EDR; and verify each release with an independent rebuild and provenance before the isolated signing step.
5. Handle E5
What do you do about the personal computer with the retired tool?
Expected result and reasoning
Treat it as untrusted: it should not hold corporate credentials or VPN access at all. Revoke its access, rotate the engineer's credentials, and provide a managed device; the trading tool is unmaintained software from a vendor that no longer supports it.
The endpoints and build server are invented. Real scoping used vendor indicator lists, EDR telemetry and DNS logs that grew during the investigation, and an affected version without execution evidence is not proof that nothing ran.
Save a draft on this device to resume later. Automatic saving begins after you choose Save. Drafts are never sent by this application; use synthetic data.
No draft saved on this device yet.
Sources & further reading
The standards, specifications and documentation behind the guidance above. Each is the evidence for a claim on this page; consult it for detail beyond the defaults and versions listed here.
- 3CX: DesktopApp security alert (2023-03-30)
- 3CX: Security update 11 April 2023, Mandiant initial results
- 3CX: Security update 20 April 2023, initial intrusion vector found
- Mandiant: 3CX software supply chain compromise initiated by a prior software supply chain compromise (2023-04-20)
- CrowdStrike: Falcon platform detects and prevents active intrusion campaign targeting 3CXDesktopApp customers (2023-03-29)
- SentinelOne: SmoothOperator, ongoing campaign trojanizes 3CX software (2023-03-29)
- Sophos: 3CX users under DLL-sideloading attack, what you need to know. Updated 6 April 2023.
- CVE.org: CVE-2023-29059 record
- NIST SP 800-218: Secure Software Development Framework. Version 1.1 (February 2022).
Reference information
- Tags
- Supply chain attacksBuild integrity and provenanceSigning and software updatesLogging and detection
- SDLC phase
- ReleaseMaintenance
- CAPEC attack patterns