River
Y CombinatorBacked by Y Combinator

Free template

STRIDE Threat Model Template

The STRIDE threat model a security review expects: the data flow and trust boundaries, a register of every threat that applies, fixes and accepted risks.

Free download · No account needed

What you get

Pack of 9 files: 6 documents, 3 spreadsheets

STRIDE Threat Model Template
  • Threat Modelling StandardDocument
  • How Applicability WorksDocument
  • Data Flow and Trust BoundariesDocument
  • Threat Model NarrativeDocument
  • Mitigation PlanDocument
  • Residual Risk NoteDocument
  • Element InventorySpreadsheet
  • Threat RegisterSpreadsheet
  • Trust Boundary RegisterSpreadsheet

How to create a STRIDE threat model

A STRIDE threat model is a written review of how a design could be attacked, made before the system ships. You draw how data moves through it and mark where it crosses a trust boundary. Then you check each part for whichever of STRIDE's six kinds of threat apply to it: spoofing, tampering, repudiation, information disclosure, denial of service and elevation of privilege. A good model gives every threat a response and an owner, and says which questions are still open.

Work element by element, not letter by letter. A table with one row per STRIDE letter can look finished while most of the questions your design raises were never asked.

Two colleagues talking in front of a whiteboard covered in a red flowchart of an app's sign-in, dashboard and pages
Map how data moves through the design before you list a single threat. Photo: Christina @ wocintechchat.com M on Unsplash

Gather the design and set the scope

The Threat Modeling Manifesto1, written by 15 practitioners including Adam Shostack, frames the job as four questions. What are we working on? What can go wrong? What are we going to do about it? Did we do a good enough job?

Answer the first while the design can still change. OWASP's cheat sheet says threat modeling is ideally performed early, such as during the design phase2.

Gather the architecture document, diagrams, infrastructure config, API specs and design review notes. If nothing current exists, write a short solution architecture document first. When an RFC or design doc is still open, model its leading option and add what you find to it.

Next, set the edge of the model. In a 2021 AWS Security Blog post, principal security solutions architect Darran Boyd advises modeling one feature at a time3 rather than a whole workload. A critical threat left open then blocks only that feature's launch. A sensible default is the service under review plus everything it talks to directly.

Draw the data flow and its trust boundaries

OWASP calls the data flow diagram arguably the most common way to model a system2. It needs four kinds of element, plus the trust boundaries between them:

  • External entity (a rectangle): a person or system outside your control that sends or receives data.
  • Process (a circle): code you run, such as a service, job or function.
  • Data store (two parallel lines): anything that keeps data, such as a database, bucket or file.
  • Data flow (an arrow): data moving between two elements.
  • Trust boundary (a dotted line): where data passes between parts trusted differently, such as the internet and your network.

The type decides which threats you check, so type each element by what it does, not who owns it. Code running in your account is a process, even if another team maintains it. A queue that keeps messages for days is a data store.

Add what the drawing leaves out: any element named only in prose, because an element nobody drew never shows up as a gap. Split any arrow that bundles several connections into one flow per pair of endpoints.

Apply STRIDE to each element

Each STRIDE threat breaks a security property, and not every threat applies to every kind of element. A 2006 Microsoft article on the STRIDE approach4 charts which ones do.

STRIDE threats and the elements they apply to

ThreatBreaksCheck it on
SpoofingAuthenticationExternal entities and processes
TamperingIntegrityProcesses, data stores and data flows
RepudiationNon-repudiationExternal entities and processes
Information disclosureConfidentialityProcesses, data stores and data flows
Denial of serviceAvailabilityProcesses, data stores and data flows
Elevation of privilegeAuthorizationProcesses

From Microsoft's 2006 chart.

So each external entity raises 2 questions, each data flow 3, each data store 3 and each process 6. OWASP's free Threat Dragon tool adds repudiation for data stores5, making 4, and the template on this page does the same. Pick one chart and write it down, so everyone counts the same way.

Multiply it out. On Threat Dragon's chart, a design with 2 external entities, 5 processes, 3 data stores and 10 data flows raises 76 questions: 4 + 30 + 12 + 30. The total exists before anyone thinks of a threat, so it is a fair yardstick. "43 of 76 answered" tells a reviewer far more than a list of 43 threats.

Write each threat and choose a response

For each question that applies, describe the attack in this system's terms: who does it, what they need first, and what they get. A threat you could paste onto any system has been named, not answered.

Then give each threat one response. OWASP's cheat sheet lists the four responses Adam Shostack describes2:

The four responses to a threat

ResponseWhat it meansWhat to record
MitigateAdd a control that makes the threat less likelyThe control, and evidence a reader can open
EliminateRemove the feature or component that creates itWhat was removed
TransferMake another party contractually or financially responsibleThe contract or vendor control, and who owns what remains
AcceptLive with the risk on purposeWho accepted it, why, and when it will be reviewed

Prefer removing an exposure to guarding it: a field the server no longer accepts needs no validation. NIST's Secure Software Development Framework suggests you record the response to each risk6, including how mitigations will be achieved and why any exception was approved.

ExampleOne question, answeredAn illustrative example written for this guide. The billing service is made up.

Element: invoice download link (a data flow). Threat type: information disclosure.

Threat: anyone holding the link can read that customer's invoice for 7 days, and links are emailed to shared inboxes.

Response: mitigate. Links now expire after 120 seconds and go only to the session that asked. Evidence: the merged change.

  • Specific. It names the element, what the attacker holds and what they get.
  • Checkable. The evidence is something a reviewer can open, not a promise.

Never invent a threat to fill a row

A plausible threat written to make the register look complete earns a fix nobody needs and hides that nobody looked. Leave the question marked never opened instead.

Say what you haven't checked

A row without a threat can mean four different things, and one status column hides the difference. Give each one a state:

  • Ruled out: the threat can't happen here, and the reason is on the row.
  • No reason given: marked not applicable without saying why. Treat it as unchecked.
  • Never opened: nobody has asked it yet.
  • Blocked: it waits on a missing fact, such as which role a job runs under. Give it an owner and a date.

Report coverage as a fraction, broken down by state. Then rank the trust boundaries by how many questions remain open, and work the worst one first. Take all its crossings together: one design decision, such as authenticating every connection between two tiers, can close many questions at once.

Accept only what you have described

A blocked or never-opened question can't become an accepted risk, because nobody can accept a risk that hasn't been described.

Review the threat model and keep it current

The last question, did we do a good enough job, gets answered in review. OWASP suggests checking that the diagram reflects the real system and every threat has an agreed response2, and that the mitigations can be tested. Record the coverage figure on the day of sign-off, so later readers can tell what was known before release.

Before you sign it off

  • Every element is on the diagram, including ones named only in prose
  • Every trust boundary names who controls the far side
  • Every question that applies has been opened
  • Every ruled-out question gives its reason
  • Every blocked question names the missing fact, an owner and a date
  • Every accepted risk names one person and a review date

Re-run the model when a change moves the count, such as a new trust boundary, third party or store of customer data. Record the bigger decisions it produces, such as removing a feature, in an architecture decision record.

To skip the counting, open the template on this page in River. It reads your design documents, lists every element and flow, and opens a row for each question that applies.

How to use this template

Use the files as they are, or open them in River. Most come filled in with a worked model of a made-up billing service, so you can see how the parts fit together before you replace it with your own design.

With Edit with AI, River asks for your design material and settles four ground rules with you, such as where the model ends. It then lists every element and data flow, counts the STRIDE questions that apply, opens a register row for each one and reports what is still unanswered.

  1. Download it or open it in River

    Get the six Word documents and three CSV sheets free, or open the template in River and share your design documents.

  2. List every element and flow

    Fill in Element Inventory from your design documents, or let River read them and list every element and flow.

  3. Work one boundary at a time

    Answer the open questions in Threat Register, starting with the trust boundary where the most remain open.

  4. Write it up for review

    Finish the narrative, mitigation plan and residual risk note, state coverage, and share them with your security reviewer.

What's in the template

The cells nobody asked about, countedEvery cell figure recomputes from the element type. Nothing in the Cells column was typed in by a person.
STRIDE Threat Model Template
RiverElement Inventory

Element Inventory

Ledger, the metering and invoicing service at a fictional company, Cardinal Systems. Cells follow the normalized type: external entity 2, data flow 3, data store 4, process 6.

IDElementTypeAs drawnCellsAnsweredNever openedBlocked
EE-02StripeExternal entityCircle2200
PR-01Portal web appProcessCircle6600
PR-02Metering ingestProcessSquare6240
PR-05Internal admin consoleProcessNot drawn6060
DS-02Invoice PDF bucketData storeS3 stencil4202
DS-03Usage event streamData storeQueue stencil4130
DF-03Ingest to usage streamData flowUnlabelled arrow3030
DF-07Presigned invoice fetchData flowDashed arrow3300
DF-10Admin console to databaseData flowNot drawn3030
OUT-01Stripe card vaultOut of scopeOutside boundary0n/an/an/a

Full census: 2 external entities, 5 processes, 3 data stores, 10 data flows. 2×2 + 5×6 + 3×4 + 10×3 = 76 applicable cells, of which 43 answered, 26 never opened, 7 blocked. PR-02 is drawn as a square because another team owns it; renormalizing it to a process reclaimed 4 cells that were never in anyone’s denominator. PR-05 and DF-10 exist in one sentence of the design review notes and brought 9 more.

RiverThreat Register

Threat Register

One row per cell, not per threat. An empty cell is a row that says which kind of empty it is.

CellElementCategoryEmptinessResponseThreat or reasonOwner
C-041Presigned fetchInfo disclosureAnsweredMitigateURL valid 7 days is a bearer token for one tenant’s invoice, and it lands in a shared inbox. Cut to 120s.R. Achebe
C-015Admin to portalTamperingAnsweredEliminateInvoice amount was posted from the client. Field removed; server recomputes from metered usage.R. Achebe
C-024StripeRepudiationAnsweredTransferStripe retains the event log by event id and reconciliation reads from it, so we hold no second copy.D. Okafor
C-072Usage streamDenial of serviceAnsweredAcceptOne tenant can fill 7 days of retention and stall every tenant’s invoicing. Accepted as RR-02.S. Iyer
C-032Billing databaseRepudiationRuled out, no reason—Marked not applicable with an empty reason, which is indistinguishable from nobody thinking about it.Unassigned
C-055Invoice generatorElevation of privBlocked—Waiting on: does the scheduled task assume its own role or inherit the cluster instance role?S. Iyer
C-061Admin consoleElevation of privNever opened—Element was never drawn, so none of its 6 cells were ever in the denominator.Unassigned
C-052Metering ingestElevation of privNever opened—One of the 4 cells that appeared only after this element was retyped from external entity to process.Unassigned
C-043Presigned fetchElevation of privNot applicable by matrix—A data flow carries three categories. This one is outside the denominator, recorded so it is not read as a gap.—

Four states of empty, and only one of them is a finding you can act on today. A register with one row per threat has no row for never opened, which is exactly why it is the state that ships.

RiverTrust Boundaries

Trust Boundary Register

Keyed on the boundary, because the answered cells concentrate at the crossings rather than on the boxes.

IDBoundaryFar side controlled byCrossingsAuthenticatedCellsAnswered
TB-01Internet edgeNobody, it is the open internet33 of 399
TB-02Payment processorStripe11 of 133
TB-03App tier to data tierCardinal platform team84 of 8248
TB-04Corporate networkNobody could name an owner10 of 130
TB-05Observability vendorDatadog0 drawnn/a0n/a

Coverage in this model does not fail evenly. It collapses at one boundary, and here that is TB-03: eight crossings between the tiers, half of them unauthenticated, 8 of 24 cells answered. That is one design property rather than eight findings. TB-04 is not drawn anywhere and nobody could name who owns its far side. TB-05 has nothing crossing it, so it contributes no cells and cannot be wrong, which is what makes it easy to leave.

  • Threat Modelling StandardYour team's rules: when to model, the four element types, the four responses and when a model is done.
  • How Applicability WorksWhich STRIDE threats apply to each element type, and how to count the questions a design raises.
  • Data Flow and Trust BoundariesThe worked design as a text diagram, with its element count and each trust boundary explained.
  • Threat Model NarrativeThe summary a reviewer reads first, built on the four questions, with coverage stated up front.
  • Mitigation PlanEach fix with its owner and status or due date, ordered by what blocks the release.
  • Residual Risk NoteEvery accepted risk, with the person who accepted it, the reasoning and an expiry date.
  • Element Inventory sheetEvery element and data flow, its type as drawn and as counted, and how many STRIDE questions it raises.
  • Threat Register sheetOne row per question that applies: the threat, its state, response, owner, due date and evidence.
  • Trust Boundary Register sheetEach trust boundary, who controls the far side, the flows crossing it and how many of its questions are answered.

Common questions

What is STRIDE in threat modeling?

STRIDE is a mnemonic, first developed at Microsoft, for six kinds of threat: spoofing, tampering, repudiation, information disclosure, denial of service and elevation of privilege. Each one breaks a security property, such as authentication or integrity. Teams use the six as prompts while reviewing a design, asking how an attacker could cause each failure in each part where it applies.

What does STRIDE per element mean?

It means checking each part of a design only for the threats that fit its type. Microsoft's 2006 chart gives an external entity spoofing and repudiation, and a process all six. Data flows and data stores get tampering, information disclosure and denial of service. OWASP's Threat Dragon tool, and this template, also check data stores for repudiation.

When should you create a threat model?

Create it during design, while changing the plan is still cheap, and before code review or penetration testing. Update it whenever a change adds a trust boundary, a third party or a new place where customer data is kept, so the model keeps matching the system.

What is a trust boundary?

A trust boundary is a line on a data flow diagram where data moves from one level of trust to another, often because someone else controls the far side. Common examples are the internet and your network, your application and its database tier, and your system and a vendor's. OWASP counts boundaries among the possible attack points, so record every flow that crosses each one.

How is a threat model different from a penetration test?

A threat model examines the design, usually before the code exists, while a penetration test attacks the running system. Guidance on the AWS Security Blog places threat modeling before code review, code analysis and penetration testing. A finished model also helps scope the test, because it shows which flows and boundaries carry the most risk.

Is this STRIDE threat model template free?

Yes. Download the six Word documents and three CSV sheets with no signup. Most files show a worked model of a made-up billing service, which you then swap for your own design. Edit with AI opens the same template in River.

What does Edit with AI do?

It opens the template in a free River workspace. River asks for your design documents, settles four ground rules with you, then lists every element and data flow and opens a register row for each STRIDE question that applies. It marks what your documents already answer, never invents threats to fill rows, and asks which boundary to work first.

Sources

  1. Threat Modeling Manifesto Working Group. “Threat Modeling Manifesto.” threatmodelingmanifesto.org (opens in a new tab)

  2. OWASP Cheat Sheet Series. “Threat Modeling Cheat Sheet.” cheatsheetseries.owasp.org (opens in a new tab)

  3. AWS Security Blog. “How to approach threat modeling.” aws.amazon.com (opens in a new tab)

  4. Microsoft Learn. “Uncover Security Design Flaws Using The STRIDE Approach.” learn.microsoft.com (opens in a new tab)

  5. OWASP Threat Dragon. “Threat categories.” threatdragon.com (opens in a new tab)

  6. NIST. “SP 800-218, Secure Software Development Framework (SSDF) Version 1.1: Recommendations for Mitigating the Risk of Software Vulnerabilities.” csrc.nist.gov (opens in a new tab)

Written by

Chandler Supple

Co-founder & CEO, River

Chandler has spent the last six years working in AI, building tools for millions of users and Fortune 100 companies. In 2025, he co-founded River to build a new kind of operating system for AI agents.

Reviewed by

Brian Joseff, Co-founder, River