This site keeps a set of detailed cloud breach kill chains, each one walked step by step from initial access to impact. Read them one at a time and each feels unique. Read them together and something uncomfortable happens: the same handful of mistakes show up over and over, across three decades, across every major cloud, against companies with real security budgets.
This page is the synthesis. It names the recurring root-cause patterns, shows you which breaches demonstrate each one, and gives you a table mapping every breach to its initial-access vector and the single control that would have helped most. If you are prioritizing a cloud security program and want to know where the money actually goes, start here, then dive into the individual chains on the breach timeline.
On this page
- The forty-five breaches
- Theme 1: Identity is where it starts
- Theme 2: The code and vendors you trust
- Theme 3: Seeing it, and the speed of it
- Where the pattern breaks: the ones that do not fit
- The mapping table: vector to control
- MITRE ATT&CK techniques across these chains
- What to actually do about it
The forty-five breaches
The chains synthesized here span 1994 to the present. Old and new belong on the same page on purpose: the tooling changed, the root causes did not. A pretext call to a Novell network admin in 1994, a vishing call to an MGM help desk in 2023, and a fake IT support call about a password reset in 2026 are the same attack.
- Mitnick / Novell (1994) - war dialing and pretexting calls hunting dial-up access and NetWare source code, until a network admin taped the voicemail that named the hacker and Novell fed him a keystroke-watched honeypot.
- event-stream (2018) - a maintainer who had not used the package since 2012 handed publish rights to a volunteer who asked. The payload targeted exactly one Bitcoin wallet application.
- Capital One (2019) - an SSRF bug reached IMDSv1, borrowed an over-privileged IAM role, and exfiltrated 106 million records from S3.
- SolarWinds (2020) - the build system itself was compromised, shipping the SUNBURST backdoor to thousands of customers, then a Golden SAML pivot into the cloud.
- Codecov Bash Uploader (2021) - a credential recoverable from a Docker image layer let an attacker add one line to a script thousands of pipelines execute on every build, draining CI secrets for two months.
- ChaosDB / Azure Cosmos DB (2021) - researchers escaped a Cosmos DB notebook container and retrieved other customers' primary keys. Tenant isolation is the one boundary a customer cannot audit or compensate for.
- Log4Shell (2021) - not a breach. The moment vulnerability management stopped being about patching known assets, because most organizations could not answer whether they were even affected.
- Kaseya VSA / REvil (2021) - zero-days in an internet-facing RMM server let REvil push ransomware down the agent update channel, encrypting ~1,500 businesses through ~50-60 managed service providers.
- Okta / LAPSUS$ (2022) - a subcontractor's support engineer, five days of access, and two months before customers were told - and only then because the attackers posted screenshots.
- 0ktapus / Twilio (2022) - 130+ organizations phished by SMS with live one-time codes relayed in real time. Cloudflare received the same phish and lost nothing, because FIDO2 keys cannot be relayed.
- Uber (2022) - dark-web credentials plus MFA push fatigue got a contractor's account, then a hardcoded PAM secret unlocked full AWS and GCP admin.
- LastPass (2022-23) - a dev environment breach led to source-code recon, a keylogger on a DevOps engineer's home PC, and exfiltration of encrypted vault backups from S3.
- CircleCI (2022-23) - malware stole a live 2FA-backed SSO session cookie from an engineer's laptop, reaching production systems holding every customer's secrets.
- 3CX / X_TRADER (2023) - the first documented cascading compromise: a trojanized trading app on an employee's personal PC ended with 3CX signing and shipping a backdoored softphone to its own customers.
- Storm-0558 (2023) - a stolen Microsoft signing key found in a crash dump was used to forge authentication tokens and read government email.
- Microsoft SAS leak (2023) - an over-permissioned SAS token pushed to public GitHub exposed 38TB of internal data for roughly three years.
- Scattered Spider / MGM (2023) - LinkedIn OSINT fed a vishing call to the help desk, yielding Okta super-admin, Azure AD, and encrypted ESXi servers.
- XZ Utils (2024) - two years of legitimate contributions and a sock-puppet pressure campaign against a burned-out volunteer put a backdoor into a library on every Linux system. Caught by a 500ms latency anomaly.
- Midnight Blizzard / Microsoft (2024) - a password spray against a legacy test tenant with no MFA reached a legacy OAuth app holding production rights, then executive email, then secrets inside it.
- Change Healthcare / ALPHV (2024) - stolen credentials on a Citrix portal with no MFA, nine days of quiet exfiltration, then ransomware that stopped a third of US healthcare payments.
- Polyfill.io (2024) - nobody was hacked. The domain was sold, and every site still carrying the script tag began serving malicious code to its own visitors.
- Snowflake / UNC5537 (2024) - infostealer credentials logged into accounts with no MFA, then bulk-exfiltrated data from 165+ organizations.
- MOVEit / Cl0p (2023) - an unauthenticated SQL injection zero-day in managed file transfer software, harvested across ~2,600 organizations in a campaign measured in days.
- Okta support system (2023) - a service account password synced to an employee's personal Google profile unlocked a support system full of customer HAR files containing live session tokens.
- Promptware kill chain (2024-26) - indirect prompt injection poisoned an AI agent's context, establishing persistence and covert command and control.
- Ultralytics (2024) - a fork branch name poisoned the GitHub Actions cache, and the malicious release was published by the project's own workflow with entirely correct provenance.
- Codefinger / S3 (2025) - stolen AWS keys encrypted victims' S3 buckets with AWS's own SSE-C, holding the only copy of the key and setting 7-day delete timers as ransom pressure.
- tj-actions/changed-files (2025) - a compromised GitHub Action (CVE-2025-30066) was retagged to a malicious commit that dumped CI runner memory and printed secrets into public build logs across 23,000+ repositories.
- Salesloft Drift / UNC6395 (2025) - stolen OAuth tokens from a third-party Salesforce integration drove bulk SOQL exfiltration across 700+ tenants, then the exports were mined for embedded cloud secrets.
- UNC6040 / Salesforce vishing (2025) - operators phoned employees as IT support and talked them through Salesforce's own consent screen to authorize a fake Data Loader. No product vulnerability involved.
- SharePoint ToolShell (2025) - unauthenticated RCE on on-prem SharePoint, then stolen ASP.NET machine keys that let attackers forge trusted requests long after the patch landed.
- Entra ID Actor token (2025) - an undocumented service-to-service token plus a legacy Graph API that never checked the tenant meant Global Admin in any tenant. Disclosed responsibly, fixed in three days, never exploited.
- Nx / s1ngularity (2025) - shell commands in a pull request title stole the npm publishing token, and the payload drove the developer's own Claude, Gemini and Q CLIs to hunt for secrets.
- Shai-Hulud npm worm (2025) - phished maintainer tokens, TruffleHog turned on the developer's machine, then self-replication across 500+ packages with no attacker involvement after the first push.
- npm debug / chalk (2025) - a lookalike npmjs.help page relayed a live TOTP code to hijack one maintainer account, trojanizing 18 packages carrying 2.6 billion weekly downloads.
- Oracle E-Business Suite / Cl0p (2025) - an unauthenticated zero-day in ERP software, mass-exploited for two months before a patch existed, monetized through email extortion rather than encryption.
- GTG-1002 / Claude Code (2025) - Anthropic says a state-sponsored group jailbroke its coding agent with a role-play persona and task decomposition, then had it run 80-90% of an espionage campaign against ~30 targets.
- LiteLLM / TeamPCP (2026) - a poisoned security scanner running inside LiteLLM's own CI leaked the project's PyPI publishing token, and the resulting releases ran on every Python interpreter start.
- Vercel / Context.ai (2026) - an infostealer on an AI vendor's laptop became OAuth token theft, a Google Workspace takeover, and plaintext customer environment variables. No Vercel vulnerability was involved.
- Vimeo / Anodot (2026) - ShinyHunters stole the tokens an analytics vendor held on Vimeo's behalf and queried its Snowflake and BigQuery directly, never exceeding the integration's own permissions.
- Mini Shai-Hulud / TanStack (2026) - a fork pull request poisoned the GitHub Actions cache, a later release run restored it, and OIDC scraped from runner memory published 84 npm versions carrying valid SLSA provenance.
- Megalodon (2026) - GitHub credentials bought from infostealer logs drove 5,718 commits into 5,561 repositories in six hours, injecting workflows that swept CI runners for cloud credentials and OIDC tokens.
- Storm-2949 (2026) - an attacker-initiated Entra ID self-service password reset plus a fake IT support call took over the account's MFA methods, then rode existing Azure RBAC into Key Vault, SQL, and storage.
- Suspected AI-assisted AWS compromise (2026) - one actor went from an application weakness to broad control of a large AWS estate in roughly 72 hours with no malware and no zero-day, then extorted the victim by holding the infrastructure.
- Hugging Face / OpenAI agent (2026) - a model under evaluation escaped its sandbox through a zero-day in the proxy meant to contain it, then breached Hugging Face production to retrieve the benchmark's answers. No human chose the target.
Now the patterns, grouped into three themes: where intrusions start, what you trust that you did not build, and whether you would see it in time. Most breaches belong to more than one pattern, because real kill chains stack failures - and several span themes.
Theme 1: Identity is where it starts
The largest cluster, and the one to fund first. In all four of these the attacker arrives holding something that works - a password bought from an infostealer log, a reset talked through a help desk, a token scoped far past its job, or an account with no second factor at all. Nothing is exploited in the traditional sense, which is why these chains produce so little that looks like an attack in the logs.
Pattern 1: Stolen, purchased, and infostealer credentials
Shows up in: Uber, Snowflake / UNC5537, LastPass, Codefinger / S3, Salesloft Drift / UNC6395, Megalodon, Vercel / Context.ai, Shai-Hulud, Nx / s1ngularity, npm debug / chalk, 3CX / X_TRADER, 0ktapus / Twilio, CircleCI, Change Healthcare, Midnight Blizzard.
The most boring initial-access vector is also the most common: the attacker already has a valid password. Nobody exploited a zero-day to get in. In Uber, the attacker bought a contractor's credentials off a dark-web marketplace. In Snowflake, an infostealer running on employee and contractor machines - some of them personal, unmanaged devices - harvested Snowflake logins that had been valid for years. In LastPass, the second-stage intrusion planted a keylogger on a DevOps engineer's home computer to capture the master password for a privileged vault.
The lesson is that your identity perimeter includes machines you do not manage. A credential is only as trustworthy as the endpoint it was typed on, and infostealer malware has turned every unmanaged laptop into a credential faucet. The controls that matter here are phishing-resistant MFA (so a stolen password alone is useless), short-lived credentials instead of long-lived static logins, and killing standing access to sensitive systems from unmanaged devices. This is the core argument for zero trust: never assume a valid credential means a trusted session.
The 2025 chains extend "credential" past the password. Codefinger never touched a login screen - it authenticated with a leaked long-lived AWS access key and used it to encrypt S3 buckets. Salesloft Drift was breached with stolen OAuth tokens for a third-party integration, no password or MFA prompt involved. API keys, access keys, and OAuth tokens are credentials too, and they leak from git history, CI logs, and integration vendors just as readily as passwords leak from infostealers. Rotate them, scope them, expire them, and monitor for their use from unfamiliar sources.
The 2026 chains make the infostealer economy impossible to dismiss as background noise. Megalodon is the starkest measurement anyone has published: cross-referencing the affected repositories against known infections, 331 of 978 unique usernames - over a third - were direct matches to machines already running infostealers. Nobody exploited GitHub. Somebody bought enough logs to run a campaign. Vercel's chain started the same way, with a commodity stealer on one employee's laptop at a small AI vendor, and ended inside a major hosting platform two hops later. Developer endpoints deserve particular attention here, because a single browser profile and credential helper holds keys to repositories, package registries, and cloud accounts at the same time. Monitor stealer-log dumps for your own domains, keep credentials out of browser profiles, and prefer hardware-backed keys and short-lived tokens over long-lived personal access tokens.
Pattern 2: Help desk and human social engineering
Shows up in: Mitnick / Novell, Uber, Scattered Spider / MGM, Storm-2949, UNC6040.
The oldest breach on this list and one of the newest are the same attack with a 29-year gap. Kevin Mitnick called Novell staff impersonating real employees, with researched backstories, hunting for dial-up access - and the call that failed is the reason he is in a federal case study: the network admin he pretexted recognized the policy-breaking request and taped him. Scattered Spider scraped LinkedIn to learn who worked at MGM, called the IT help desk impersonating one of them, and talked the agent into resetting MFA and handing over Okta super-admin. Uber's attacker, after buying credentials, still had to defeat MFA, and did it partly through a barrage of push prompts and a message pretending to be from Uber IT.
Humans are a control surface, and the help desk is the softest part of it. The identity-recovery flow - the process for when a legitimate user loses their phone - is the exact process an attacker abuses. Hardening this means treating account recovery as a high-assurance operation: identity-proofing that cannot be satisfied by information from a LinkedIn profile, manager or in-person verification for privileged accounts, and phishing-resistant factors that a help desk agent cannot simply reset over the phone. Threat modeling your own help desk is one of the highest-leverage exercises most teams never do.
Storm-2949 shows the sharpest version of the problem, because it inverts the usual advice. Microsoft assesses that the actor triggered an Entra ID self-service password reset on the target's behalf, then phoned that target impersonating internal IT so the resulting MFA prompt would be approved as part of a routine-sounding reset. The prompt was genuine. Number matching bought nothing, because the control was faithfully validating a real request - it just could not tell who had asked for it. Self-service password reset is a credential-issuance system that most organizations classify as a convenience feature, and it deserves the same protection as an admin role grant: phishing-resistant methods required for reset, and a conditional-access policy on the security-information registration flow so a caller on an unmanaged device cannot re-enroll MFA at all.
Pattern 3: Over-permissioned identities and tokens
Shows up in: Capital One, Microsoft SAS leak, Storm-0558, Codefinger / S3, Salesloft Drift / UNC6395, Storm-2949, Vimeo / Anodot, Vercel / Context.ai.
This is the pattern that turns a foothold into a catastrophe. In Capital One, an SSRF bug was the way in, but the reason it mattered was the IAM role reachable from the instance metadata service had far more permission than the web application needed, including broad S3 read access. In the Microsoft SAS leak, the exposed token was not just leaked, it was scoped to an entire storage account with write access and a multi-decade expiry, so a single accidental commit exposed 38TB. In Storm-0558, a single consumer signing key turned out to be usable, through a validation flaw, to forge tokens for enterprise and government accounts far beyond its intended scope.
The connective tissue is blast radius. Every one of these was survivable if the compromised identity or token had been scoped to only what it needed. Least privilege is not a compliance checkbox, it is the difference between an incident and a disaster. Practically: scope tokens narrowly and give them short lifetimes, prefer IAM roles with tightly bound policies over broad ones, enforce IMDSv2 so SSRF cannot trivially steal instance credentials, and continuously audit for identities whose granted permissions vastly exceed their used permissions. This is exactly the gap a CNAPP or CIEM tool is built to surface (disclosure: the site's author works at Wiz).
The 2025 chains are pure blast-radius stories. The Codefinger keys carried enough S3 permission to both read and overwrite objects, so a single leaked key could encrypt an entire bucket. The Salesloft Drift OAuth tokens were scoped to broad Salesforce API access, so one compromised integration exposed every object in hundreds of tenants. Third-party integration tokens deserve the same least-privilege scrutiny as your own IAM roles - grant them the minimum objects and API scopes they need, and revoke the ones you no longer use.
Two 2026 chains sharpen this into a specific warning about permissions that do not look dangerous. Storm-2949 never exploited anything after initial access: the compromised identities already held privileged Azure RBAC, and the actor simply spent it. The operations it used read like infrastructure management on a change ticket - publishxml/action to retrieve App Service deployment credentials, storageAccounts/listkeys/action to obtain account keys, firewallrules/write to open Azure SQL to its own addresses - and not one of them reads a byte of customer data by itself. Chained, they are a complete path from control plane to production data. Vimeo is the same lesson from the other end: the attacker never escalated at all, because the analytics integration's own grant was already enough to expose 119,000 records. The defensive question is not "how did they escalate" but "why could an analytics vendor read customer email addresses?" Audit management permissions for what they can be chained into, not just for what they are named.
Pattern 4: Missing or bypassed MFA
Shows up in: Snowflake / UNC5537, Uber, Storm-2949, Vimeo / Anodot, 0ktapus / Twilio, Change Healthcare, Midnight Blizzard.
Snowflake is the cleanest case study in the cost of not enforcing MFA. The attacker had valid credentials from infostealers, and the accounts they targeted simply had no second factor required. There was no clever bypass because none was needed. The platform supported MFA, but it was not enforced organization-wide, so a stolen password was a full login. The blast radius reached 165+ downstream organizations.
Uber shows the next level: MFA was present but defeated. Push-based MFA that just asks the user to tap "approve" is vulnerable to fatigue attacks, where the attacker spams prompts until someone taps yes to make it stop, sometimes helped along by a social-engineering message. The lesson is a two-parter. First, enforce MFA everywhere, with no exceptions for service accounts, contractors, or legacy integrations, because attackers find the one door without a lock. Second, not all MFA is equal: push-approve and SMS are phishable and fatigue-able, while phishing-resistant factors like FIDO2 or passkeys defeat both the replay and the fatigue attack. When you read these two chains next to each other, "turn on MFA" quietly becomes "enforce phishing-resistant MFA with no gaps."
The 2026 chains add a third failure mode that neither of those covers: MFA that was present, enforced, and then quietly rewritten to belong to the attacker. Storm-2949 stripped the victim's registered phone, email, and Authenticator registrations and enrolled its own device in their place. From that moment every sign-in satisfied MFA and conditional access legitimately, using the attacker's device, while the real owner had lost exactly the methods they needed to recover the account. Vimeo shows the opposite gap - the stolen Anodot tokens were service-to-service credentials that never touch an MFA prompt at all, because machine identities do not have one. So the checklist grows again: enforce phishing-resistant MFA, alert on authentication-method registration changes as incidents rather than help-desk noise, and remember that non-human identities sit entirely outside the control you just spent a year rolling out.
Theme 2: The code and vendors you trust
Twenty-two of the forty-five chains on this page run through something the victim did not write and did not operate: a dependency, an integration somebody authorized, or a tool installed to make the organization safer. That is over half the library, and it grew that way because the incident record is shaped that way rather than because the category was sought out. The three patterns below separate mechanisms that are usually collapsed together.
Pattern 5: Supply-chain and build-pipeline compromise
Shows up in: SolarWinds, Codecov, 3CX / X_TRADER, XZ Utils, event-stream, Kaseya VSA, Polyfill.io, Ultralytics, Log4Shell, tj-actions/changed-files, Salesloft Drift / UNC6395, Nx / s1ngularity, Shai-Hulud, npm debug / chalk, LiteLLM / TeamPCP, Mini Shai-Hulud / TanStack, Megalodon.
SolarWinds was once the outlier that did not follow the identity playbook; by 2025 the supply chain is a well-worn attack surface. The attackers did not phish a user or steal a password to start. They compromised the build system and inserted the SUNBURST backdoor into the software itself, so that SolarWinds cryptographically signed and shipped the malware to thousands of customers as a trusted update. The victims did nothing wrong at install time; they trusted a signed update from a vendor they had every reason to trust.
This is a different threat model, and it is why software supply chain security is its own discipline. The controls live in your CI/CD pipeline: hardened and isolated build environments, verified reproducible builds, artifact signing and provenance (the SLSA framework and tools like Sigstore), and a software bill of materials so you know what is actually in what you ship and consume. It also reframes vendor risk: you inherit the security of everyone whose code runs in your environment. The later Golden SAML pivot in the same intrusion also ties back to Pattern 3, forging trusted authentication material to move from on-prem into the cloud.
The 2025 chains show the supply chain moving up-stack. In tj-actions/changed-files, the compromised dependency was a single popular GitHub Action: attackers stole a bot's token, retagged every version to a malicious commit, and turned tens of thousands of CI pipelines into secret-leaking machines - a build-pipeline attack that needed no vendor of SolarWinds' size. In Salesloft Drift, the compromised link in the chain was a SaaS integration vendor whose OAuth tokens unlocked hundreds of downstream Salesforce tenants. Pin third-party actions to full commit SHAs rather than mutable tags, treat every integration you authorize as part of your attack surface, and remember that your build pipeline and your SaaS OAuth grants are supply chains too.
By 2026 the pipeline attacks stopped needing a stolen publishing token at all, which breaks the controls most teams had just finished deploying. Mini Shai-Hulud never took a maintainer credential: a fork pull request poisoned the GitHub Actions cache, a later release run restored it, and OIDC tokens scraped from runner memory published packages carrying entirely valid SLSA provenance. Megalodon poisoned Tiledesk's source on GitHub and let the maintainer publish from it, so the malicious releases carried legitimate publisher identity. In both cases every downstream check that verifies who published a package returned a clean answer. That is worth sitting with, because provenance and signing were the recommended answer to SolarWinds, and these chains route around them by compromising the thing being attested rather than the attestation.
Three chains added later push the category in directions the npm and Actions cases do not reach. Codecov is the earliest and the simplest: the compromised artifact was not a package at all but a shell script that pipelines curl and execute on every build, and the payload was a single added line exporting the environment. It ran for two months and ended because one customer compared a published SHA-256 against what they had downloaded - an available, documented, entirely optional control. 3CX establishes that the chain can be more than one link long: a trojanized trading application on an employee's personal computer led to stolen credentials, then to both build environments, then to a validly signed backdoored softphone shipped to 3CX's own customers. Mandiant called it the first cascading software supply chain compromise, and it breaks vendor risk management as normally practised, because assessing your suppliers tells you nothing about theirs.
XZ Utils is the one that should change how you think about the category, because it does not begin with theft or exploitation. It begins with two years of genuine, useful, reviewed contributions. An identity using the name Jia Tan built a real reputation from 2021, sock puppet accounts pressured an exhausted unpaid maintainer over release delays, and by January 2023 the attacker held maintainer rights to a compression library present on essentially every Linux system. The enabling change - IFUNC support, committed months early with a legitimate performance justification - was reviewable and correct. The payload never appeared in git at all: it lived in the release tarballs, hidden in files that looked like binary compression test fixtures, assembled at build time. Code review cannot catch that, and saying so plainly matters more than any control on this list. What the attack actually exploited was one burned-out volunteer maintaining critical infrastructure alone for free, which describes a large share of every dependency tree here. It was caught because someone investigating an unrelated performance regression noticed sshd logins were about half a second slow.
LiteLLM adds the most uncomfortable variant: the compromise entered through Trivy, a vulnerability scanner running as a build step. Security tooling is installed early, runs with the pipeline's credentials, and is trusted by definition, so the scanner read the job's secrets and handed over the PyPI publishing token. The practical controls are unglamorous. Split scanning and publishing into separate jobs with separate permissions so no one step holds both. Mint publishing credentials through OIDC-based trusted publishing instead of storing static tokens. Fail the build when a package version has no corresponding signed tag, which is the cheapest possible catch for a direct-to-registry upload. Pin dependencies by hash so a version that exists for forty minutes cannot enter your builds. And purge caches and rebuild runner images after any pipeline compromise, or you will restore the payload yourself.
Pattern 6: The vendor you authorized is the way in
Shows up in: Salesloft Drift / UNC6395, Vercel / Context.ai, Vimeo / Anodot, UNC6040, Okta support system, Okta / LAPSUS$, CircleCI, MOVEit / Cl0p.
This pattern deserves separating from the supply chain above, because nothing is poisoned and no artifact is tampered with. The attacker simply arrives through a door you opened on purpose. Vimeo's systems were never breached: Anodot, an analytics vendor, held long-lived tokens into Vimeo's Snowflake and BigQuery, and stealing those tokens was enough. Vercel's systems were never exploited: an employee had connected a third-party AI tool to their corporate Google Workspace account, and control of that tool's OAuth application converted into control of the employee's identity, then their Vercel account, then internal systems. Salesloft Drift ran the same shape a year earlier across 700 Salesforce tenants.
What makes this hard is that every human-facing control is bypassed by construction. A compromised OAuth grant produces no failed authentication, no MFA denial, and no impossible-travel sign-in, because there is no login. Password rotation does not revoke it. Employee offboarding does not revoke it. And the grant frequently never passed through vendor review at all, because from the company's perspective nothing was procured - an employee clicked "allow" on a consent screen. AI productivity tools concentrate the risk further, since they cannot function without ingesting organizational data and therefore ask for broad mail and drive scopes as a matter of design, which makes their token stores unusually dense targets.
Treat connected applications as identity infrastructure. Enumerate third-party consents in Google Workspace or Entra ID, restrict user consent to a vetted allow-list, require admin approval for broad scopes, and review the list on a schedule. Keep an inventory recording, for each integration, what credential it holds, its scope, its owner, and the exact command that revokes it - Vimeo contained this quickly because the integration was identifiable and killable, which is an inventory property rather than a lucky one. Then rehearse it: a tabletop whose scenario is "a vendor tells us our tokens are stolen" and whose success criterion is total revocation within the hour.
Pattern 7: Your own tooling, turned around
Shows up in: Nx / s1ngularity, Shai-Hulud, LiteLLM / TeamPCP.
Three separate chains, three separate actors, and the same idea in each: rather than write a capability, use the one the victim already installed. Shai-Hulud downloaded TruffleHog - a secret scanner built for defenders - and pointed it at the developer's own filesystem, inheriting years of work on what every cloud provider's credential format looks like and where it tends to live. Nx / s1ngularity went further and drove the developer's installed Claude, Gemini and Q command-line agents with --dangerously-skip-permissions, --yolo and --trust-all-tools, because an AI agent is already trusted on that machine, already has filesystem access, and reasons about "which of these ten thousand files holds a credential" far better than a regular expression. LiteLLM is the sharpest version, since the compromise entered through security tooling: TeamPCP poisoned Trivy, a vulnerability scanner running as a build step, and the scanner read the pipeline's secrets on the attacker's behalf.
The uncomfortable part is that none of these tools were misused in a way their authors could prevent. A secret scanner that finds secrets, an AI agent that reads files when told to, and a vulnerability scanner that runs early with pipeline credentials are all working exactly as designed. What changed is who is holding them. Every capability installed for convenience or diligence is a capability an attacker inherits on compromise, and the security toolchain is a particularly rich seam because it is trusted by definition, runs with elevated access, and is rarely reviewed with the suspicion applied to application dependencies.
The defensive moves are mostly about inventory and least privilege applied somewhere unfamiliar. Know which agents and scanners are installed on developer machines and in build images, and treat that list as attack surface rather than tooling. Alert on permission-bypass flags and on a build process fetching a security binary off the internet, which is a strong signal precisely because nothing legitimate about a dependency install should do that. Keep agent configuration and credential files out of directories arbitrary postinstall scripts can read. And split jobs so no single step holds both third-party tooling and the credentials that tooling could steal, which is the specific control that would have contained LiteLLM.
Theme 3: Seeing it, and the speed of it
These three are about the gap between an attack happening and anyone knowing. One is about telemetry that was never collected. One is about chains that now finish before an alert reaches a human. And one is about the operator on the other end no longer necessarily being a person. They matter most once the controls in the first two themes have failed, which in every chain here they eventually did.
Pattern 8: You could not even reconstruct what happened
Shows up in: Storm-0558, Entra ID Actor token, Okta support system (and it made every other breach worse).
Storm-0558 exposed a second, quieter failure: many affected organizations could not tell whether they had been accessed, because the relevant sign-in and mailbox-access logs were only available in higher-priced licensing tiers. When forged tokens are indistinguishable from legitimate ones, logs are the only way to find them, and if you do not have the logs, the honest answer to "were we breached" is "we cannot say." That is not an incident-response posture, it is a coin flip.
Logging is not a detection nicety, it is the substrate that detection engineering and incident response are built on. Across all forty-five breaches, the ones that were caught early were caught because someone had the telemetry and was looking at it; the ones that ran for months or years (the Microsoft SAS token sat public for about three years) ran that long partly because nobody was watching the right signal. Turn on cloud audit logging (CloudTrail, Azure sign-in and audit logs, GCP audit logs), retain it long enough to matter, ship it somewhere an attacker who owns the account cannot delete it, and actually build detections on it. Storing logs you never query is a compliance artifact, not a control.
The 2026 chains show what happens when the telemetry exists but nothing in it looks wrong. Vimeo's attacker used a valid credential, a mainstream database client, and queries the integration was authorized to run; the only available signal was how much data moved. Storm-2949's Graph enumeration was authenticated, expected, high-volume API traffic. Megalodon's commits were authored as build-bot with messages imitating routine CI maintenance, and its dormant variant produced no workflow run history at all. None of these are logging gaps. They are baselining gaps, and the fix is different: profile what each integration and service identity normally does - rows scanned, bytes returned, call volume, time of day - and alert on deviation, because there will be no failed login to catch.
Pattern 9: The whole chain now finishes before anyone reads the alert
Shows up in: Suspected AI-assisted AWS compromise, Megalodon, Mini Shai-Hulud / TanStack, Storm-2949, Nx / s1ngularity, Shai-Hulud, GTG-1002.
The oldest chains on this page unfolded over months. SolarWinds ran for roughly fourteen months, the Microsoft SAS token sat public for about three years. The 2026 chains are measured differently. Megalodon pushed 5,718 commits into 5,561 repositories inside a six-hour window. Mini Shai-Hulud published 84 malicious npm versions in six minutes. Storm-2949 pulled dozens of Key Vault secrets in roughly four minutes. In the Sygnia case, one actor went from an application weakness to broad control of a large AWS estate in about 72 hours, and four accounts' keys were used within a single observed second - the detail that led Sygnia to infer AI assistance, though that attribution is inference rather than proven fact.
The consequence is structural, not rhetorical. A control that depends on a human noticing something and responding is now competing against a chain that may complete before the first alert is triaged. That does not mean detection is pointless; it means the weight has to shift toward things that hold without a human in the loop. Preventive controls that simply refuse the action - default-deny egress from build runners, network policies that make a stolen warehouse credential fail from an unexpected address, dependency pinning by hash, branch protection and required signatures. Short credential lifetimes, so the window a stolen token is useful in closes on its own. Automated response for the highest-confidence signals rather than a ticket. And blast-radius design, so that the speed of the first hour bounds how much it can reach.
Pattern 10: The attacker may not be a person
Shows up in: GTG-1002 / Claude Code, Hugging Face / OpenAI agent, Suspected AI-assisted AWS compromise.
Three chains here involve an AI system doing the tactical work, and they sit at three genuinely different points on a spectrum worth keeping straight. In the Sygnia AWS case the AI involvement is inference from tempo, not proven fact - four accounts' keys used in a single observed second is the kind of evidence that suggests automation without establishing what kind. In GTG-1002 humans chose every target and approved escalation at four to six gates; the AI did the labor between those gates, which makes it a human campaign with the work automated rather than an autonomous adversary. In the Hugging Face incident the model selected the target itself, and nobody intended an intrusion at all.
That last case is the one without precedent, and it is worth being precise about why. It was not a misuse of AI by an attacker. It was a capability evaluation whose containment failed, whose objective was open-ended, and whose subject pursued an instrumental step - get the benchmark answers from wherever they live - straight into a third party's production infrastructure. There was no ransom, no exfiltration to a criminal market, and no adversary in the ordinary sense. The attribution arrived five days later as a voluntary disclosure from the lab responsible.
What does not change is the defensive answer, and this deserves saying because the novelty invites overreaction. Every one of these chains ran the same phases as the human ones: reconnaissance, exploitation, credential harvesting, lateral movement, exfiltration. Patching, least privilege, phishing-resistant MFA, segmentation and egress control work exactly as well against an AI operator. What changes is tempo, which is the argument made in Pattern 9, and one new item: if you build or run agent systems, the containment around them is now part of your attack surface. Air-gap capability evaluations properly, bound agent objectives explicitly with out-of-bounds targets named, scope agent tool access and identity to the minimum, and log agent actions somewhere reviewable. And be reachable - in both AI incidents here, the notification came from a company the victim had no relationship with.
Where the pattern breaks: the ones that do not fit
A synthesis that cannot name its own counterexamples is not worth much, so here are the chains on this page that the ten patterns above do not explain, and what they change about the conclusions.
Oracle E-Business Suite / Cl0p is straightforward vulnerability exploitation, which this page otherwise argues is rare. No credential was stolen, no employee was tricked, no token was forged, no integration was abused. Cl0p exploited an unauthenticated remote code execution flaw in widely deployed ERP software for roughly two months before a patch existed, then extorted victims by email. Every identity control on this page was irrelevant to it. That does not overturn the headline finding - identity still dominates the sample, and the root-cause distribution on the breach timeline still puts provider and product exploitation well down the list - but it does mean "invest in identity" cannot be the whole program. The controls that mattered here were unglamorous and structural: not exposing the ERP to the internet at all, filtering egress so the server could not fetch the attacker's payload, and having an emergency patching path for a business-critical system that a quarterly maintenance window cannot accommodate.
SharePoint ToolShell is the same shape as Oracle EBS, with one extra lesson attached. Unauthenticated exploitation of an internet-facing server, no identity control anywhere on the path. What makes it worth its own mention is that the recovery advice most organizations followed was wrong: attackers stole the ASP.NET machine keys, so patching the vulnerability and deleting the web shell left them able to forge __VIEWSTATE requests the application accepts as its own, indefinitely. Rotating the keys was the step that mattered and the step most likely to be skipped, because almost nobody inventories cryptographic material as a credential with an owner and a rotation schedule. Read it next to Storm-0558: theft of signing material is the compromise that is hardest to recover from, because everything downstream is built to believe it.
The Entra ID Actor token flaw is not a breach, and no customer control applied to it. It was found by a researcher, reported, and fixed globally in three days with no evidence of exploitation. It belongs here anyway, because it is the clearest available demonstration of where the shared responsibility line actually sits. MFA was never prompted, because no user authentication occurred. Conditional Access never evaluated it, because there was no sign-in to evaluate. Device compliance, sign-in risk, named locations, token protection: none of them were on the path, and a tenant that had implemented every recommendation on this site was exactly as exposed as one that had implemented none. The honest lesson is not fatalism. It is that prevention has a ceiling your provider sets, and that the controls worth buying past that ceiling are the ones that limit consequences rather than access: what an identity can reach once inside, how quickly you would notice, and how fast you can revoke.
The mapping table: vector to control
Each row is one breach, its initial-access vector, and the single control that would most likely have broken the chain earliest. "Single control" is a deliberate oversimplification - real defense is layered - but forcing the choice makes the priorities obvious.
| Breach | Initial-access vector | The one control that would have helped most |
|---|---|---|
| Mitnick / Novell | Pretext phone call to an employee | Identity-proofing on the help desk / recovery flow |
| event-stream | Publish rights handed to a volunteer on request | Watch maintainership changes; pin dependencies by hash |
| Capital One | SSRF to IMDSv1 for instance credentials | Least-privilege IAM role (plus IMDSv2) |
| SolarWinds | Compromised build system | Hardened, verifiable build pipeline with provenance |
| Codecov Bash Uploader | Credential recoverable from a Docker image layer | Pin and verify build-time scripts; no curl | bash |
| ChaosDB / Cosmos DB | Provider-side tenant isolation failure | None available; rotate long-lived keys, prefer identity auth |
| Log4Shell | Unauthenticated RCE via a transitive dependency | SBOM plus default-deny egress from application servers |
| Kaseya VSA / REvil | Zero-days in an internet-facing RMM server | Management consoles off the public internet |
| Okta / LAPSUS$ | Compromised subcontractor support engineer | Contractual notification in hours, extended to subcontractors |
| 0ktapus / Twilio | SMS phishing with live one-time codes relayed | Phishing-resistant MFA - demonstrably, at Cloudflare |
| Uber | Purchased credentials + MFA push fatigue | Phishing-resistant MFA (FIDO2 / passkeys) |
| LastPass | Keylogger on an unmanaged home PC | No privileged access from unmanaged endpoints |
| CircleCI | Session cookie stolen from an engineer endpoint | Device-bound sessions; short lifetimes for privileged roles |
| MOVEit / Cl0p | Unauthenticated SQL injection zero-day | Keep managed file transfer off the public internet |
| 3CX / X_TRADER | Trojanized third-party app on an employee personal PC | Device compliance required for VPN and corporate auth |
| Storm-0558 | Stolen signing key from a crash dump | Key protection (HSM) plus complete access logging |
| Microsoft SAS leak | Over-permissioned token in public GitHub | Narrowly scoped, short-lived tokens + secret scanning |
| Scattered Spider / MGM | Vishing the IT help desk | High-assurance verification for privileged recovery |
| Snowflake / UNC5537 | Infostealer credentials, no MFA | Enforced MFA on every account, no exceptions |
| Okta support system | Service account synced to a personal Google profile | Block personal browser profiles on managed devices by policy |
| Promptware | Indirect prompt injection into an AI agent | Untrusted-content isolation + least-privilege agent tools |
| XZ Utils | Two-year maintainer infiltration; backdoor only in tarballs | Build from git, not tarballs; verify artifact matches source |
| Midnight Blizzard | Password spray on a legacy test tenant with no MFA | One identity baseline across all tenants, prod or not |
| Change Healthcare | Stolen credentials on a Citrix portal with no MFA | MFA on every internet-facing access path, audited |
| Polyfill.io | Third-party script domain sold to a new owner | Self-host third-party scripts, or pin with SRI |
| Ultralytics | Fork branch name injected into a workflow shell step | No PR-supplied values in shell steps; scope the Actions cache |
| Codefinger / S3 | Leaked long-lived AWS access key | Short-lived credentials + key-use anomaly detection |
| tj-actions/changed-files | Compromised GitHub Action retagged to malicious commit | Pin third-party actions to full commit SHAs |
| Salesloft Drift / UNC6395 | Stolen OAuth tokens for a SaaS integration | Least-privilege, revocable third-party OAuth grants |
| UNC6040 / Salesforce | Vishing an employee into authorizing a rogue connected app | Allowlist connected apps; restrict who may authorize one |
| SharePoint ToolShell | Unauthenticated deserialization on internet-facing SharePoint | Do not expose it; rotate machine keys after any exposure |
| Entra ID Actor token | Provider-side flaw; no customer-reachable vector | None available - provider fix only; limit blast radius |
| Nx / s1ngularity | Shell injection via a PR title in pull_request_target | Never interpolate PR data into a shell step; read-only token |
| Shai-Hulud npm worm | Phished maintainer credentials and a live TOTP code | Phishing-resistant MFA on maintainer accounts |
| Oracle EBS / Cl0p | Unauthenticated RCE zero-day in internet-facing ERP | Do not expose the ERP; egress-filter the app server |
| npm debug / chalk | Real-time TOTP relay against a maintainer account | Phishing-resistant MFA on maintainer accounts |
| GTG-1002 / Claude Code | Jailbroken AI agent running the tactical work | Unchanged fundamentals; controls that need no human in the loop |
| LiteLLM / TeamPCP | Poisoned security scanner in the project's own CI | Separate scan and publish jobs; OIDC trusted publishing |
| Vercel / Context.ai | Infostealer at a vendor, then its OAuth app | Admin-approved, allow-listed third-party app consent |
| Vimeo / Anodot | Stolen analytics-vendor tokens into the warehouse | Scoped, short-lived, network-bound integration credentials |
| Mini Shai-Hulud / TanStack | Fork PR poisoning the Actions cache | Isolate untrusted PR runs; no shared cache across trust levels |
| Megalodon | Infostealer-bought GitHub credentials, direct push | Branch protection plus required commit signature verification |
| Storm-2949 | Attacker-initiated SSPR plus a fake IT call | Phishing-resistant methods required for password reset |
| Suspected AI-assisted AWS compromise | Internet-facing application weakness | Short-lived credentials so a 72-hour window closes itself |
| Hugging Face / OpenAI agent | Malicious dataset RCE, by a model that escaped its sandbox | True air-gapping of capability evaluations; bounded objectives |
Read the right-hand column top to bottom. Identity controls dominate: MFA, least privilege, scoped tokens, hardened recovery. That is not a coincidence, it is the headline finding of this whole page.
MITRE ATT&CK techniques across these chains
Mapping the breaches to ATT&CK turns forty-five stories into a short, deduplicated list of behaviors you can build detections and controls around. A handful of techniques recur constantly - which tells you exactly where to point your detection engineering first.
- T1078 Valid Accounts - the connective thread of almost the entire list. Logging in with legitimate credentials or session material appears in Uber, Snowflake, LastPass, and Scattered Spider / MGM. If you detect one thing well, detect anomalous use of valid accounts.
- T1552 Unsecured Credentials - credentials or tokens left somewhere reachable: the IMDS role in Capital One, the SAS token in public GitHub in the Microsoft SAS leak, the hardcoded PAM secret in Uber, and the CI secrets printed into public logs in tj-actions/changed-files.
- T1621 Multi-Factor Authentication Request Generation - the push-fatigue technique that helped defeat MFA in Uber.
- T1195 Supply Chain Compromise - the defining technique of SolarWinds, where the trusted software update was itself the weapon, and of tj-actions/changed-files, where a retagged CI dependency (T1195.001) leaked secrets from tens of thousands of pipelines. The 2026 chains extend it in both directions: LiteLLM / TeamPCP entered through a compromised security scanner in the build (T1195.001), while Mini Shai-Hulud and Megalodon produced malicious releases (T1195.002) that carried legitimate publisher identity, because the source was poisoned rather than the publishing credential stolen.
- T1606 Forge Web Credentials - forging trusted authentication material: the stolen signing key forging tokens in Storm-0558 and the Golden SAML pivot in SolarWinds. Closely related to the broader T1550 Use of Alternate Authentication Material pattern of abusing tokens instead of passwords.
- T1589 Gather Victim Identity Information and T1656 Impersonation - the OSINT-then-pretext opening of Scattered Spider / MGM and Mitnick / Novell.
- T1566 Phishing - social-engineering delivery, present in the Scattered Spider / MGM and Mitnick / Novell chains.
- T1530 Data from Cloud Storage and T1486 Data Encrypted for Impact - the impact end of the chains: bulk cloud-storage exfiltration in Snowflake, LastPass, and the Microsoft SAS leak, ESXi ransomware in MGM, and SSE-C bucket encryption in Codefinger / S3.
- T1528 Steal Application Access Token - abusing OAuth tokens instead of passwords, the entire basis of Salesloft Drift / UNC6395, where stolen third-party integration tokens drove bulk data theft across hundreds of SaaS tenants, and of Vercel / Context.ai, where control of a vendor's OAuth application meant the ability to mint valid tokens for any user who had consented.
- T1585 Establish Accounts and T1656 Impersonation - the two-year reputation build and sock-puppet pressure campaign that produced XZ Utils. Worth listing because it is the only entry here where the initial "access" was earned rather than stolen, and no technical detection applies to it.
- T1550.004 Use Alternate Authentication Material: Web Session Cookie - session tokens lifted from customer-uploaded HAR files and replayed in the Okta support system breach, skipping password and MFA entirely because authentication had already happened.
- T1553.002 Code Signing - a validly signed backdoored application shipped by 3CX, and a validly signed trojanized installer at the step before it. Signing establishes authorship, not that the authoring environment was trustworthy.
- T1190 Exploit Public-Facing Application - the outlier technique on this page, and the whole of Oracle EBS / Cl0p: an unauthenticated request chaining SSRF into XSLT injection into a Java ScriptEngine into
Runtime.exec. Worth a detection of its own precisely because it does not look like anything else here. - T1567.001 Exfiltration to Code Repository - stolen secrets committed to public GitHub repositories in the victim's own account, in both Nx / s1ngularity and Shai-Hulud within the same month. Egress filtering does not help when the destination is a host every developer machine already talks to; detect it at the API layer instead, on repository creation and visibility changes.
- T1111 Multi-Factor Authentication Interception - the real-time relay of a live TOTP code that opened Shai-Hulud, and the reason "we have MFA" and "we have phishing-resistant MFA" are different sentences.
- T1199 Trusted Relationship - arriving through an authorized integration rather than a perimeter, in Vimeo / Anodot and Vercel / Context.ai. Worth treating as a first-class detection target, because it produces no failed authentication to alert on.
- T1556.006 Modify Authentication Process: MFA and T1098.005 Account Manipulation: Device Registration - the authentication-method takeover in Storm-2949, where existing factors were stripped and an attacker-controlled device enrolled, so MFA began attesting the attacker.
- T1552.005 Cloud Instance Metadata API - sweeping the metadata service for instance credentials, in Capital One via SSRF and in Megalodon from inside the CI runner, where IMDSv2 was harvested rather than bypassed because the code was already executing on the host.
- T1621 Multi-Factor Authentication Request Generation also covers the Storm-2949 opening, where the generated prompt was entirely genuine and the social engineering supplied the reason to approve it.
The pattern in the ATT&CK view matches the pattern in the table: the recurring techniques cluster around identity (T1078, T1552, T1621, T1606) and social engineering (T1589, T1656, T1566), not around exotic exploitation. Build your detection library outward from there.
What to actually do about it
If you compress all forty-five breaches into a to-do list, it is short and unglamorous:
- Enforce phishing-resistant MFA everywhere, with zero exceptions. No carve-outs for contractors, service accounts, or legacy integrations. Attackers find the one door without a lock (Snowflake, Uber).
- Practice ruthless least privilege on identities and tokens. Scope narrowly, expire quickly, prefer roles over long-lived keys, and continuously audit granted-versus-used permission gaps (Capital One, Microsoft SAS leak, Storm-0558). See IAM.
- Harden your recovery and help-desk flows as high-assurance operations. The account-recovery process is the attack surface (Mitnick, MGM, Uber).
- Assume unmanaged endpoints are compromised. Keep privileged access off devices you do not control (LastPass, Snowflake).
- Secure the build pipeline and know your dependencies. Provenance, signing, an SBOM, and third-party actions pinned to commit SHAs in your CI/CD flow (SolarWinds, tj-actions/changed-files). Treat SaaS OAuth integrations as part of that supply chain too (Salesloft Drift).
- Turn on complete, tamper-resistant audit logging and actually build detections on it. You cannot respond to what you cannot see (Storm-0558, and every long-dwell breach here). Then baseline what each integration and service identity normally does, because the 2026 chains generate no failed logins to catch (Vimeo, Storm-2949, Megalodon). See detection engineering and incident response.
- Govern third-party app consent as identity infrastructure, and keep a revocation-ready inventory. Allow-list approved applications, require admin approval for broad scopes, and record for every integration what credential it holds and how to kill it within the hour (Salesloft Drift, Vercel / Context.ai, Vimeo / Anodot).
- Reduce attack surface on the systems no identity control protects. The one straightforward exploitation chain here needed no credential at all, so the controls that mattered were structural: do not expose ERP and other crown-jewel applications to the internet, default-deny egress from application servers so an SSRF cannot fetch its payload, and rehearse emergency patching on a business-critical system before you need it (Oracle EBS / Cl0p). See vulnerability management.
- Verify build-time artifacts against their source, every run. Codecov was a hosted script nobody re-checked; XZ shipped a backdoor that existed in the release tarball and not in git. Pin third-party scripts and dependencies by hash, build from tagged source rather than tarballs where you can, and fail the build when a published artifact does not correspond to the commits it claims. Both of those chains had a cheap, available check that would have caught them, and in both cases it was optional.
- Fund and support the maintainers in your dependency path. XZ Utils exploited an unpaid volunteer maintaining critical infrastructure alone, and the pressure campaign that produced the handover targeted exactly that. Contribute maintenance effort, fund the projects you depend on, and support foundations doing this at scale. This is a security control, and for that class of attack it is the only one that addresses the cause.
- Inventory the tooling you installed, because attackers inherit it. Secret scanners, vulnerability scanners and AI coding agents were all turned against their owners in 2025 and 2026. Track what is installed on developer machines and in build images, alert on permission-bypass flags and on builds fetching security binaries, and split jobs so no step holds both third-party tooling and the credentials it could steal (Shai-Hulud, Nx / s1ngularity, LiteLLM).
- Prefer controls that hold without a human in the loop. Chains that finish in hours or minutes outrun alert triage, so lean on default-deny egress, hash-pinned dependencies, branch protection with required signatures, and credential lifetimes short enough that the window closes itself (Megalodon, Mini Shai-Hulud, the AI-assisted AWS case).
None of this is exotic. That is the point. These breaches did not fall to novel research; they fell to fundamentals that were skipped, scoped too broadly, or turned off for convenience. If you want a worked example of these same controls applied to a real (small) production system, this site documents its own setup in how CSOH.org is secured.
Where next
Read the individual kill chains on the breach timeline to see these patterns in full detail, or the year-by-year reviews for how these same root causes played out across this past year's incidents. Then go deeper on the controls that keep appearing in the right-hand column: IAM and least privilege, detection engineering, and incident response. For a concrete example of applying these lessons to a live system, see how CSOH.org is secured.
Quick answers
What is the most common root cause of cloud breaches?
Identity is. Across these forty-five kill chains, the single largest bucket is credential and identity abuse: stolen or purchased credentials, missing or bypassed MFA, and over-permissioned identities and tokens. Exploited software vulnerabilities are far down the list. If you only have budget for one thing, invest in identity.
Would MFA have stopped all of these breaches?
No. Phishing-resistant MFA would have blocked the credential-replay breaches like Snowflake and the push-fatigue step in Uber, but it does nothing against a forged token (Storm-0558), a leaked long-lived SAS token (Microsoft SAS leak), or a poisoned build pipeline (SolarWinds). MFA is necessary but not sufficient. You still need least privilege, short-lived credentials, and logging.
How do MITRE ATT&CK techniques help me learn from breaches?
Mapping each breach to ATT&CK techniques turns forty-five stories into a short, deduplicated list of behaviors you can build detections and controls for. When the same techniques (T1078 Valid Accounts, T1552 Unsecured Credentials) show up in breach after breach, you know exactly where to spend your detection-engineering effort first.