Microsoft's Wednesday disclosure confirms what many of us in the DFIR community suspected when the first reports of anomalous ConnectWise Cloud Backup behavior surfaced: this was a deliberate, state-aligned supply chain operation. The actor, tracked as Storm-0940 and assessed with high confidence to be aligned with the People's Republic of China, leveraged ARTEX — a Go-based, agentic AI penetration testing framework — to accelerate reconnaissance, lateral movement, and data staging inside downstream customer environments.
This is not a theoretical supply chain risk. This is an active, in-the-wild compromise of a managed backup platform that sits inside thousands of MSP and enterprise networks with privileged access to critical data. If you run ConnectWise Cloud Backup, or if your MSP does, assume your attack surface just expanded.
Technical Analysis
What Happened
Storm-0940 gained unauthorized access to the ConnectWise Cloud Backup build or distribution infrastructure. Rather than deploying a static implant, the actor introduced or leveraged the ARTEX framework — an agentic AI system capable of autonomous decision-making during post-exploitation phases. ARTEX was originally developed as a Go-based offensive security platform but was pulled from public availability after its abuse in intrusions targeting South Korean financial institutions. Its reappearance here, in the hands of a state-aligned actor, signals that closed-source AI offensive tooling is now part of the nation-state playbook.
Why ARTEX Matters from a Defender's Perspective
Traditional post-exploitation frameworks follow predictable patterns: beaconing intervals, known C2 protocols, signature-able payloads. ARTEX's agentic architecture breaks those assumptions. The framework can:
- Dynamically adapt its reconnaissance and lateral movement based on the environment it lands in.
- Generate and execute Go-based tooling on-the-fly, often compiling payloads in memory or dropping short-lived binaries.
- Abuse legitimate cloud APIs and backup agent privileges to access, stage, and exfiltrate data without triggering legacy malware signatures.
- Operate with reduced beaconing by making autonomous decisions locally rather than waiting for tasking from a C2 server.
This means defenders cannot rely solely on signature-based detection or known-bad IP/domain lists. You need behavioral analytics focused on what the backup agent is doing, not just what it is.
Affected Products and Platforms
- Product: ConnectWise Cloud Backup
- Component: Backup agent software and cloud management plane
- Platforms: Windows and Linux endpoints running the ConnectWise Cloud Backup agent
- Threat Actor: Storm-0940 (China state-aligned)
- Tooling: ARTEX agentic AI penetration testing framework (Go-based)
No specific CVE identifier was disclosed in the reporting. The attack vector is the compromised supply chain itself, not a memory corruption or logic flaw in the traditional sense. The exploitation mechanism is the trust relationship between the backup vendor's infrastructure and the agents deployed in customer environments.
Exploitation Status
- Confirmed active exploitation: Yes. Microsoft attributes this to an ongoing campaign by Storm-0940.
- CISA KEV: Not listed at the time of writing. However, given the supply chain nature and active state-backed exploitation, inclusion is probable if a specific CVE is assigned.
- PoC / Public exploit: Not applicable; this is a targeted intrusion campaign, not a commoditized exploit kit.
Detection & Response
The detection strategy below focuses on identifying ARTEX framework behavior, anomalous activity originating from the ConnectWise Cloud Backup agent process, and Go-based post-exploitation artifacts. These are designed to be high-fidelity, not broad-net noise generators.
Sigma Rules
---
title: ConnectWise Cloud Backup Agent Spawning Unexpected Child Process
id: 9f8e7d6c-5b4a-3c2d-1e0f-a9b8c7d6e5f4
status: experimental
description: Detects the ConnectWise Cloud Backup agent process spawning command shells, scripting engines, or compilers, which may indicate ARTEX framework activity or supply chain compromise.
references:
- https://attack.mitre.org/techniques/T1059/
- https://attack.mitre.org/techniques/T1195/
author: Security Arsenal
date: 2026/04/08
tags:
- attack.execution
- attack.t1059
- attack.supply_chain
logsource:
category: process_creation
product: windows
detection:
selection_parent:
ParentImage|endswith:
- '\CloudBackup.exe'
- '\CWBackup.exe'
- '\connectwise.backup.exe'
selection_child:
Image|endswith:
- '\cmd.exe'
- '\powershell.exe'
- '\pwsh.exe'
- '\wscript.exe'
- '\cscript.exe'
- '\mshta.exe'
- '\rundll32.exe'
- '\regsvr32.exe'
- '\go.exe'
- '\tinygo.exe'
condition: selection_parent and selection_child
falsepositives:
- Legitimate backup agent updates or diagnostic scripts initiated by ConnectWise support
- MSP automation tools interacting with the backup agent
level: high
---
title: Go-Based Binary Execution from Backup or Temp Directories
id: 8a7b6c5d-4e3f-2a1b-0c9d-8e7f6a5b4c3d
status: experimental
description: Detects execution of Go-compiled binaries from temporary, backup, or user-writable directories, a common ARTEX framework artifact.
references:
- https://attack.mitre.org/techniques/T1204/
- https://attack.mitre.org/techniques/T1036/
author: Security Arsenal
date: 2026/04/08
tags:
- attack.defense_evasion
- attack.t1036
- attack.execution
logsource:
category: process_creation
product: windows
detection:
selection_path:
Image|startswith:
- 'C:\Users\*\AppData\Local\Temp\'
- 'C:\Windows\Temp\'
- 'C:\ProgramData\ConnectWise\'
- 'C:\Backup\'
selection_go:
- CommandLine|contains: 'go build'
- Image|endswith:
- '\go.exe'
- '\tinygo.exe'
- Description|contains: 'Go'
condition: selection_path and selection_go
falsepositives:
- Legitimate Go-based administrative tools deployed by IT
- Developer activity on endpoints (rare in server/backup contexts)
level: medium
---
title: Anomalous Network Connection from ConnectWise Backup Process
id: 7c6d5e4f-3a2b-1c0d-9e8f-7a6b5c4d3e2f
status: experimental
description: Detects network connections from ConnectWise Cloud Backup agent processes to non-standard ports or unexpected geographic destinations, which may indicate C2 or exfiltration activity.
references:
- https://attack.mitre.org/techniques/T1071/
- https://attack.mitre.org/techniques/T1041/
author: Security Arsenal
date: 2026/04/08
tags:
- attack.command_and_control
- attack.t1071
- attack.exfiltration
logsource:
category: network_connection
product: windows
detection:
selection_process:
Image|endswith:
- '\CloudBackup.exe'
- '\CWBackup.exe'
- '\connectwise.backup.exe'
selection_ports:
DestinationPort:
- 443
- 80
- 53
- 8080
- 8443
filter_known:
DestinationHostname|contains:
- 'connectwise.com'
- 'cwbackup.com'
- 'cloudbackup.connectwise.com'
condition: selection_process and selection_ports and not filter_known
falsepositives:
- Backup agent communicating with regional cloud storage endpoints
- Content delivery network (CDN) IP ranges not covered by hostname filter
level: high
KQL (Microsoft Sentinel / Defender)
// Hunt for ConnectWise Cloud Backup agent spawning suspicious child processes
let suspiciousParents = dynamic(["CloudBackup.exe", "CWBackup.exe", "connectwise.backup.exe"]);
let suspiciousChildren = dynamic(["cmd.exe", "powershell.exe", "pwsh.exe", "wscript.exe", "cscript.exe", "mshta.exe", "rundll32.exe", "regsvr32.exe", "go.exe", "tinygo.exe"]);
DeviceProcessEvents
| where TimeGenerated > ago(30d)
| where FileName in~ (suspiciousParents)
| project ParentTime = TimeGenerated, DeviceName, DeviceId, ParentProcessId = ProcessId, ParentFileName = FileName, ParentCommandLine = ProcessCommandLine, AccountName, InitiatingProcessFileName
| join kind=inner (
DeviceProcessEvents
| where TimeGenerated > ago(30d)
| where FileName in~ (suspiciousChildren)
| project ChildTime = TimeGenerated, DeviceName, DeviceId, ProcessId, FileName, ProcessCommandLine, SHA256, FolderPath
) on DeviceId
| where ChildTime >= ParentTime and ChildTime <= ParentTime + 5m
| project ChildTime, DeviceName, FileName, ProcessCommandLine, FolderPath, SHA256, ParentFileName, ParentCommandLine, AccountName
| order by ChildTime desc;
// Hunt for Go binary compilation or execution in temp/backup paths
DeviceProcessEvents
| where TimeGenerated > ago(30d)
| where (FolderPath has_any ("AppData\\Local\\Temp", "Windows\\Temp", "ProgramData\\ConnectWise", "Backup"))
| where (FileName =~ "go.exe" or FileName =~ "tinygo.exe" or ProcessCommandLine contains "go build" or ProcessCommandLine contains "tinygo build")
| project TimeGenerated, DeviceName, FileName, ProcessCommandLine, FolderPath, SHA256, AccountName, InitiatingProcessFileName
| order by TimeGenerated desc;
// Network connections from backup agent to non-ConnectWise destinations
DeviceNetworkEvents
| where TimeGenerated > ago(30d)
| where InitiatingProcessFileName has_any ("CloudBackup", "CWBackup", "connectwise.backup")
| where not(RemoteUrl has_any ("connectwise.com", "cwbackup.com", "cloudbackup.connectwise.com"))
| where RemotePort in (443, 80, 53, 8080, 8443)
| summarize Connections = count(), FirstSeen = min(TimeGenerated), LastSeen = max(TimeGenerated) by DeviceName, InitiatingProcessFileName, RemoteIP, RemoteUrl, RemotePort
| order by LastSeen desc;
Velociraptor VQL
-- Hunt for processes spawned by ConnectWise Cloud Backup agents and Go binary artifacts
SELECT Pid, Ppid, Name, CommandLine, Exe, Username, CreateTime,
dict(
ParentName=parent.Name,
ParentCommandLine=parent.CommandLine
) as ParentInfo
FROM pslist()
WHERE Name =~ '(?i)(CloudBackup|CWBackup|connectwise\.backup)'
OR CommandLine =~ '(?i)(go build|tinygo build)'
OR Exe =~ '(?i)(AppData\\Local\\Temp|Windows\\Temp|ProgramData\\ConnectWise)'
ORDER BY CreateTime DESC
-- Hunt for network connections from backup agent processes to non-standard destinations
SELECT Pid, Name, CommandLine, RemoteAddr, RemotePort, Status,
dict(
ProcessPath=process.Exe
) as ProcessInfo
FROM netstat()
WHERE Name =~ '(?i)(CloudBackup|CWBackup|connectwise\.backup)'
AND RemotePort IN (443, 80, 53, 8080, 8443)
AND NOT RemoteAddr =~ '(?i)(connectwise|cwbackup)'
ORDER BY RemoteAddr
Remediation Script
# ConnectWise Cloud Backup Integrity and Hardening Verification Script
# Run with elevated privileges on endpoints and servers with ConnectWise Cloud Backup installed
Write-Host "=== ConnectWise Cloud Backup Security Verification ===" -ForegroundColor Cyan
# 1. Verify ConnectWise Cloud Backup service status and binary path
$backupServices = Get-Service | Where-Object { $_.Name -match 'backup|connectwise' -and $_.Status -eq 'Running' }
foreach ($svc in $backupServices) {
Write-Host "[INFO] Found service: $($svc.Name) - $($svc.DisplayName)" -ForegroundColor Green
$proc = Get-Process -Id $svc.ProcessId -ErrorAction SilentlyContinue
if ($proc) {
Write-Host " Path: $($proc.Path)" -ForegroundColor Gray
Write-Host " SHA256: $(Get-FileHash -Path $proc.Path -Algorithm SHA256 -ErrorAction SilentlyContinue | Select-Object -ExpandProperty Hash)" -ForegroundColor Gray
}
}
# 2. Check for unexpected child processes of backup agents
$suspiciousChildren = @('cmd.exe','powershell.exe','pwsh.exe','wscript.exe','cscript.exe','mshta.exe','rundll32.exe','regsvr32.exe','go.exe','tinygo.exe')
$backupProcs = Get-Process | Where-Object { $_.Name -match 'CloudBackup|CWBackup|connectwise.backup' }
foreach ($parent in $backupProcs) {
$children = Get-CimInstance Win32_Process | Where-Object { $_.ParentProcessId -eq $parent.Id -and $suspiciousChildren -contains $_.Name }
if ($children) {
Write-Host "[ALERT] Backup process $($parent.Name) (PID: $($parent.Id)) has suspicious child processes:" -ForegroundColor Red
foreach ($child in $children) {
Write-Host " - $($child.Name) (PID: $($child.ProcessId)) | CmdLine: $($child.CommandLine)" -ForegroundColor Yellow
}
}
}
# 3. Audit recent network connections from backup processes
Write-Host "`n[INFO] Auditing recent network connections from backup processes..." -ForegroundColor Cyan
$netConnections = Get-NetTCPConnection -State Established -ErrorAction SilentlyContinue
foreach ($conn in $netConnections) {
$proc = Get-Process -Id $conn.OwningProcess -ErrorAction SilentlyContinue
if ($proc -and $proc.Name -match 'CloudBackup|CWBackup|connectwise.backup') {
$remoteHost = try { [System.Net.Dns]::GetHostEntry($conn.RemoteAddress).HostName } catch { "Unresolved" }
if ($remoteHost -notmatch 'connectwise|cwbackup') {
Write-Host "[ALERT] Non-ConnectWise connection: $($proc.Name) -> $($conn.RemoteAddress):$($conn.RemotePort) ($remoteHost)" -ForegroundColor Red
}
}
}
# 4. Check for Go binaries in temp/backup directories
Write-Host "`n[INFO] Scanning for Go binaries in high-risk directories..." -ForegroundColor Cyan
$scanPaths = @("$env:TEMP", "$env:ProgramData\ConnectWise", "C:\Backup", "$env:USERPROFILE\AppData\Local\Temp")
foreach ($path in $scanPaths) {
if (Test-Path $path) {
$goBinaries = Get-ChildItem -Path $path -Recurse -Filter "*.exe" -ErrorAction SilentlyContinue | Where-Object {
$_.Name -match 'go|tinygo' -or
(Get-Item $_.FullName).VersionInfo.FileDescription -match 'Go'
}
if ($goBinaries) {
foreach ($bin in $goBinaries) {
Write-Host "[ALERT] Potential Go binary found: $($bin.FullName)" -ForegroundColor Red
Write-Host " SHA256: $(Get-FileHash -Path $bin.FullName -Algorithm SHA256 | Select-Object -ExpandProperty Hash)" -ForegroundColor Yellow
}
}
}
}
# 5. Verify backup agent version against vendor advisory
Write-Host "`n[INFO] Checking ConnectWise Cloud Backup agent version..." -ForegroundColor Cyan
$agentPath = Get-ChildItem -Path "${env:ProgramFiles}", "${env:ProgramFiles(x86)}", "$env:ProgramData" -Recurse -Filter "*backup*.exe" -ErrorAction SilentlyContinue | Where-Object { $_.Name -match 'CloudBackup|CWBackup' } | Select-Object -First 1
if ($agentPath) {
$version = (Get-Item $agentPath.FullName).VersionInfo.ProductVersion
Write-Host "[INFO] Detected agent version: $version" -ForegroundColor Green
Write-Host "[ACTION] Compare against ConnectWise security advisory for known vulnerable versions." -ForegroundColor Magenta
} else {
Write-Host "[WARNING] Could not locate ConnectWise Cloud Backup agent binary. Verify installation path manually." -ForegroundColor Yellow
}
Write-Host "`n=== Verification Complete ===" -ForegroundColor Cyan
Write-Host "Review all ALERT entries above. If suspicious activity is confirmed, isolate the host and initiate IR procedures." -ForegroundColor White
Remediation
Immediate actions for organizations running ConnectWise Cloud Backup:
-
Isolate and validate: If the detection script above or your EDR flags anomalous child processes or network connections from the backup agent, isolate the host immediately. Do not wait for confirmation from ConnectWise.
-
Verify agent integrity: Compare the SHA256 hash of your installed backup agent binaries against known-good hashes provided directly by ConnectWise through authenticated channels. Do not rely on hashes posted to public forums.
-
Rotate credentials and API keys: Storm-0940 used ARTEX to access and exfiltrate data. Assume any credentials, API keys, or service accounts accessible from the backup agent context are compromised. Rotate them immediately.
-
Apply vendor patches: Monitor ConnectWise's official security advisory portal for patched agent versions and cloud infrastructure updates. Apply updates through the vendor's authenticated update mechanism only — not via direct download links from email or third-party sites.
-
Restrict backup agent privileges: Where operationally feasible, run the backup agent under a constrained service account with least-privilege access. Block outbound network access from the backup agent to all destinations except explicitly whitelisted ConnectWise cloud endpoints.
-
Enable enhanced logging: Ensure Sysmon, Windows Event Forwarding, or your EDR platform is capturing process creation with command-line arguments, network connections, and file creation events for the backup agent process tree.
-
Hunt for ARTEX artifacts: Use the Sigma, KQL, and VQL content provided above to hunt across your environment for Go-based compilation activity, unexpected child processes, and anomalous network destinations. Look back at least 30 days.
-
Review backup integrity: Given that this is a backup platform compromise, validate the integrity of recent backups. Storm-0940 may have tampered with backup catalogs or injected malicious payloads into backup images to ensure persistence through restoration.
Related Resources
Security Arsenal Penetration Testing Services AlertMonitor Platform Book a SOC Assessment vulnerability-management Intel Hub
Is your security operations ready?
Get a free SOC assessment or see how AlertMonitor cuts through alert noise with automated triage.