Most security reviews happen after the architecture is already built, when moving a trust boundary means rewriting three services instead of redrawing a box on a whiteboard. Threat modeling exists specifically to happen before that point — and STRIDE, a framework Microsoft published in 1999, is still the fastest way to run one without buying anything or waiting for a specialist’s calendar to open up.

TL;DR

  • STRIDE is a mnemonic for six threat categories — Spoofing, Tampering, Repudiation, Information disclosure, Denial of service, Elevation of privilege — applied systematically to every component and data flow in a system design.
  • It needs no special software: a whiteboard, a data flow diagram (DFD), and a room with both developers and security people is enough to run a real session in under an hour.
  • The method works by walking every trust boundary in the DFD and asking all six STRIDE questions at each one — not brainstorming freely, which is how real threat modeling avoids becoming an unstructured worry session.
  • OWASP Threat Dragon and pytm are free, actively maintained tools if you outgrow the whiteboard — Threat Dragon for visual DFD-based modeling, pytm for code-as-threat-model in CI pipelines.
  • Each STRIDE category maps cleanly to real attacker technique families in MITRE ATT&CK, which makes the output directly usable by a SOC, not just an abstract design exercise.

Why This Matters to You

If your organization does security reviews only after code is written — a pentest before launch, a code review before merge — you’re finding architectural flaws at the most expensive possible point to fix them. Threat modeling during design catches the class of bug that a pentest finds anyway, except before it’s built into three dependent services and a database schema.

Table of Contents


What STRIDE Actually Stands For

Each letter is a threat category paired with the security property it violates:

LetterThreatProperty ViolatedAsk
SSpoofingAuthenticationCan someone pretend to be a user, service, or component that isn’t them?
TTamperingIntegrityCan data in transit or at rest be modified without detection?
RRepudiationNon-repudiationCan an action happen without leaving proof of who did it?
IInformation DisclosureConfidentialityCan data be exposed to someone who shouldn’t see it?
DDenial of ServiceAvailabilityCan the system be made unavailable or degraded?
EElevation of PrivilegeAuthorizationCan someone do something they shouldn’t be authorized to do?

The value isn’t the mnemonic itself — it’s that six categories are small enough to actually apply exhaustively to a real system in a working session, unlike open-ended “what could go wrong here” brainstorming, which tends to converge on whatever the loudest person in the room already worried about.


The Data Flow Diagram: Where the Method Actually Starts

STRIDE isn’t applied to a system in the abstract — it’s applied to a data flow diagram (DFD), a deliberately simple representation with four element types:

  • External entities (rectangles) — actors outside your control: users, third-party APIs, other systems
  • Processes (circles or ovals) — components that transform data: your web server, a microservice, a serverless function
  • Data stores (parallel lines) — where data rests: databases, caches, file systems, message queues
  • Trust boundaries (dashed lines) — where data crosses from one privilege or trust level to another: the line between “internet” and “your API gateway,” or between “application” and “database”

The DFD doesn’t need to be polished. A whiteboard photo is a perfectly valid input. What matters is that every trust boundary is marked explicitly — that’s where STRIDE analysis actually happens, because a threat that doesn’t cross a trust boundary usually isn’t worth modeling at that level of detail.


Running a 30-Minute Session

A minimal, real session looks like this:

1. (10 min) Draw the DFD together — developers know the
implementation, security knows the attack patterns.
Include every external entity, process, data store,
and trust boundary.
2. (20 min) Walk each trust boundary in turn. At each one,
ask all six STRIDE questions out loud:
"Can someone spoof this? Tamper with this? Deny this
action happened? See something they shouldn't? Take
this down? Do something they're not authorized to do?"
3. Log every plausible answer in a simple spreadsheet:
threat, affected component, severity, and owner.
4. Assign each logged threat an owner and a next action —
fix now, accept the risk, or track as a backlog item.

The room needs both roles represented — a developer who understands the actual implementation and someone who thinks like an attacker — because STRIDE questions asked by only one side tend to either miss implementation-specific details or miss realistic attacker behavior entirely.


Worked Example: A Login Flow

Take a simple case: a browser (external entity) sends credentials across a trust boundary to a login API (process), which checks them against a user database (data store) and returns a session token.

Walking STRIDE at the boundary between browser and login API:

  • Spoofing: Could an attacker submit credentials as if they were someone else? → Yes, if there’s no rate limiting on login attempts, enabling credential stuffing.
  • Tampering: Could the login request be modified in transit? → Mitigated by TLS, but worth confirming certificate validation isn’t skipped anywhere (a real, common finding).
  • Repudiation: If an account is compromised, can you prove who logged in and when? → Depends entirely on whether login attempts (success and failure) are logged with enough detail to reconstruct a timeline later.
  • Information Disclosure: Does a failed login reveal whether the username exists, even if the password is wrong? → A classic finding — “invalid password” vs. “invalid username” responses leak account enumeration.
  • Denial of Service: Can an attacker lock out or overload the login endpoint? → Depends on whether account lockout policies can themselves be weaponized to lock out legitimate users (lockout-as-DoS).
  • Elevation of Privilege: Once authenticated, does the session token carry only the privileges the user should have, or could a crafted token claim more? → Worth checking whether the token’s claims are validated server-side on every request, not just at issuance.

Six questions, one trust boundary, six concrete findings — none of which required a pentest, a scanner, or specialized tooling. That’s the entire value proposition of the method.


STRIDE vs. Free-Form Brainstorming

The temptation in any design review is to skip the structure and just ask “what could go wrong?” That works for the first five minutes and then reliably degrades — the discussion drifts toward whatever risk someone already had in mind, quieter voices in the room stop contributing, and entire categories of threat (repudiation and denial of service are the most commonly skipped) never come up at all because nobody happened to think of them unprompted.

STRIDE’s actual job is forcing coverage: six questions per trust boundary, asked every time, regardless of what feels intuitively risky. The categories that feel “boring” to ask about — repudiation, in particular — are often exactly the ones that get skipped in free-form discussion and then turn into the finding nobody can explain in an incident review six months later.


Tools: When You Outgrow the Whiteboard

A whiteboard and a spreadsheet are sufficient for most sessions, but two free, actively maintained OWASP tools cover the next step up:

  • OWASP Threat Dragon — a dedicated visual tool for building DFDs and running STRIDE analysis directly against them, with threats attached to specific diagram elements rather than a separate document that drifts out of sync with the design.
  • OWASP pytm — a Python framework where the threat model is defined as code (pytm objects representing entities, processes, and data flows), which generates both a DFD and a threat list programmatically. This is the better fit if you want threat modeling to run in CI and flag when an architecture change introduces a new, unreviewed trust boundary.

Neither replaces the actual thinking the session requires — they just remove friction from documenting and maintaining the output once you’re doing this regularly enough that a spreadsheet stops scaling.


How STRIDE Maps to Real Attacks

Each STRIDE category corresponds to real, observed attacker technique families in MITRE ATT&CK — useful for showing a skeptical stakeholder that this isn’t an abstract design exercise:

STRIDE CategoryRepresentative ATT&CK TechniqueID
SpoofingValid AccountsT1078
TamperingData ManipulationT1565
RepudiationIndicator RemovalT1070
Information DisclosureUnsecured Credentials: Credentials In FilesT1552.001
Denial of ServiceEndpoint Denial of ServiceT1499
Elevation of PrivilegeExploitation for Privilege EscalationT1068

What You Can Do Today

  1. Pick one system you’re currently designing or significantly modifying — not your entire architecture at once. STRIDE works best scoped to something a team can whiteboard in 30 minutes.
  2. Draw the DFD before the meeting, even roughly. A session that starts by drawing the diagram from scratch with everyone watching burns most of the available time on the wrong activity.
  3. Invite one person who thinks like an attacker and one who knows the implementation details. Neither role alone produces the same coverage.
  4. Ask all six STRIDE questions at every trust boundary, even the ones that feel like they obviously don’t apply. The categories people skip are disproportionately the ones that turn into real incidents.
  5. Log findings with an owner and a decision — fix, accept, or backlog — not just a list of worries. An unowned threat list is functionally the same as no threat model at all.
  6. Re-run the exercise when the architecture changes materially, not on a fixed annual schedule. A new trust boundary (a new third-party integration, a new microservice) is the actual trigger, not the calendar.
  7. If you want this to scale past a handful of teams, evaluate pytm so architecture changes in code can trigger an automatic flag when a new trust boundary appears without a corresponding threat model update.


Sources