Get the Zoom link
Cloud Security Office Hours Banner

Storm-3168 / JADEPUFFER Azure Destruction 2026

Step-by-step kill chain mapped to MITRE ATT&CK Cloud, sourced from official post-mortems and primary technical analyses.

June 2026 Critical Azure

Storm-3168 / JADEPUFFER - Two Compromised Service Principals → 15 Hours of Reads → 100+ Storage Deletions in Seven Minutes → Recovery Locks Attacked → Storage Keys Collected

Microsoft published this account on September 25, 2026, describing activity from early June. It associates the activity with JADEPUFFER, the actor Sysdig reported in July, and tracks it as Storm-3168. Two compromised service principals in one Azure tenant did the work. One spent about 15 and a half hours on reconnaissance. The other ran discovery, then a destructive burst of about seven minutes covering more than 100 storage account deletion attempts plus a Key Vault, a Function App and an App Service plan, along with attempts to strip recovery locks. It then collected storage keys. The operations followed the identities' existing Azure role assignments. Two caveats belong next to the headline. Microsoft could not confirm how the principals were compromised: a service principal's client secret had been posted in a public GitHub issue, and Microsoft could not confirm that secret was used. And while Sysdig reports JADEPUFFER as the first documented agentic ransomware operation and Microsoft's title says agentic-driven, the evidence Microsoft publishes for this activity (timing, division of work, overlapping token streams) strongly indicates automated or scripted execution and does not directly show an AI agent at work. Microsoft did not observe a ransom note or confirm exfiltration.

~15.5 hours of reconnaissance by the first service principal
~7 minutes for 100+ storage deletion attempts and other deletions
30+ successful ListKeys calls after the destruction ended
Threat actor: Storm-3168, associated with JADEPUFFER, per Microsoft
📄 Microsoft - Storm-3168: agentic-driven cloud attacks using compromised service principals ↗ 📄 Sysdig - JADEPUFFER ↗ 📄 BleepingComputer - JADEPUFFER background ↗
⚡ Possible Initial Access: A Secret in a Public Issue
01
A service principal's client ID, secret and tenant ID had been posted in a public GitHub issue
T1552.001 - Credentials in Files

An employee of the affected organization had posted a service principal's client ID, client secret and tenant ID in plaintext in a public GitHub issue. The secret was later removed from the issue, and it stayed in the public edit history.

Microsoft is careful here. It could not confirm that this secret was used, it does not say which of the two principals the secret belonged to, and it says it is unclear how the service principal was first compromised. Storm-3168 infrastructure also probed Azure App Services belonging to other customers, and Microsoft found no App Service to Azure Resource Manager credential path for this tenant.

Posted: client ID, client secret, tenant ID, in a public GitHub issue
Removed: from the issue, and still in the edit history
Confirmed as the source: no; Microsoft could not confirm it
Service PrincipalGitHub IssueExposed SecretT1552.001
🔍 Discovery: Fifteen Hours of Reads
02
One service principal spent about 15 and a half hours enumerating the tenant
T1580 - Cloud Infrastructure Discovery

The first service principal made more than 300 successful read operations over about 15 hours and 30 minutes, listing VMs, subscriptions, resource groups and resources. Both principals shared Storm-3168 infrastructure, a network fingerprint and the user agent python-requests/2.34.2.

About 90 minutes after the first principal started, the second enumerated VMs and resource groups across two subscriptions in five seconds. Microsoft cites timing like this, the division of work between principals, and overlapping token streams as strong indications of automated or scripted execution.

First principal: 300+ reads over about 15 hours 30 minutes
Second principal: two subscriptions enumerated in five seconds
Shared traits: same infrastructure and user agent, python-requests/2.34.2
Azure Resource ManagerEnumerationpython-requestsT1580
🔑 Credential Access: Looking for Stored Secrets
03
About 16 hours later the second principal listed App Service configuration stores
T1552 - Unsecured Credentials

About 16 hours after that discovery, the second principal listed App Service configuration stores, which Microsoft says was possibly a search for exposed credentials. An OpenSearch lookup failed. Seventy seconds later it attempted ListKey on a storage account that did not exist, and that failure came less than a second before the destruction began.

Listed: App Service configuration stores
Failed: an OpenSearch lookup, and ListKey on a non-existent account
Next: destruction, less than a second later
App ServiceConfiguration StoresT1552
💥 Impact: Seven Minutes
04
More than 100 storage deletion attempts ran in about seven minutes, along with a Key Vault, a Function App and an App Service plan
T1485 - Data Destruction

The burst lasted about seven minutes and included more than 100 storage account deletion attempts, most of which succeeded, plus the deletion of one Key Vault, one Function App and one App Service plan in the same resource group. Multiple parallel SQL database deletion attempts all failed because the requests used an unsupported API version.

The principal held ordinary roles: group-granted Storage Account Contributor, direct Contributor, and direct SQL DB Contributor. It used five unique tokens, four for deletion and one for inventory and key retrieval, and two of the deletion tokens were active in the same 70-second window. Resource locks and deletion protection blocked deletion attempts for a few of the storage accounts, which makes them the controls that visibly worked in this incident.

Storage: 100+ deletion attempts, most succeeded
Also deleted: 1 Key Vault, 1 Function App, 1 App Service plan
Failed: SQL deletions, unsupported API version
Blocked by: resource locks and deletion protection, for a few storage accounts
Roles: Storage Account Contributor, Contributor, SQL DB Contributor
Storage DeletionKey VaultResource LocksT1485
💥 Impact: Recovery Under Attack
05
The principal tried to remove Site Recovery and Azure Backup locks, and failed
T1490 - Inhibit System Recovery

The destruction targeted backup and recovery resources, which could impair recovery. Attempts to remove Azure Site Recovery locks and an Azure Backup protection lock were unsuccessful. In all, the second principal attempted more than 150 destructive or credential-collection operations in a 35-minute window.

Microsoft assesses this as consistent with tactics that can support ransomware and extortion, and it stops there: it did not observe a ransom note or confirm successful data exfiltration. Sysdig's earlier JADEPUFFER report describes something more complete in a different environment, a ransom table and encrypted Nacos configuration on a database server, after initial access through CVE-2025-3248 in Langflow.

Attempted: removal of Site Recovery locks and an Azure Backup protection lock
Result: unsuccessful
Window: 150+ destructive or credential operations in 35 minutes
Not observed: a ransom note, or confirmed exfiltration
Azure BackupSite RecoveryT1490
🔑 Credential Access: Collecting Keys After the Damage
06
About 30 minutes after the destruction ended, the principal collected storage keys with 30+ ListKeys calls
T1552 - Unsecured Credentials

The final phase reversed the usual order. About 30 minutes after the last destruction, the second principal listed storage accounts and made more than 30 successful ListKeys requests, returning access keys for storage accounts including Site Recovery related ones. A similarly named account in the same resource group had been spared from deletion and was then targeted for key retrieval.

Those keys work independently of the service principal, so disabling it does not revoke them. Microsoft notes that the collection could enable future data access. It reports no Key Vault secret retrieval: the vault was deleted.

Timing: about 30 minutes after the final destruction
Calls: 30+ successful ListKeys requests
Why it matters: storage keys outlive the service principal
Key Vault: deleted, with no secret retrieval reported
ListKeysStorage KeysT1552

🛡 How to Defend Against This Chain

Treat any publicly posted credential as compromised. Removing a secret from an issue leaves it in the edit history and does nothing to invalidate it. Rotate first. Scan issues and pull request comments as well as code, since this one sat in an issue. Microsoft's advice is explicit that removal does not invalidate a credential.
Replace client secrets with workload identity. A client secret works from anywhere. Managed identities and federated credentials remove the long-lived secret altogether, and they are the durable answer to this initial access path.
Keep Contributor away from automation that does not need it. Three ordinary role assignments were enough for this entire chain. Restrict each service principal to what its workload requires, at the narrowest scope, and review group-granted roles, which are easy to miss in a per-identity review.
Use resource locks and independent recovery. Locks and deletion protection blocked a few of the deletions, and the attempts on recovery locks failed. Put CanNotDelete locks on storage accounts, and keep backups in a service such as Azure Backup under an identity that production service principals cannot touch. Blob soft delete does not protect against deletion of the whole account.
Disable shared key access on storage accounts. ListKeys gave this actor credentials that survive the service principal. Where workloads allow it, disable shared key authorization and use Entra ID, and alert on ListKeys calls in bulk. If keys were listed in an incident, rotate them.
Alert on the shift from reading to deleting. Microsoft recommends the Defender for Cloud plans for Resource Manager, Storage, Key Vault, App Service and Databases. The behavior itself is simple to detect: a service principal with no history of deletion, deleting in bulk, seconds after a burst of reads. Pre-authorize someone to disable an identity without a meeting, because seven minutes leaves no time to convene one.

Related defense topics