ConnectWise Cloud Backup Compromise. Disable. Preserve. Hunt.
Stolen secrets for ConnectWise Cloud Backup (formerly SkyKick) apps were used to sign in to Microsoft 365 tenants without any user. Clear steps to check exposure, contain the apps and hunt for persistence across your own tenant or your clients'.
At a Glance
Facts from Microsoft's report and ConnectWise's advisories and remediation guide. Last updated 22 October 2026, 08:00 BST.
Apps disabled
ConnectWise disabled its seven Microsoft 365 apps at 08:00 BST on 17 October and is restoring service in phases, with updates twice a day. Backup and restore stay unavailable until it publishes reconnection steps.
Tenant takeover risk
No CVE and no patch. Secrets for ConnectWise multi-tenant apps were stolen and used to get into customer tenants. In some tenants privileged access was reached in under 3 hours.
Any tenant ever connected
Every Microsoft 365 tenant where these apps were ever authorised, including old and dormant SkyKick connections. MSPs need to check their own tenant and every client tenant.
Storm-0940
On 21 October Microsoft attributed the attack to Storm-0940, a China-aligned group, using an agentic AI framework to work at machine speed. Microsoft saw sign-in attempts against more than 2,250 tenants.
Automated password spray against Microsoft 365 accounts from 144.172.64[.]99. Microsoft saw no successful sign-ins from it.
ConnectWise discovers the problem and starts incident response.
First public reports of the compromise. Attacker sign-ins into customer tenants through the ConnectWise apps.
ConnectWise publishes its first advisory.
ConnectWise disables the seven app identities and revokes their certificates. Backups stop.
ConnectWise completes a full reset of accounts and credentials in the affected Cloud Backup environment.
Microsoft attributes the attack to Storm-0940. ConnectWise begins phased restoration.
Keep the apps disabled, preserve logs, and hunt every tenant for credentials, roles and mailbox changes the attacker may have left behind.
What to Do in the Next 24 Hours
Proactive on the left. Reactive on the right. Tick both tracks.
Contain and preserve
- Find the ConnectWise apps by application ID in every tenant, including dormant ones.
- Disable them in Entra. Do not delete them, because they hold evidence.
- Export Entra sign-in and audit logs, Purview audit and Graph activity logs now. Free Entra tenants keep only 7 days.
- Alert on app credential additions, app role assignments and self-assigned admin roles.
Hunt and remove access
- Check service principal sign-ins since 15 October (or 1 October), successful and failed.
- Check audit logs for new credentials, owners, consent grants, role assignments and MFA or Conditional Access changes.
- Check mailboxes for bulk access, new forwarding and new inbox rules.
- Keep the evidence, then remove attacker credentials and rotate secrets. Disabling the app does not remove them.
Proactive: Check Exposure and Contain
Work through every tenant you are responsible for. Match on application ID, because older installs may still show SkyKick names.
Find the apps by application ID
In the Entra admin centre go to Enterprise applications, All applications, and search for each application ID below. Record the local Object ID and whether it is enabled. Check old and unused tenants too. A dormant connection is still in scope.
| Application | Application (client) ID |
|---|---|
| ConnectWise Cloud Backup | 506e08f9-6e9a-4da4-942b-a099a03644ae |
| ConnectWise Cloud Management | 2399d300-6fca-4e6a-a686-399fefe75b83 |
| Cloud Management, MS Teams | 24205314-2b89-4e07-a2a4-579e898a5640 |
| Cloud Management, Exchange Online | b78f6a77-d4e5-46fb-87e5-d1648bd02519 |
| Cloud Management, MS Graph | 0de14c77-b9b0-4137-9360-34878a929827 |
| Cloud Management, Partner Center | 412dcf96-176d-4b3a-a1b0-4981ad66971e |
| Cloud Management, SharePoint Online | b2b55f5b-7758-4719-8d8f-88ae172e6bdb |
| Other ConnectWise app (no threat activity seen, disable anyway) | c921256f-04a7-44e8-9b2a-69c33929ba19 |
Connect-MgGraph -Scopes Application.Read.All
$ids = '506e08f9-6e9a-4da4-942b-a099a03644ae','2399d300-6fca-4e6a-a686-399fefe75b83','24205314-2b89-4e07-a2a4-579e898a5640','b78f6a77-d4e5-46fb-87e5-d1648bd02519','0de14c77-b9b0-4137-9360-34878a929827','412dcf96-176d-4b3a-a1b0-4981ad66971e','b2b55f5b-7758-4719-8d8f-88ae172e6bdb','c921256f-04a7-44e8-9b2a-69c33929ba19'
foreach ($id in $ids) { Get-MgServicePrincipal -Filter "appId eq '$id'" | Select-Object AppId, Id, DisplayName, AccountEnabled }Disable, do not delete
For each app that is still enabled, open Properties, set Enabled for users to sign-in? to No and save. Record who made the change and when. ConnectWise disabling the apps on its side does not change the setting in your tenant, and tokens already issued may stay valid until they expire. Deleting the app destroys configuration and evidence. Keep the apps disabled until ConnectWise publishes reconnection steps.
Connect-MgGraph -Scopes Application.ReadWrite.All
Update-MgServicePrincipal -ServicePrincipalId <ObjectId> -AccountEnabled:$falseExport the logs now
Export Entra audit logs and all four sign-in log types (interactive, non-interactive, service principal and managed identity), Microsoft Purview audit records and any Microsoft Graph activity logs you already collect. Entra keeps logs for only 7 days on Free tenants and 30 days on P1 or P2, and a licence upgrade does not bring back expired history. Do not let exports delay containment.
Connect-ExchangeOnline
Search-UnifiedAuditLog -StartDate 2026-10-01 -EndDate (Get-Date) -SessionCommand ReturnLargeSet -ResultSize 5000Turn on alerting
Alert on credentials added to any app or service principal, app role assignments, roles added to service principals, especially an app assigning itself Global Administrator, and new consent grants. In Defender XDR, watch for the alert Unusual Microsoft Graph activity associated with Compromised ConnectWise Application. The Sigma rules and KQL below cover these.
Review high-privilege third-party apps
List every third-party app with high-privilege Microsoft Graph, Exchange or directory permissions in each tenant, including other backup, security and management tools. Remove what is not needed and reduce permissions on the rest. One trusted app with broad rights can reach far beyond its original purpose.
Free Checker Scripts
Built and tested by the CybaVerse threat hunt team. Run them against your own tenant or every client tenant you manage to get a clear verdict and a copy of the evidence.
Check-ConnectWiseCloudBackup.ps1
Checks one or many tenants for the seven ConnectWise app IDs (and the extra app ConnectWise flags). For each one it reports the service principal, enabled state, credentials, owners, app role assignments, consent grants and directory roles, with Global Administrator flagged. It also lists any app or service principal that gained credentials since 15 October and service principal sign-ins from the attacker IPs.
pwsh ./Check-ConnectWiseCloudBackup.ps1 -TenantId contoso.onmicrosoft.com,fabrikam.onmicrosoft.comNeeds the Microsoft Graph PowerShell SDK. MSPs sign in once per tenant. Sign-in checks need Entra P1 or P2.
Export-EvidenceLogs.ps1
Exports Entra directory audit logs and the four sign-in log types since 1 October to CSV and JSON. Add -WorkspaceId to include Graph activity logs from Log Analytics if you already collect them. Hash the output and store it read-only.
pwsh ./Export-EvidenceLogs.ps1 -TenantId contoso.onmicrosoft.com -OutDir ./evidencePurview audit is exported separately with Search-UnifiedAuditLog, as shown in Step 3.
Read-only by design
Both scripts use read-only Microsoft Graph scopes (Application.Read.All, Directory.Read.All, AuditLog.Read.All and RoleManagement.Read.Directory) and only call Connect, Disconnect and Get cmdlets. They change nothing in the tenant and write only local report files. Disabling apps and removing credentials stay with you. Review any script before you run it.
Verdicts
- NOT_PRESENTNone of the apps is in the tenant and nothing suspicious was found. Still review logs if retention allows.
- PRESENT_DISABLEDAn app is present and disabled. Keep it disabled and review the logs.
- PRESENT_ENABLEDAn app is present and still enabled. Disable it now, then preserve evidence.
- SUSPICIOUS_CHANGESLocal credentials, a directory role or owner, new app credentials since 15 October, or sign-ins from attacker IPs. Start incident response.
- ERRORThe check could not connect or query, so the result is unknown.
Exit codes
| Code | Meaning |
|---|---|
| 0 | NOT_PRESENT |
| 1 | PRESENT_DISABLED |
| 2 | PRESENT_ENABLED |
| 3 | SUSPICIOUS_CHANGES |
| 4 | ERROR |
MSPs and internal IT teams can use the exit code in RMM or deployment tooling to flag hosts at scale.
Know the limits
- A clean result does not prove a tenant was unaffected. Log retention, licensing and permissions all limit what can be seen.
- Service principal sign-in checks need Entra P1 or P2. Free tenants keep only 7 days of logs, so activity from 15 to 17 October may already be gone.
- Credential start dates do not prove when a credential was added. Correlate with the audit log.
- Purview audit and mailbox rules are not covered by Graph, so run the Exchange Online steps as well.
Reactive: How to Hunt
Treat any sign-in, Graph call or directory change by these apps from unexpected sources as an incident. Disabling the apps stops new sign-ins, but credentials, roles and rules the attacker added stay in place. CybaOps can run these hunts across your estate or your clients'.
Service principal sign-ins
In Sign-in logs, open the Service principal sign-ins tab and filter on each application ID from 15 October, or 1 October where logs allow. Review successful and failed sign-ins separately, and look for sources outside expected Microsoft and Azure ranges, not only the published IPs. Also search all sign-in types for the IOC IPs and user agents.
Directory audit changes
Search audit logs for: credentials added to apps or service principals, new apps, service principals or owners, consent grants and app role assignments, members added to roles, new users and password resets, MFA and authentication method changes, and Conditional Access or named location changes. Search with the ConnectWise apps as both initiator and target, and follow any other identity they changed.
Credentials and roles
Credentials for these apps are held in ConnectWise's own tenant and are not visible to you. Any secret, certificate or federated credential you find on these service principals in your tenant was added locally and needs investigation. Check Roles and administrators for any app holding Global Administrator or another privileged role. Microsoft saw one of the ConnectWise management apps assign itself Global Administrator.
Mailbox and data access
Check Purview audit for bulk mail and file access, new inbox rules (including hidden ones), forwarding, transport rule changes and new Full Access or Send As rights. Normal backup reads before 17 October look like bulk access, so compare against the attacker IPs and timeline.
Get-InboxRule -Mailbox <user> -IncludeHidden | Select-Object Name, Enabled, ForwardTo, RedirectTo, DeleteMessage
Get-Mailbox -ResultSize Unlimited | Where-Object { $_.ForwardingSmtpAddress -or $_.ForwardingAddress }Respond and report
Preserve the evidence first. Then have an authorised responder remove unauthorised credentials, owners, consent grants and role assignments, rotate secrets on any other app the attacker touched, revoke sessions for affected users and reverse unapproved policy changes. Report suspicious activity to SecurityPartnerSupport@ConnectWise.com with tenant and app IDs, UTC times and event IDs, but never passwords, keys or tokens.
Tested detection pack: KQL and Sigma
Hunts from the CybaVerse threat hunt team for Microsoft Sentinel and Defender XDR (queries Q1 to Q11): sign-ins by the seven app IDs, attacker IPs and user agents, the October password spray, directory audit changes, roles added to service principals, Graph activity, mailbox rules and bulk access, plus all 12 Defender alert names Microsoft lists for this campaign. Run them in CybaOps or any SIEM that supports KQL or Sigma.
Test the queries in your environment first. python-requests, Python-urllib and curl are also used by legitimate admins, and normal backup reads before 17 October look like bulk access.
KQL hunting queries (Sentinel and Defender XDR)
Loading queries. If they don't appear, download the full pack below. The .kql file is inside it.Sigma: Sign-in by any of the seven ConnectWise app IDs
title: ConnectWise Cloud Backup Application Identity Sign-in After Containment
id: 6f2d1c3e-8a4b-4f7e-9c21-3b5d7e9a1c02
status: experimental
description: Sign-in by one of the seven ConnectWise Cloud Backup / Cloud Management application IDs that ConnectWise disabled at 07:00 UTC on 17 Oct 2026. Any successful sign-in after that time, or from a non-vendor source, needs investigation.
references:
- https://www.connectwise.com/company/trust/advisories
- https://www.microsoft.com/en-us/security/blog/2026/10/21/storm-0940-uses-artex-agentic-ai-connectwise-supply-chain-compromise/
author: Cybaverse
date: 2026-10-22
tags:
- attack.initial-access
- attack.t1195
- attack.t1078.004
logsource:
product: azure
service: signinlogs
detection:
selection:
AppId:
- '506e08f9-6e9a-4da4-942b-a099a03644ae'
- '2399d300-6fca-4e6a-a686-399fefe75b83'
- '24205314-2b89-4e07-a2a4-579e898a5640'
- 'b78f6a77-d4e5-46fb-87e5-d1648bd02519'
- '0de14c77-b9b0-4137-9360-34878a929827'
- '412dcf96-176d-4b3a-a1b0-4981ad66971e'
- 'b2b55f5b-7758-4719-8d8f-88ae172e6bdb'
condition: selection
falsepositives:
- Legitimate vendor backup activity before 17 Oct 2026 07:00 UTC (kiota-dotnet user agent and Azure private IPv6 sources are associated with expected vendor activity per ConnectWise)
level: mediumSigma: Service principal sign-in from an attacker IP
title: ConnectWise Cloud Backup Storm-0940 IOC IP Sign-in
id: 6f2d1c3e-8a4b-4f7e-9c21-3b5d7e9a1c01
status: experimental
description: Entra ID sign-in (user or service principal) from IP addresses Microsoft and ConnectWise published for the ConnectWise Cloud Backup (formerly SkyKick) application-identity compromise attributed to Storm-0940. The 187.15.x VPN addresses are only meaningful on 15-16 Oct 2026.
references:
- https://www.microsoft.com/en-us/security/blog/2026/10/21/storm-0940-uses-artex-agentic-ai-connectwise-supply-chain-compromise/
- https://www.connectwise.com/company/trust/advisories
author: Cybaverse
date: 2026-10-22
tags:
- attack.initial-access
- attack.t1078.004
- attack.t1195
logsource:
product: azure
service: signinlogs
detection:
selection:
IPAddress:
- '144.172.64.128'
- '144.172.64.99'
- '144.172.64.60'
- '187.15.88.186'
- '187.15.90.217'
- '187.15.89.186'
condition: selection
falsepositives:
- VPN addresses (187.15.x) are shared and transient; outside 15-16 Oct 2026 matches are likely unrelated
level: highSigma: Sign-in with an attacker user agent
title: Storm-0940 ConnectWise Campaign User Agent in Entra Sign-in
id: 6f2d1c3e-8a4b-4f7e-9c21-3b5d7e9a1c03
status: experimental
description: Entra ID sign-in with a user agent Microsoft observed in Storm-0940 sign-ins and Graph activity via ConnectWise apps. Low fidelity on its own; correlate with app ID and IP.
references:
- https://www.microsoft.com/en-us/security/blog/2026/10/21/storm-0940-uses-artex-agentic-ai-connectwise-supply-chain-compromise/
author: Cybaverse
date: 2026-10-22
tags:
- attack.initial-access
- attack.t1078.004
logsource:
product: azure
service: signinlogs
detection:
selection:
UserAgent:
- 'Python-urllib/3.12'
- 'python-requests/2.31.0'
- 'python-requests/2.34.2'
- 'curl/7.88.1'
- 'azure-toolkit/1.0'
condition: selection
falsepositives:
- Legitimate administrator scripts and automation (ConnectWise notes scripting clients are also used by legitimate admins)
level: lowSigma: Credential added to an app or service principal
title: Credential Added to Application or Service Principal
id: 6f2d1c3e-8a4b-4f7e-9c21-3b5d7e9a1c04
status: experimental
description: A secret or certificate was added to an application or service principal. Storm-0940 added credentials to OAuth applications for persistence; these survive disabling the original ConnectWise app. Review all events since 15 Oct 2026.
references:
- https://www.microsoft.com/en-us/security/blog/2026/10/21/storm-0940-uses-artex-agentic-ai-connectwise-supply-chain-compromise/
- https://www.connectwise.com/contentassets/10777cd3364d440c86ed5270a94a5f24/connectwise-cloud-backup-technical-investigation-and-remediation-guide-1.pdf
author: Cybaverse
date: 2026-10-22
tags:
- attack.persistence
- attack.t1098.001
logsource:
product: azure
service: auditlogs
detection:
selection:
OperationName:
- 'Add service principal credentials'
- 'Update application – Certificates and secrets management'
- 'Update application - Certificates and secrets management'
condition: selection
falsepositives:
- Planned secret or certificate rotation
level: mediumSigma: Directory role assigned to a service principal
title: Directory Role or App Role Granted to a Service Principal
id: 6f2d1c3e-8a4b-4f7e-9c21-3b5d7e9a1c05
status: experimental
description: A directory role (e.g. Global Administrator) or app role was assigned to a service principal. Microsoft observed self-assignment of Global Administrator by a ConnectWise management application.
references:
- https://www.microsoft.com/en-us/security/blog/2026/10/21/storm-0940-uses-artex-agentic-ai-connectwise-supply-chain-compromise/
author: Cybaverse
date: 2026-10-22
tags:
- attack.privilege-escalation
- attack.persistence
- attack.t1098.003
logsource:
product: azure
service: auditlogs
detection:
selection_role:
OperationName: 'Add member to role'
TargetResources|contains: 'ServicePrincipal'
selection_approle:
OperationName: 'Add app role assignment to service principal'
condition: 1 of selection_*
falsepositives:
- Onboarding of legitimate automation or vendor apps
level: highSigma: Consent grant, new owner or Conditional Access change
title: Consent, Owner, Conditional Access or Auth Method Change During ConnectWise Investigation Window
id: 6f2d1c3e-8a4b-4f7e-9c21-3b5d7e9a1c06
status: experimental
description: Audit events ConnectWise and Microsoft list as possible persistence or weakened controls (consent grants, new owners, Conditional Access / named location changes, authentication method changes). Review those since 13-15 Oct 2026 against change records.
references:
- https://www.connectwise.com/contentassets/10777cd3364d440c86ed5270a94a5f24/connectwise-cloud-backup-technical-investigation-and-remediation-guide-1.pdf
- https://www.microsoft.com/en-us/security/blog/2026/10/21/storm-0940-uses-artex-agentic-ai-connectwise-supply-chain-compromise/
author: Cybaverse
date: 2026-10-22
tags:
- attack.persistence
- attack.t1098
logsource:
product: azure
service: auditlogs
detection:
selection:
OperationName:
- 'Consent to application'
- 'Add delegated permission grant'
- 'Add owner to application'
- 'Add owner to service principal'
- 'Add conditional access policy'
- 'Update conditional access policy'
- 'Delete conditional access policy'
- 'Add named location'
- 'Update named location'
- 'Delete named location'
- 'User registered security info'
- 'Admin registered security info'
- 'Admin updated security info'
condition: selection
falsepositives:
- Routine administration; validate against change tickets
level: mediumIndicators of compromise
From Microsoft's report and ConnectWise's advisories. An IP or user agent match needs investigation in context. It does not prove compromise on its own, and a clean search does not rule it out.
# Defanged. Re-fang only inside your security tooling. Times are UTC.
# Attacker IPs (sign-ins and Microsoft Graph activity through the ConnectWise apps)
144.172.64[.]128
144.172.64[.]99 (also the 10 to 14 Oct password spray against Microsoft 365)
144.172.64[.]60
# VPN IPs: shared and transient. Only relevant on 15 to 16 Oct, together with the ConnectWise app IDs
187.15.88[.]186
187.15.90[.]217
187.15.89[.]186
# User agents (legitimate admin scripts use some of these too, so correlate)
Python-urllib/3.12
python-requests/2.31.0
python-requests/2.34.2
curl/7.88.1
azure-toolkit/1.0
# Application (client) IDs: match on the ID, not the display name
506e08f9-6e9a-4da4-942b-a099a03644ae ConnectWise Cloud Backup
2399d300-6fca-4e6a-a686-399fefe75b83 ConnectWise Cloud Management
24205314-2b89-4e07-a2a4-579e898a5640 Cloud Management, MS Teams
b78f6a77-d4e5-46fb-87e5-d1648bd02519 Cloud Management, Exchange Online
0de14c77-b9b0-4137-9360-34878a929827 Cloud Management, MS Graph
412dcf96-176d-4b3a-a1b0-4981ad66971e Cloud Management, Partner Center
b2b55f5b-7758-4719-8d8f-88ae172e6bdb Cloud Management, SharePoint Online
c921256f-04a7-44e8-9b2a-69c33929ba19 Other ConnectWise app (no threat activity seen; disable as a precaution)
# Microsoft Defender XDR alert to watch for first
Unusual Microsoft Graph activity associated with Compromised ConnectWise ApplicationConnectWise Cloud Backup FAQ
Short answers based on Microsoft's report and ConnectWise's advisories as of 22 October 2026.
What happened to ConnectWise Cloud Backup?
Attackers stole secrets for the multi-tenant Microsoft 365 apps used by ConnectWise Cloud Backup, formerly SkyKick, and its Cloud Management service. They used them to sign in to customer tenants as those trusted apps, with no user sign-in needed. In some tenants they went on to Microsoft Graph reconnaissance, application credential changes and privilege changes.
Who is behind it?
On 21 October 2026 Microsoft attributed the attack to Storm-0940, a China-aligned group that used an agentic AI framework to automate it. Microsoft saw sign-in attempts against more than 2,250 tenants.
Is there a CVE or a patch?
No. This is a supply chain compromise of app credentials, not a software flaw, so there is no CVE and nothing to install. The response is to disable the apps, preserve logs and hunt each tenant.
Am I affected?
Any Microsoft 365 tenant where one of the seven ConnectWise apps was ever authorised is in scope, including dormant SkyKick connections. Search Enterprise applications by application ID. Having the app, or even a sign-in, does not prove data was taken, so review the logs.
ConnectWise disabled the apps. Is that enough?
No. ConnectWise disabled the apps on 17 October, but that does not change the setting in your tenant, and it does not remove credentials, roles, consent grants or mail rules the attacker added. Disable the apps locally, keep the evidence, then remove attacker access and rotate secrets.
Should I delete the ConnectWise apps?
Not as a first step. Disable them instead. Deleting removes configuration, grants and credentials that are evidence. Keep them disabled until ConnectWise publishes reconnection steps.
Are my backups safe?
ConnectWise says existing backups remain encrypted and isolated with no sign of compromise. Backup and restore are unavailable until service is restored, so check your last good recovery point and plan for the gap.
What should MSPs do first?
Check your own tenant and every client tenant by application ID, disable the apps, export logs before the 7 day or 30 day retention runs out, then run the hunts. Prioritise tenants with privileged access or sensitive mail.
Detect and Remediate the ConnectWise Compromise Across Your Estate
CybaOps monitors identity and Microsoft 365 activity across every tenant you look after, whether that's your own business or your clients'. Our SOC runs these threat hunts, alerts on new app credentials, role assignments and risky consent, and drives remediation through to a verified fix, so proactive checks and reactive response happen in one place.