Blog/Security
Security

Storm-0940 and ARTEX: Agentic OAuth Abuse in the ConnectWise Compromise

In October 2026, Microsoft attributed the ConnectWise cloud application compromise to Storm-0940 and named ARTEX, an open-source multi-agent framework, as the automation behind it. More than 2,250 tenants were targeted. The loud password spray failed. The quiet path worked: stolen ConnectWise app credentials gave app-only access to every tenant that had consented to the apps — no user, no sign-in, no MFA. We walk the chain and map where identity controls interrupt it.

Storm-0940 is a Chinese threat actor active since at least 2021. Its earlier operations combined password spraying, compromised credentials, and attacks against internet-facing systems. In October 2026, Microsoft attributed the ConnectWise cloud application compromise to the group and identified ARTEX as an automation framework used in its attacks.

Three reports show ARTEX adoption during September–October 2026. They describe separate campaigns, not three confirmed Storm-0940 operations.

CampaignPeriodPublic finding
South Korean financial sectorLate September–early OctoberThreatLabz reported theft of approximately 67,000 individuals’ records.
Japanese companiesReported October 19GMO identified attack infrastructure targeting approximately 20 companies.
ConnectWise customer tenantsOctoberMicrosoft attributed application OAuth abuse and targeting of more than 2,250 tenants to Storm-0940.

What ARTEX is, and how it works

ARTEX is an open-source, multi-agent penetration-testing framework: a Go backend with a Next.js console. It is not a model – it is the harness that drives one. It is model-agnostic (observed running on Claude, GPT, DeepSeek, GLM and Grok). The public repo went private on 8 October 2026, but forks still circulate.

The design is a planner/worker loop over a shared graph. The human sets a target; the agents chain the rest together on their own.

The framework maintains two linked graphs:

  • Asset graph: domains, IP addresses, services, applications, and endpoints.
  • Exploration graph: goals, proposed actions, observations, and findings, linked to the assets they concern.

A planner reads this state and creates work items. Concurrent workers claim items, run tools, and record results. New observations trigger another planning round. HTTP traffic recording provides evidence for findings.

How ARTEX operates: the operator sets a target, a planner agent splits it into tasks, worker agents run tools and exploits, and results land in an asset and vulnerability graph that picks the next action and feeds back to the planner, with a reporting agent reading from the graph. Model backends include Claude, GPT, DeepSeek, GLM and Grok

How ARTEX operates: a multi-agent loop where the model, not the human, selects each action after every scan.

ARTEX supplies orchestration; access still depends on exploitable software, usable credentials, and granted permissions.

The ConnectWise compromise: OAuth abuse at machine speed

Microsoft attributes the ConnectWise compromise to Storm-0940 and dates the Microsoft 365 activity from September 2026.

Phase 1 — the loud failure (no foothold)

From 10–14 October, ARTEX-driven infrastructure at 144.172.64.99 sprayed 327 accounts across eight organizations: 151,000+ failed logons, peaking at 2,900 per minute, with account lockouts making up roughly 98% of the activity. Microsoft observed no successful sign-in, no token issuance, and no Graph call.

Phase 2 — the quiet success (initial access)

Initial access did not come from a guessed password.

Storm-0940 used compromised ConnectWise application credentials (the client secrets/certificates) of ConnectWise’s multi-tenant OAuth apps (Cloud Backup and related Teams/Graph apps) to authenticate to customer tenants through permissions already granted to those applications. The original exact credential-exposure mechanism remains unknown.

A multi-tenant app is registered once at the vendor. When a customer installs it, Entra provisions a service principal inside the customer tenant carrying the app’s admin-consented Graph permissions. That app normally authenticates per-tenant via the OAuth2 client-credentials flow: present app ID + secret to the token endpoint, receive an app-only access token — no user, no interactive sign-in, no MFA. With the stolen secrets, ARTEX requested those tokens against every tenant that had the app installed, riding consent the customers had already granted.

Storm-0940 and ARTEX attack paths. The failed path: a password spray from 144.172.64.99 on October 10–14 produced 0 successful sign-ins, with 151k+ failures and 98% lockouts. The initial access path: compromise ConnectWise and steal app client secrets, authenticate app-only through the client-credentials flow with no MFA, and reach 2,250+ M365 tenants by riding standing admin consent. Then, inside each tenant: recon via MS Graph, self-assigned Global Admin, persistence by adding its own secrets, and bulk Key Vault secret reads

ARTEX reached privileged cloud access in under three hours in multiple cases. Inside each tenant, the agents used Graph for reconnaissance, added their own credentials to applications for persistence that survives rotation of the original ConnectWise secret, had one ConnectWise management app self-assign Global Administrator, modified users, groups and privileged roles, and in Azure performed bulk Key Vault secret reads.

Incident timeline

Date/timeObservation
SeptemberStorm-0940 adopts ARTEX; M365 targeting begins across aerospace, defense, finance, government and tech.
October 10–14Cross-tenant password spray from 144.172.64.99. 151k+ failed logons, 98% lockouts, zero successful sign-ins.
October 15Downstream M365 access via ConnectWise apps surfaces publicly — same 144.172.64.x range.
October 16ConnectWise advisory: unauthorized access associated with Cloud Backup.
October 21Microsoft attributes the campaign to Storm-0940 and names ARTEX.

Affected applications and indicators

ArtifactValueType
ConnectWise Cloud Backup506e08f9-6e9a-4da4-942b-a099a03644aeOAuth app ID
ConnectWise – MS Teams24205314-2b89-4e07-a2a4-579e898a5640OAuth app ID
ConnectWise – MS Graph0de14c77-b9b0-4137-9360-34878a929827OAuth app ID
Operator infrastructure144.172.64.99 / .60 / .128IP
Automation user agentspython-urllib/3.12, python-requests/2.31.0, curl/7.88.1, azure-toolkit/1.0User-Agent

ATT&CK mapping

StageTechniqueObservable
ReconnaissanceT1595ARTEX scans cloud resources
Initial AccessT1195 · T1078.004 · T1199App-only auth via trusted multi-tenant app
Credential AccessT1528 · T1555.006Stolen app secrets; bulk Key Vault reads
Privilege EscalationT1098.003App self-assigns Global Administrator
PersistenceT1098.001New secret added to service principal
DiscoveryT1087.004 · T1580Directory + cloud enumeration via Graph

The numbers

FigureSourceAttempts vs. successes
2,250+ tenantsMicrosoftSign-in attempts
~1,000 Entra accountsHuntressShowed suspicious activity
300+ organizationsHuntressSuccessful intrusions

Where SlashID fits

The failed spray and the successful path point at the same conclusion: this was an identity attack. No malware, no exploit – a trusted non-human identity, a vendor’s OAuth app, holding standing admin-consented access, abused at machine speed. That is the layer SlashID operates on.

Attack stepSlashID controlSignal / action
Over-permissioned, pre-consented vendor appAccess Graph / AI Identity GovernanceDiscovers the OAuth grant, maps scopes → reachable resources → authorizing human; flags the toxic standing grant
App-only auth from attacker infraITDR behavioral detectionService-principal sign-in from unusual ISP/IP
App self-assigns Global AdminCross-identity detectionPrivileged role assigned to a service principal → high-severity alert
Attacker adds app credentialsNHI posture + detectionNew secret/cert on a service principal → surfaces the persistence backdoor
Bulk Key Vault reads · lateral movementGraph-correlated anomaly detectionAnomalous NHI behavior
ContainmentAutomated remediationRevoke tokens/sessions, rotate creds, remove grants/owners/roles, enforce MFA

ARTEX made the attack faster, but the path into customer tenants was already there: trusted ConnectWise applications with existing permissions. Once the attacker had the vendor credentials, it could request access across thousands of tenants without a user signing in.

Discover it, baseline it, and be able to revoke it in minutes — before the agent reaches the 2,250th tenant.

Do you know which OAuth-connected apps hold admin consent in your tenant?

Storm-0940 never needed a user to sign in. It took a stolen third-party app secret and rode permissions customers had granted long ago. SlashID maps every OAuth grant to what it can reach, flags service principals that sign in from new infrastructure or assign themselves Global Admin, and can revoke the access before a trusted app becomes a persistent admin foothold for attackers.

References

[1] Microsoft Security Blog, October 21, 2026. https://www.microsoft.com/en-us/security/blog/2026/10/21/storm-0940-uses-artex-agentic-ai-connectwise-supply-chain-compromise/

[2] Huntress Blog. https://www.huntress.com/blog/vendor-credential-enables-unauthorized-access

Get started →

Stop identity attacks / before they breach.

See how SlashID detects, investigates and remediates identity threats end-to-end — across humans, machines and AI agents.