Build1 publisher2 min readPublished Updated
One password reset let Storm-3068 run an Azure DevOps pipeline that pulled kubeconfig files
Microsoft's Defender Experts say Storm-3068 reset one user's password and ran an Azure DevOps pipeline authorized to reach more than 50 resources. It pulled the kubeconfig files that authenticate to a Kubernetes cluster.
The Engineer · Build desk

What happened
- After completing the reset and signing in, the actor registered its own device and enrolled it in Microsoft Intune, giving the takeover a managed endpoint inside the tenant.
- It then added its own multi-factor method and removed the legitimate user's, taking persistent control of the account.
- Investigators reconstructed the intrusion from Azure DevOps audit data and Git history.
Compiled by The EngineerSomething wrong?How this is made
Why it matters
- exposure A build identity that can run or edit one pipeline inherits everything its service connection is authorized to reach, so the connection's scope, not the reset, decides how far a stolen account goes.
- constraint A stolen kubeconfig is a credential, not cluster-admin: the token still needs a reachable API server, acceptance by that server, and per-operation authorization, so authorized reach overstates what an attacker can do.
- decision The recommended fix moves the control to the identity layer: restrict or prohibit self-service password reset for privileged accounts.
A pipeline in Azure DevOps runs under a service connection that holds the credentials its build steps use to reach cloud resources, so whoever can execute or modify that pipeline inherits the permissions it was given [17]. The connection Storm-3068 used was authorized to more than 50 targets [4]. Microsoft's Defender Experts, who published the account on 29 September 2026, are careful with that number: it counts authorized targets, not resources actually compromised [16][7]. They also note the 50-plus was what they saw at this victim, not a condition the attack required [8].
What the credentials allow and what the jobs did are separate questions. Storm-3068 ran jobs named DUMP_CLUSTER_<NAME>, pulled kubeconfig files, and committed seven of them into a kubeconfigs directory in an existing repository [5][6]. A kubeconfig carries a ServiceAccount token that authenticates to the Kubernetes API [9]. To act on that token, the connecting system needs the API server reachable, a token the server still accepts, and authorization for each requested operation [9]. The report says holding a ServiceAccount token does not by itself grant cluster-wide administrative privileges [10]. The next move fits that limit: the actor ran the Atera agent and Chisel from the pipeline to relay API traffic through an external tunnel, though how much the tunnel carried has not been disclosed [11].
The way in was ordinary. With a valid session from the reset, the actor enumerated the tenant the way an administrator would, walking repositories, projects, pipelines, deployment environments and connected resources through legitimate features and scripts [3]. The report does not say what verification information the reset flow accepted [14].
Detection is uneven. The account owner might catch the reset, the missing MFA method or the new device, but pipeline activity is quiet to someone who never opens Azure DevOps [15].
What to watch
- Whether Microsoft discloses which Kubernetes API operations the seven stolen kubeconfig tokens actually authorized, beyond what they could reach.
- Whether the extent of Chisel's persistent tunnel connections, currently undisclosed, is published.
- Whether Azure DevOps gains scope limits or approval gates for service connections trusted with many resources.