ConnectWise Cloud Backup Breach: What Happened and What to Do Now

A stolen backup-app credential gave Storm-0940 a key to thousands of Microsoft 365 tenants

Featured image

Most organisations protect Microsoft 365 with MFA, Conditional Access and a careful eye on user sign-ins. None of that mattered last week. A China-aligned group that Microsoft tracks as Storm-0940 did not log in as anyone. It logged in as the backup software, using credentials for applications that thousands of tenants had already trusted with broad access to their mail, files and directory.

The applications belonged to ConnectWise Cloud Backup (formerly SkyKick), a Microsoft 365 backup service sold largely through managed service providers (MSPs). Microsoft says the attackers used an open-source, AI-driven penetration testing framework called ARTEX to try those stolen credentials against more than 2,250 tenants. In some cases they went from first contact to privileged cloud access in under three hours.

If you, your MSP or any of your clients ever connected ConnectWise Cloud Backup, SaaS Security or Cloud Management to a Microsoft 365 tenant, this post explains what to check and what to do.

TL;DR / Key takeaways

  • What: Attackers took control of identities belonging to several ConnectWise cloud applications and used them to sign in to customer Microsoft 365 / Entra ID tenants as those apps, with no user and no MFA involved.
  • Who: Microsoft attributes the activity to Storm-0940, a China-state-aligned espionage group active since 2021, working with the agentic AI framework ARTEX.
  • Scale: Microsoft says the group attempted sign-ins to more than 2,250 tenants. Huntress later reported attacker sign-in activity in nearly 1,000 Entra tenants it could see, with more than 300 successful.
  • Why it’s dangerous: In some tenants the apps granted themselves Global Administrator or Exchange Administrator roles and added new secrets to other apps. That persistence can survive ConnectWise revoking its own credentials.
  • What to do: Keep the affected apps disabled (not deleted), preserve logs, hunt from 1 October onwards for service-principal sign-ins, role changes and new credentials, and remove anything you did not create.

Timeline

Dates are from Microsoft, Huntress, ConnectWise statements as reported by BleepingComputer, Dark Reading and Cybersecurity Dive. Details are still being published, and sources differ slightly on some dates.

When (2026) What happened
September Microsoft says Storm-0940 starts using ARTEX to automate attacks on hundreds of organisations.
10–14 Oct A password-spray campaign hits 327 Microsoft 365 / Exchange Online accounts at eight organisations: over 151,000 failed logons, peaking around 2,900 failures per minute on 11 Oct. Microsoft saw no successful logins.
15 Oct, from 01:58 UTC Huntress sees ConnectWise Cloud Management service principals assign themselves directory roles, mostly Exchange Administrator, in about 50 tenants it monitors.
15 Oct, 03:44 UTC In one partner tenant, the “Cloud Management - MS Teams” app adds itself to Global Administrator, then modifies two other applications.
15 Oct Microsoft observes app authentications from 144.172.64[.]128. Huntress records a second, more targeted wave against about 16 tenants in policy, national security, trade and critical minerals.
16 Oct ConnectWise discloses unauthorised access to application identities in its Cloud Backup environment. Huntress has confirmed unauthorised sign-ins in 162 tenants by 19:00 UTC.
17 Oct ConnectWise announces a service interruption and says it has disabled seven application identities. Previously issued tokens may stay valid until they expire.
18 Oct Scheduled backups, archive access and restores are unavailable. SaaS Security and Cloud Management are also taken offline as a precaution.
21 Oct Microsoft publishes its analysis attributing the attack to Storm-0940 and ARTEX, with hunting queries and detections.
22–24 Oct ConnectWise says restoration is under way in controlled phases and existing backup archives show “no indication of compromise”. Its 24 Oct advisory reportedly targets the start of phased partner onboarding for Monday 26 Oct, subject to checks.

How the attack worked

The trust was already there

ConnectWise Cloud Backup needs wide access to a tenant to back up mailboxes, OneDrive, SharePoint and Teams. Customers grant that access once, through admin consent to a multi-tenant application. After that, the vendor’s service authenticates as the application, using its own secret or certificate, and receives tokens for each customer tenant.

According to Huntress, a client assertion credential for the Cloud Backup app was compromised and used to obtain Microsoft Graph tokens in customer tenants. As BleepingComputer points out, these are automated, app-only sign-ins. There is no user, so MFA never comes into play, and controls built around user sign-ins don’t apply. ConnectWise has not publicly explained how the attackers first gained control of the application identities.

AI at machine speed

Microsoft describes ARTEX as an open-source, multi-agent LLM framework written in Go that can work with any AI model and runs penetration tests from reconnaissance to data exfiltration with little human input. Storm-0940 used it first for the failed password spray, then for the downstream sign-ins with stolen app credentials. Microsoft’s Figure 1 shows more than 200 sign-ins in under four minutes using four application credentials.

Huntress’s working view is an AI agent running scripted tooling with occasional human intervention. Microsoft adds that several other threat actors are also using ARTEX, which is freely available.

What happened after sign-in

Most attempts failed, but Microsoft says Storm-0940 “achieved privileged cloud persistence at many organizations in a brief time”. The post-compromise activity seen by Microsoft and Huntress includes:

That third point matters most. Revoking ConnectWise’s credentials does not remove secrets the attacker planted on your other applications. ConnectWise has said this itself: access set up through separate identities still needs review and remediation.

Am I affected?

You should investigate if any of these apply:

Huntress published these application (client) IDs. Microsoft’s blog lists the first, second and sixth. Search by app ID, not display name.

Application App (client) ID
ConnectWise Cloud Backup (formerly SkyKick) 506e08f9-6e9a-4da4-942b-a099a03644ae
Cloud Management - MS Teams 24205314-2b89-4e07-a2a4-579e898a5640
Cloud Management - Exchange Online b78f6a77-d4e5-46fb-87e5-d1648bd02519
Cloud Management - SharePoint Online b2b55f5b-7758-4719-8d8f-88ae172e6bdb
Cloud Management 2399d300-6fca-4e6a-a686-399fefe75b83
Cloud Management - MS Graph 0de14c77-b9b0-4137-9360-34878a929827
Cloud Management - Partner Center 412dcf96-176d-4b3a-a1b0-4981ad66971e

Published network indicators (all defanged):

Microsoft is explicit that an app being present, or even authenticating successfully, does not prove data was accessed. Equally, a clean IP search does not prove you were untouched. Don’t limit the review to the published IPs.

Detection and hunting

Preserve first. Export Entra sign-in and audit logs, Purview audit data and Graph activity logs before you change anything. Microsoft suggests reviewing from at least 15 October and extending service-principal sign-ins back to 1 October.

Quick inventory with Microsoft Graph PowerShell

Connect~|-|MgGraph ~|-|Scopes "Application.Read.All"
$ids ~|=| @(
 "506e08f9~|-|6e9a~|-|4da4~|-|942b~|-|a099a03644ae","24205314~|-|2b89~|-|4e07~|-|a2a4~|-|579e898a5640",
 "b78f6a77~|-|d4e5~|-|46fb~|-|87e5~|-|d1648bd02519","b2b55f5b~|-|7758~|-|4719~|-|8d8f~|-|88ae172e6bdb",
 "2399d300~|-|6fca~|-|4e6a~|-|a686~|-|399fefe75b83","0de14c77~|-|b9b0~|-|4137~|-|9360~|-|34878a929827",
 "412dcf96~|-|176d~|-|4b3a~|-|a1b0~|-|4981ad66971e")
foreach ($id in $ids) {
  Get~|-|MgServicePrincipal ~|-|Filter "appId eq '$id'" |
    Select~|-|Object DisplayName, AppId, Id, AccountEnabled
}

Record each service principal’s object Id. You’ll need it for the audit hunt and the clean-up.

Service-principal sign-ins (Microsoft Sentinel)

Look at the service principal sign-ins tab or table, not user sign-ins.

let cwApps ~|=| dynamic(["506e08f9~|-|6e9a~|-|4da4~|-|942b~|-|a099a03644ae","24205314~|-|2b89~|-|4e07~|-|a2a4~|-|579e898a5640",
  "b78f6a77~|-|d4e5~|-|46fb~|-|87e5~|-|d1648bd02519","b2b55f5b~|-|7758~|-|4719~|-|8d8f~|-|88ae172e6bdb",
  "2399d300~|-|6fca~|-|4e6a~|-|a686~|-|399fefe75b83","0de14c77~|-|b9b0~|-|4137~|-|9360~|-|34878a929827",
  "412dcf96~|-|176d~|-|4b3a~|-|a1b0~|-|4981ad66971e"]);
AADServicePrincipalSignInLogs
| where TimeGenerated >~|=| datetime(2026~|-|10~|-|01)
| where AppId in (cwApps) or IPAddress startswith "144.172.64." or IPAddress ~|=|~|=| "144.172.94.243"
| summarize Attempts ~|=| count(), Successes ~|=| countif(ResultType ~|=|~|=| "0"),
            First ~|=| min(TimeGenerated), Last ~|=| max(TimeGenerated),
            Resources ~|=| make_set(ResourceDisplayName, 10)
  by AppId, ServicePrincipalName, IPAddress
| order by Successes desc

Role grants and new credentials (Entra audit logs)

These operations are the persistence the attacker relied on. Any of them started by an application, especially a backup or management app, needs an explanation.

AuditLogs
| where TimeGenerated >~|=| datetime(2026~|-|10~|-|13)
| where OperationName has_any ("Add member to role", "app role assignment", "service principal credentials",
    "Certificates and secrets", "Update application", "Add owner", "Consent to application")
| extend InitiatorApp ~|=| tostring(InitiatedBy.app.displayName),
         InitiatorUser ~|=| tostring(InitiatedBy.user.userPrincipalName),
         Target ~|=| tostring(TargetResources[0].displayName)
| where isnotempty(InitiatorApp) or Target has_any ("ConnectWise","SkyKick")
| project TimeGenerated, OperationName, Result, InitiatorApp, InitiatorUser, Target,
          Details ~|=| tostring(AdditionalDetails)
| order by TimeGenerated asc

A service principal that adds itself to a directory role or adds secrets to other apps is rare in normal operations. Treat it as a confirmed incident until proven otherwise.

Also check

Response checklist

Immediately (today)

  1. Disable, don’t delete, every ConnectWise/SkyKick service principal you find. Deleting removes consent and evidence. Update-MgServicePrincipal -ServicePrincipalId <objectId> -AccountEnabled:$false does the job.
  2. Preserve logs (sign-in, audit, Purview, Graph activity, Key Vault) to storage you control. Retention is short on lower licence tiers.
  3. Keep the connections off until ConnectWise gives you explicit restoration instructions for your service, even if phased restoration starts this week.
  4. Remove unexpected privileged roles held by ConnectWise/SkyKick apps, especially Global Administrator, Exchange Administrator and Privileged Authentication Administrator.

This week

  1. Review every Enterprise application and App registration for client secrets or certificates added since 13 October that you didn’t create. Remove them and record what you found.
  2. Rotate secrets in any Key Vault that shows unusual bulk reads, and any credentials that were reachable from compromised identities.
  3. Check mailbox rules, forwarding and OAuth consent grants across the tenant.
  4. Confirm your backup position. Cloud Backup jobs are paused. Decide whether you can tolerate the gap or need an interim backup, and test a restore before reconnecting.
  5. MSPs: ConnectWise says it cannot see into downstream customer tenants. You have to review each client tenant yourself and tell clients clearly what you found.

Longer term

  1. Inventory third-party apps with high-privilege Graph permissions. Ask whether each one needs Mail.ReadWrite, Directory.ReadWrite.All or role-assignment rights.
  2. Use app management policies to block or limit client secrets and cap credential lifetimes. Restrict who holds Application Administrator and Cloud Application Administrator.
  3. Turn on Conditional Access for workload identities and Entra ID Protection risk detections for service principals where your licensing allows.
  4. Alert on service-principal role assignments and credential additions. These are rare, high-signal events.
  5. Rehearse cutting off a vendor app with your MSP or provider: who disables it, how quickly, and how you keep backups running meanwhile.

OffensioX perspective

This incident brings together two trends that are now hard to ignore. The first is that non-human identities are the new perimeter. Backup, security and management tools hold some of the most powerful standing permissions in a Microsoft 365 tenant, and they authenticate without MFA by design. A single vendor credential can open thousands of tenants at once. ConnectWise CEO Manny Rivelo summed it up: “one trusted connection can open the door to many organizations.”

The second is speed. Storm-0940 is not a new group, and spraying passwords or abusing OAuth apps are not new techniques. What changed is that an open-source agentic framework let the group try a stolen credential across thousands of tenants and escalate privileges in minutes. Microsoft’s Igor Tsyganskiy wrote that “a wave of AI-driven cyberattacks has been ongoing” since early October. Defenders who rely on someone noticing an alert the next morning will lose that race. What helps is fewer standing privileges for third-party apps and automated alerts on the handful of events that matter, such as an app granting itself a role.

For businesses in Pakistan and the wider region, many of which outsource Microsoft 365 administration to MSPs or work as MSPs for overseas clients, the lesson is to know which vendor apps sit in your tenant and what they can do. If you would like an independent review of your Entra ID and third-party app exposure, or a penetration test that covers cloud identity paths like this one, the OffensioX team can help.

References