STRIDE
Six categories that turn "what could go wrong" from a stare into a checklist.
What you will learn
- -Name the six STRIDE categories and the property each one violates
- -Apply STRIDE to a single component and generate concrete threats
- -Pick the right category so the mitigation is obvious
Stare at a login service and ask "what could go wrong" and your brain returns static. Too many directions at once. STRIDE fixes that by handing you six specific lenses, so instead of one impossible question you ask six answerable ones. Microsoft built it in the late 1990s and it stuck because it maps cleanly onto the security properties you actually care about.
Each letter is a , and each threat is the negation of one guarantee you wanted.
The six, and what they break
Spoofing breaks . The attacker pretends to be someone they are not: a stolen session , a forged with alg set to none, an email that to come from your CEO. The property you wanted was "I know who this is."
Tampering breaks integrity. Data gets changed in transit or at . A hidden form field carrying price=1000 that the rewrites to price=1, a modified , a poisoned build artifact. You wanted "this data is what I stored."
Repudiation breaks accountability. Someone does a thing and you cannot prove they did it, usually because the are missing, forgeable, or the actor could edit them. The absence of a tamper-evident trail is the whole problem here.
Information disclosure breaks confidentiality. Data leaks to someone who should not see it: verbose traces, an set to public, a /api/users/1 that happily serves /api/users/2. You wanted "only the right people read this."
Denial of service breaks availability. The is up for attackers and down for real users. An unbounded regex, a query with no pagination, a single upload endpoint that accepts a 10 GB file. You wanted "it stays responsive."
Elevation of privilege breaks . A user gains rights they were never granted. A normal account reaching an admin route because the check was only in the UI, a , a that lands in /etc/shadow. You wanted "everyone stays in their lane."
Run it against one thing at a time
STRIDE is worthless as a vibe and sharp as a per-element pass. Take one component, walk all six letters, write down what you find, move to the next component. That discipline is what keeps you from missing the boring category that turns out to be the breach.
Point it at a session and the list writes itself. Spoofing: can I steal or forge one. Tampering: can I flip a claim inside it. Repudiation: is token use logged. Information disclosure: does the token leak in a or referrer . Denial of service: can I exhaust the session store. Elevation of privilege: does a low-priv token treated as high-priv anywhere.
$STRIDE-per-element: for each box in the diagram, ask all six letters and record every hit.The category also picks your fix. Spoofing points at authentication: , mutual , verification. Tampering points at integrity: HMACs, signed , -side validation. Repudiation points at logging you cannot edit. Naming the letter correctly is half the mitigation.
Walking STRIDE across a system produces a list of concrete ways to attack it. Generate that list for designs you own or are authorized to assess, and treat the output as a defensive backlog, not a to run against someone else's production. The categories are the same whether you attack or defend. Your authorization to touch the target is what separates the two.
A regular user reaches an admin-only API route because the access check exists only in the front-end code. Which STRIDE category is this?