cd /news/ai-agents/jadepuffer-storm-3168-wiped-azure-in… · home › topics › ai-agents › article
[ARTICLE · art-141292] src=byteiota.com ↗ pub= topic=ai-agents verified=true sentiment=↓ negative

JadePuffer Storm-3168 Wiped Azure in 7 Min — Audit Now

Microsoft's post-incident analysis of the JadePuffer Storm-3168 campaign found that attackers wiped an Azure tenant in seven minutes after scraping a service principal secret an employee had posted in a public GitHub issue and then edited out, because GitHub's edit history preserved the original content. Microsoft stated that "Removing or redacting an exposed secret does not invalidate it," noting the attackers used two compromised service principals to spend 15.5 hours mapping the tenant — including 300-plus enumeration operations — before five parallel deletion tokens removed Azure Site Recovery and Azure Backup locks, storage accounts, Key Vaults, Function Apps, and App Service Plans; Azure SQL databases survived only because the attacker used an outdated API version. Microsoft recommends replacing static service principal client secrets with Managed Identity, which rotates credentials automatically and injects them at runtime, or Workload Identity for workloads outside Azure.

read4 min views1 publishedSep 28, 2026
JadePuffer Storm-3168 Wiped Azure in 7 Min — Audit Now
Image: Byteiota (auto-discovered)

JadePuffer’s Storm-3168 campaign wiped an Azure tenant in seven minutes. The entry point was a service principal secret an employee had posted in a public GitHub issue — then edited out. The edit did nothing. GitHub’s edit history preserved the original content. Microsoft’s post-incident finding is worth quoting directly: “Removing or redacting an exposed secret does not invalidate it.” If you have ever put Azure service principal credentials in a public GitHub issue, PR comment, or wiki page and then deleted them, rotate those credentials today.

What GitHub Edit History Means for Your Credentials #

Most developers know not to commit secrets to a repo. Far fewer know that editing or deleting GitHub issue content leaves the original visible in the edit history — accessible to anyone with a browser. Storm-3168 exploited exactly this gap. The victim posted a client ID, client secret, and tenant ID in a public issue, caught the mistake, and edited the issue to remove them. By the time the edit happened, the credentials had already been scraped.

This applies beyond issues. PR review comments, release notes, wiki pages, and discussion posts all maintain edit history in GitHub. Any secret that appeared in any of these contexts — at any point — should be treated as compromised, regardless of whether it was subsequently removed.

How the Attack Unfolded #

The attacker was patient. Using two compromised service principals, Storm-3168 spent 15.5 hours mapping the tenant before destroying it. The first principal executed 300-plus enumeration operations across subscriptions, VMs, resource groups, storage accounts, and Key Vaults. The second ran rapid VM and resource group discovery. App Service configurations were enumerated. Then, 70 seconds after that final reconnaissance pass, the destructive phase began.

The seven-minute window was not luck. It was the product of 15 hours of preparation. Five parallel deletion tokens executed simultaneous operations across resource types. The first targets were Azure Site Recovery locks and Azure Backup protection locks — removed deliberately, before anything else. Without recovery infrastructure, restoration becomes impossible even when backups physically exist. Storage accounts followed. Key Vaults. Function Apps. App Service Plans. Azure SQL databases survived only because the attacker used an outdated API version that couldn’t issue the delete call — an inadvertent save, not a design choice.

Why Service Principal Secrets Are the Wrong Tool #

For Azure-hosted workloads — App Service, Function Apps, VMs, AKS — service principal client secrets are unnecessary. They exist because developers reach for a familiar pattern: generate a credential, store it somewhere, use it to authenticate. The problem is that “store it somewhere” is exactly where it leaks. Environment variables get logged. Config files get committed. GitHub issues get written. And once a static secret is out, it stays out until explicitly rotated.

Managed Identity eliminates this entirely. Azure manages the credential, rotates it automatically, and injects it into the runtime environment. There is nothing to store, nothing to commit, and nothing to leak. For the Azure Python SDK, the migration is often a single line:

credential = ClientSecretCredential(tenant_id, client_id, client_secret)

credential = DefaultAzureCredential()

If your workload runs outside Azure — on-premises, in another cloud — Managed Identity is not an option. Use Workload Identity Federation instead: an external identity provider issues short-lived tokens tied to a specific workload, with no static secret to harvest or rotate.

Protecting Recovery Infrastructure #

The lesson that gets less attention than credential hygiene: Storm-3168 targeted recovery locks first. Site Recovery and Backup protection locks were the first resources deleted. An attacker that wipes your storage and leaves your recovery infrastructure intact has left you a chance. An attacker that removes your recovery locks first has not.

Place recovery infrastructure in a separate resource group with tighter RBAC. Apply CanNotDelete resource locks on backup vaults and recovery vaults independently. Enable Microsoft Defender for Resource Manager to alert on lock removal operations — that is the attack’s first detectable action and your earliest opportunity to respond.

Three Actions to Take Today #

Scan historical repository content. Run truffleHog or gitleaks across your repositories — including commit history and GitHub issues, not just the current HEAD. Any public repository that has ever touched Azure configuration is in scope.

Rotate anything that was ever exposed. If a service principal secret appeared in any public GitHub content at any point — even briefly, even after an edit — treat it as compromised and rotate it now. Do not check whether attackers actually saw it. Assume they did. This is the core lesson from JadePuffer’s original Langflow campaign and from Storm-3168: static secrets with a public history have no grace period.

Enable Defender workload protections. This attack ran for 15 hours before detection. Defender for Storage, Resource Manager, Key Vault, and Databases each provide behavioral coverage for what Storm-3168 did. Bulk ARM deletes combined with lock removal is the attack’s signature — and Defender for Resource Manager can alert on it in real time.

── more in #ai-agents 4 stories · sorted by recency
── more on @microsoft 3 stories trending now
sponsored brought to you by zahid.host 4,200+ EU-deployed projects
reading about agents? ship yours in a single git push.

Run your AI side-project on zahid.host

EU-based hosting, git-push deploys, automatic HTTPS, no cold starts. Free tier with a custom domain — perfect for shipping the agent you just read about.

$git push zahid main
→ Live at https://your-agent.zahid.host ✓
Get free account → Pricing
from €0/mo · no card required
LIVE [news/jadepuffer-storm-316…] indexed:0 read:4min 2026-09-28 · —