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
- The Data Flow Diagram: Where the Method Actually Starts
- Running a 30-Minute Session
- Worked Example: A Login Flow
- STRIDE vs. Free-Form Brainstorming
- Tools: When You Outgrow the Whiteboard
- How STRIDE Maps to Real Attacks
- What You Can Do Today
What STRIDE Actually Stands For
Each letter is a threat category paired with the security property it violates:
| Letter | Threat | Property Violated | Ask |
|---|---|---|---|
| S | Spoofing | Authentication | Can someone pretend to be a user, service, or component that isn’t them? |
| T | Tampering | Integrity | Can data in transit or at rest be modified without detection? |
| R | Repudiation | Non-repudiation | Can an action happen without leaving proof of who did it? |
| I | Information Disclosure | Confidentiality | Can data be exposed to someone who shouldn’t see it? |
| D | Denial of Service | Availability | Can the system be made unavailable or degraded? |
| E | Elevation of Privilege | Authorization | Can 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 (
pytmobjects 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 Category | Representative ATT&CK Technique | ID |
|---|---|---|
| Spoofing | Valid Accounts | T1078 |
| Tampering | Data Manipulation | T1565 |
| Repudiation | Indicator Removal | T1070 |
| Information Disclosure | Unsecured Credentials: Credentials In Files | T1552.001 |
| Denial of Service | Endpoint Denial of Service | T1499 |
| Elevation of Privilege | Exploitation for Privilege Escalation | T1068 |
What You Can Do Today
- 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.
- 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.
- Invite one person who thinks like an attacker and one who knows the implementation details. Neither role alone produces the same coverage.
- 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.
- 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.
- 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.
- 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.
Related Posts
- Zero Trust vs. Real Attacks: Which Threats Does It Actually Stop? — trust boundaries are the shared concept between STRIDE and zero-trust architecture.
- API Security in 2026: JWT Attacks, OAuth Abuse, and GraphQL Exploitation — many of the findings a STRIDE session surfaces on an API map directly onto this piece’s technical detail.
- The Build Is the Target: CI/CD Pipeline Attacks and How to Detect Them — a strong candidate system to run your first STRIDE session against, given how often pipeline trust boundaries go unexamined.
- SSRF Explained: How Attackers Make Servers Fetch Secrets for Them — a concrete example of a Tampering/Information Disclosure finding STRIDE analysis on a trust boundary would surface.
Sources
- OWASP — Threat Modeling Cheat Sheet
- Microsoft Learn — The STRIDE model
- OWASP — Threat Modeling Process (Historical)
- OWASP Threat Dragon
- OWASP pytm
- Drata — Using the STRIDE Threat Model: Tutorial & Best Practices
- AquilaX — Threat Modeling with STRIDE: A Practical Developer Guide
- MITRE ATT&CK — T1078 Valid Accounts
- MITRE ATT&CK — T1565 Data Manipulation
- MITRE ATT&CK — T1070 Indicator Removal
- MITRE ATT&CK — T1552.001 Unsecured Credentials: Credentials In Files
- MITRE ATT&CK — T1499 Endpoint Denial of Service
- MITRE ATT&CK — T1068 Exploitation for Privilege Escalation