STRIDE: a vocabulary for what can go wrong
STRIDE is six prompts — Spoofing, Tampering, Repudiation, Information disclosure, Denial of service, Elevation of privilege — each the negation of one security property. It is a vocabulary for completeness, not a checklist, applied element by element.
You are in a design review for a new “export my data” feature. Someone asks, “is this secure?” — and the room goes quiet, because nobody knows where to start. One engineer worries about SQL injection, another about rate limits, a third says “we have auth, it’s fine.” Three people, three threats, no shared map. That silence is the exact problem STRIDE was built to kill. It is not a scanner and it does not find bugs; it is a six-word vocabulary that turns “is this secure?” into six specific, answerable questions — so the room argues about coverage instead of staring at the ceiling.
By the end of this lesson you’ll be able to name the six STRIDE categories, map each to the one security property it negates, and apply them element-by-element to a small system without over- or under-reaching.
Where STRIDE comes from, and what it actually is
STRIDE is a mnemonic invented at Microsoft in 1999 to give engineers a structured way to ask “how could this break?” Before it, threat brainstorming was whatever the most paranoid person in the room happened to remember. STRIDE’s insight is small but powerful: every security goal has an inverse, and that inverse is a threat. So instead of listing attacks (there are infinitely many), you list the six ways a security property can be violated. Six prompts cover the space.
The trick to internalizing STRIDE is to read it as a list of negations. Authentication says “you are who you claim to be” — negate it and you get Spoofing. Integrity says “data and code aren’t altered” — negate it and you get Tampering. Each letter is a property turned inside out:
- Spoofing negates authentication — pretending to be someone or something you are not.
- Tampering negates integrity — modifying data or code you should not be able to change.
- Repudiation negates non-repudiation — performing an action and then plausibly denying it, because nothing recorded it.
- Information disclosure negates confidentiality — exposing data to someone not authorized to see it.
- Denial of service negates availability — making a system unusable for legitimate users.
- Elevation of privilege negates authorization — gaining capabilities beyond what you were granted.
That one-to-one mapping is the whole engine. If you can recite the six properties, you can regenerate STRIDE from scratch — and, more importantly, when you find a threat you can name which guarantee it breaks, which tells you which class of control fixes it.
The six, with concrete shape and a mitigation each
A vocabulary is useless until each word has a picture attached. Here is each STRIDE letter grounded in a property, a concrete example from an ordinary web app, and the control family that answers it.
| STRIDE | Property violated | Concrete example | Mitigation family |
|---|---|---|---|
| Spoofing | Authentication | Forged session cookie or replayed token grants someone else’s identity | Strong auth, MFA, signed/short-lived tokens, mutual TLS |
| Tampering | Integrity | Client edits a hidden price field; row altered in transit | Server-side validation, HMAC/signatures, TLS, DB constraints |
| Repudiation | Non-repudiation | An admin deletes a record and there is no log proving who did it | Tamper-evident audit logs, signed receipts, timestamps |
| Information disclosure | Confidentiality | Verbose error leaks a stack trace; another user’s PII in a response | Encryption at rest/in transit, least privilege, output filtering |
| Denial of service | Availability | An unbounded query or zip-bomb upload exhausts CPU/memory | Rate limits, quotas, timeouts, input size caps, autoscaling |
| Elevation of privilege | Authorization | A normal user hits POST /admin/promote directly and it works | Server-side authz, deny-by-default, sandboxing, least privilege |
Notice the mitigation column is families, not single fixes. “Strong auth” is a direction, not a line of code. STRIDE’s job is to point you at the right family; choosing the specific control is the next, separate step. The value is that you never again ask “is it secure?” — you ask six questions whose answers you can actually defend in a review.
STRIDE-per-element: where to point the six questions
The six categories are only half the method. The other half is where you ask them. STRIDE-per-element means you don’t interrogate the whole system at once — you walk it one piece at a time and apply the relevant subset of STRIDE to each piece.
The reason this matters: not every threat applies to every element. The categories cluster by element type. External entities (users, third-party services) can be Spoofed and can Repudiate, but you don’t “tamper with” a user. Processes (your services) are exposed to all six. Data stores (databases, caches, files) feel Tampering, Information disclosure, Denial of service, and Repudiation (if logs live there) — but a database doesn’t get “spoofed” the way a user does. Data flows (requests crossing a boundary) are where Tampering, Information disclosure, and Denial of service concentrate. Mapping element type → applicable letters keeps the exercise finite and stops you from generating nonsense threats.
A worked pass: the “export my data” endpoint
Take the feature from the hook — GET /export returns the signed-in user’s data as a download. Walk the three elements and ask STRIDE.
The user (external entity). Spoofing: can someone present another user’s session and export their data? The control family is strong authentication — short-lived, signed session tokens, not a guessable id. Repudiation: if a user later claims “I never exported anything,” can you prove otherwise? You need an audit log entry tied to their identity and a timestamp.
The request flow (GET /export crossing the network boundary). Tampering: can a client change a query parameter — say ?user_id= — to redirect the export at someone else? Information disclosure: is the response over TLS, or could it be read on the wire? The fix families are server-side parameter binding (derive the user from the session, never from the request) and transport encryption.
The API process and the database (process + store). Elevation of privilege: does the handler fetch by WHERE id = ? alone, letting any authenticated caller export any row — or does it scope to the owner? Denial of service: can someone request an export so large it pins a CPU or fills a disk, with no size cap or rate limit? Information disclosure: does the export accidentally include columns the user shouldn’t see — internal flags, other people’s references?
That single endpoint, walked through STRIDE-per-element, produced eight concrete, fixable questions in about a minute. None required a tool. That is the entire pitch: structure beats memory.
▸Why this works
Why six, and why these six? STRIDE deliberately maps onto the classic security properties (the CIA triad — confidentiality, integrity, availability — plus authentication, authorization, and non-repudiation). That is not a coincidence; it is the design. Because every category is the negation of a property the system already promises, STRIDE inherits the completeness of that property set. If your system makes a guarantee STRIDE doesn’t cover — say, privacy-as-unlinkability — then STRIDE alone is incomplete, which is exactly why later frameworks like LINDDUN exist for privacy. Knowing what STRIDE covers tells you precisely when to reach past it.
The senior nuance: a prompt, not a checklist
The most common way teams misuse STRIDE is treating the six letters as a checklist to tick: “Spoofing — done, we have login. Next.” That collapses a thinking tool into a compliance ritual and is how real threats slip through. STRIDE is a prompt for completeness — its job is to make sure you considered each category, not to certify that one sentence per letter makes you safe.
Two failure modes sit on either side of that line. Over-applying: mechanically generating a threat for every letter on every element produces a swamp of low-value entries — “the load balancer could be spoofed” — that buries the three threats that actually matter and exhausts the team’s appetite for the exercise. Under-applying: stopping at the first plausible threat per element, so the second, nastier one never surfaces. The senior move is judgment on top of structure: use all six letters to generate candidates, then triage ruthlessly by likelihood and impact, and write down only the threats worth a mitigation decision. STRIDE gives you the questions; you still have to think about the answers. A threat model with forty rote entries and no priorities is worse than one with five real ones and a plan.
Your team adopts STRIDE for a new payments feature. How should you actually run it so it produces value instead of a checklist ritual?
An admin deletes a customer record, and weeks later nobody can prove who did it because nothing was logged. Which STRIDE category is this, and which property did it violate?
You're applying STRIDE-per-element to a Postgres database (a data store). Which letter is the LEAST natural fit to ask of it?
Put the STRIDE categories in their canonical S-T-R-I-D-E order:
- 1 Spoofing (negates authentication)
- 2 Tampering (negates integrity)
- 3 Repudiation (negates non-repudiation)
- 4 Information disclosure (negates confidentiality)
- 5 Denial of service (negates availability)
- 6 Elevation of privilege (negates authorization)
- 01List the six STRIDE categories and the security property each one violates, with one concrete example apiece.
- 02What does STRIDE-per-element mean, and why is STRIDE 'a prompt for completeness, not a checklist'?
STRIDE is a six-word vocabulary — Spoofing, Tampering, Repudiation, Information disclosure, Denial of service, Elevation of privilege — for asking “how could this break?” in a structured way. Its engine is that each category is the negation of one security property: authentication, integrity, non-repudiation, confidentiality, availability, and authorization respectively. Each maps to a control family, not a single fix, so STRIDE points you at the right kind of defense and leaves the specific choice to you. You apply it STRIDE-per-element — walking external entities, processes, stores, and flows, and asking only the letters that fit each element type — which keeps the exercise finite, as the worked “export my data” endpoint showed by producing eight concrete questions in a minute. The senior discipline is to treat the six as a prompt for completeness, not a checklist: generate candidates with every letter, then triage by likelihood and impact and record only the threats worth a decision. Over-applying drowns the signal; under-applying misses the nasty second threat. Next time someone asks “is this secure?”, you have six questions to ask instead of silence.
Practice
Start at the top. Tasks go easiest → hardest: recall a fact, apply it to a case, then a senior-level stretch. Open one, attempt it, then reveal.
Something unclear?
Ask a question about this lesson. Questions are anonymous and go straight to the author to make the lesson better.
Apply this
Put this lesson to work on a real build.