Cloud Security Office Hours Banner

Midnight Blizzard / Microsoft 2024

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

November 2023 - March 2024 Critical Microsoft 365 / Entra

Midnight Blizzard / Microsoft - Password Spray on a Forgotten Test Tenant → A Legacy OAuth App With Production Rights → Executive Email → Secrets in That Email → Source Code

From late November 2023, the Russian state actor Midnight Blizzard (APT29 / NOBELIUM) ran a password spray against a legacy, non-production test tenant belonging to Microsoft. One account there had a guessable password and no multi-factor authentication. That account had access to a legacy OAuth application which, for historical reasons, held elevated permissions into Microsoft's corporate environment - and from there the actor read the email of senior leadership, cybersecurity and legal staff. Microsoft detected it on January 12, 2024 and disclosed a week later. The March update is the part that matters most: Microsoft found the actor was using secrets that customers and Microsoft had exchanged in those emails to reach further, including some source code repositories and internal systems, and that password spray attempts had risen as much as tenfold in February. The initial access was an account nobody owned, in an environment nobody considered production.

A test tenant with no MFA was the way in
~7 weeks from first access to detection
Email became the next credential store - secrets in it were reused
10x increase in password spray attempts in February
📄 MSRC - Microsoft actions following attack by Midnight Blizzard ↗ 📄 Microsoft Security - Guidance for responders ↗
Initial Access - Password Spray Against Something Nobody Owned
01
A legacy, non-production test tenant contained an account with a weak password and no MFA; the actor found it with a low-and-slow password spray from residential proxies
T1110.003 - Password Spraying T1090.002 - External Proxy

Password spraying tries a small number of common passwords against many accounts, staying under lockout thresholds and per-account rate limits. Run from a residential proxy network, it also defeats naive IP-based detection because each attempt appears to come from a different ordinary address. What made it succeed was not the technique but the target: a test tenant, created for some purpose long since served, outside whatever MFA enforcement and password policy governed Microsoft's real estate. Nobody was reviewing it because it was not production, and it did not appear in the inventories that drive security baselines - which is precisely why it still existed.

Technique: Password spray - few passwords, many accounts, under lockout thresholds
Infrastructure: Residential proxy network, so attempts look like ordinary users
Target: A legacy non-production test tenant
The account: Weak, guessable password; no MFA
Why it survived: Not production, so not in the inventory that drives baselines
Password SprayTest TenantNo MFAT1110.003
🔓 Privilege Escalation - A Legacy OAuth App Holding Production Rights
02
The compromised test account could reach a legacy OAuth application that had been granted elevated permissions into Microsoft's corporate environment
T1550.001 - Application Access Token T1098.002 - Additional Email Delegate Permissions

This is the hinge, and it is the reason a test-environment compromise became a corporate one. An OAuth application registered long ago held permissions into the production corporate environment - a configuration that presumably made sense when it was created and had simply never been revisited. The actor used that application to grant itself access, creating additional malicious OAuth applications along the way and using them to reach Office 365 Exchange Online mailboxes. The general shape recurs across this site: Vercel / Context.ai, Salesloft Drift and UNC6040 all turn on an OAuth grant outliving the reason it was made. A non-production identity should not be able to reach a production application, and an old application should not still hold rights nobody would grant today.

The bridge: A legacy OAuth application with elevated corporate-environment permissions
Actor actions: Used it to grant further access; created additional malicious OAuth apps
Reached: Office 365 Exchange Online mailboxes
Two failures: Non-prod identity reaching prod, and an old grant nobody revisited
Recurring shape: Vercel / Context.ai, Salesloft Drift, UNC6040
Legacy OAuth AppStanding GrantNon-Prod to ProdT1550.001
📧 Collection - Executive, Security and Legal Mailboxes
03
The actor read and exfiltrated email from senior leadership and from the cybersecurity and legal functions - and specifically searched for what Microsoft knew about it
T1114.002 - Remote Email Collection

The mailbox selection is intelligence work rather than opportunism. Senior leadership for strategy, legal for what is contested and disclosed, and cybersecurity for what the defender knows - Microsoft stated the actor was targeting email accounts for information related to Midnight Blizzard itself. An actor reading the security team's mail during an active intrusion has an advantage that is difficult to overstate: they can see the investigation forming. It is the strongest possible argument for keeping incident response communications on an out-of-band channel that does not depend on the environment being investigated.

Targeted: Senior leadership, cybersecurity and legal mailboxes
Specific interest: Information about Midnight Blizzard itself
Advantage gained: Visibility of the defender's own investigation as it formed
Countermeasure: Out-of-band IR communications, independent of the environment under investigation
Detected: January 12, 2024; disclosed January 19
Executive EmailCounter-InvestigationAPT29T1114.002
🔑 Credential Access - The Email Was Full of Secrets
04
Microsoft's March update disclosed that the actor was using secrets found in the exfiltrated email - some shared between Microsoft and its customers - to reach source code repositories and internal systems
T1552.001 - Credentials In Files

The revision is the most valuable part of this chain, and it deserves credit for being published. Mailbox access was not the end state - it was a credential store. People send secrets in email: connection strings while debugging, API keys to a partner, a password "just this once" in a thread that never gets deleted. Microsoft found the actor mining exfiltrated mail for exactly that and using what it found to reach some source code repositories and internal systems, and proactively contacted customers whose secrets appeared. Microsoft also reported password spray attempts running as much as tenfold higher in February than in the already-large January volume. Read together: assume every mailbox in your organization contains credentials, because it does.

March 2024 revision: Secrets from exfiltrated email used to access source code repositories and internal systems
Customer impact: Secrets shared between customers and Microsoft were found; those customers were contacted
Escalation: Password spray attempts up as much as 10x in February vs January
Microsoft's position: No evidence customer-facing systems were compromised
The transferable lesson: Every mailbox is a credential store
Secrets in EmailSource Code AccessRevised AssessmentT1552.001

🛡 How to Defend Against This Chain

Bring non-production tenants under the same identity baseline as production, or delete them. The entire chain started in an environment excluded from the controls that protected everything else. Inventory every tenant, subscription and directory your organization owns - including the ones created for a demo three years ago - and enforce MFA and password policy uniformly. "It's only test" describes the governance, never the reachability.
Audit OAuth application permissions and expire the ones nobody can justify. A legacy app with production rights turned a test-tenant compromise into a corporate one. Enumerate application registrations and service principals, review their granted scopes against current need, remove standing high-privilege consent, and alert on new credentials being added to existing service principals - which is how the actor extended access here.
Enforce phishing-resistant MFA everywhere, with no environment-based exceptions. Password spray only works against accounts without a second factor. This is the same conclusion as 0ktapus arriving by a completely different route, and the exception list is where both attacks look first.
Treat mailboxes as credential stores and hunt them accordingly. Run secret scanning across mail, not just repositories. Establish a genuine channel for sharing credentials with partners and customers so email is never the mechanism, and rotate anything that has been sent by mail. Microsoft had to contact customers because secrets exchanged with them were in those mailboxes.
Detect password spray on the pattern, not the volume from one address. Residential proxies defeat per-IP thresholds. Alert instead on a single password tried across many accounts, on authentication attempts against dormant or non-production accounts, and on successful logins from ASNs your workforce never uses. Legacy authentication protocols that bypass modern controls should be disabled outright.
Keep incident response communications out of band. The actor was reading the security team's email while the investigation ran. Have a pre-established channel - separate tenant, separate provider, or offline - for IR coordination, and use it by default when the scope of a compromise is still unknown.

Related defense topics