Skip to main content

Practice · For Security architects, senior engineers

Threat modelling in practice: facts, hypotheses, conclusions

Threat models go stale because they mix what you know, what you suspect and what you decided. Keep the three apart and a model stays useful, testable and easy to update.

A threat model that can't tell you which of its statements are observed, suspected or decided can't tell you when it's wrong.

Why threat models go stale, or go wrong

Most teams have written a threat model at some point. Few still trust the one they have. The document was accurate the week it was written, then the system changed: a queue was added, a role was widened, a vendor was replaced. Nobody could tell which parts of the model those changes invalidated, so the whole thing quietly stopped being read.

The root cause is usually structural. A typical threat model mixes three kinds of statement in the same paragraphs: things the authors observed ("the upload bucket is private"), things they suspected ("an attacker could upload a crafted image"), and things they decided ("we accept this risk until Q3"). A reader cannot tell them apart, and neither can the next author.

Three layers: facts, hypotheses, conclusions

Separate the model into three layers, each pointing at the one below.

  • Facts are observable statements about the system, each with a source and a date: the endpoint is public; the worker runs as this role; the role can read this bucket. A fact can be checked, and when the system changes, a fact can become false.
  • Hypotheses are threats that the facts make possible: what an attacker could do, under which conditions, and what would confirm or refute it. A hypothesis names the facts it depends on.
  • Conclusions are decisions: mitigate, accept, transfer or avoid, with an owner, a date and, for accepted risks, an expiry. A conclusion names the hypotheses it answers.

This structure gives you something most threat models lack: a way to know what to update. When a fact changes, every hypothesis that cites it, and every conclusion built on those, is due for review. Nothing else is.

Facts, hypotheses and conclusions, each citing the layer belowKNOWSUSPECTDECIDEFactsobserved, cited,datedEvidencecode, config,cloudHypotheseswhat could gowrongTests andprobesconfirm or refuteConclusionsdecided and ownedActionsfixes, acceptedriskscitedmake possiblepredictnew evidenceassessedassigned
Facts, hypotheses and conclusions, each citing the layer below. Evidence produces facts; facts make hypotheses possible; tests confirm or refute them and feed new evidence back; only assessed hypotheses become conclusions with owners and actions. When a fact changes, everything that cites it is due for review.
Read the diagram as text
  • Know: Facts, Evidence
  • Suspect: Hypotheses, Tests and probes
  • Decide: Conclusions, Actions
  1. Evidence → Facts: cited
  2. Facts → Hypotheses: make possible
  3. Hypotheses → Tests and probes: predict
  4. Tests and probes → Evidence: new evidence
  5. Hypotheses → Conclusions: assessed
  6. Conclusions → Actions: assigned

Gather facts from evidence, not memory

Start with what you can observe. Infrastructure code shows networks, identities and data stores. Application code shows entry points, authorisation checks and outbound calls. Pipeline definitions show who can deploy. Cloud configuration shows what actually exists, which is not always what the code says.

Record each fact with where it came from and when. Just as important, record what you do not know: "we have not established whether the reporting service can reach the payments database" is a fact about your knowledge, and it is worth more than an optimistic assumption. Unknowns are where hypotheses should concentrate.

Generate hypotheses systematically

Adam Shostack's four questions are a reliable frame: what are we working on, what can go wrong, what are we going to do about it, and did we do a good job? The second question is where structure helps most.

  • Walk each trust boundary crossing and apply STRIDE: spoofing, tampering, repudiation, information disclosure, denial of service and elevation of privilege.
  • For the most valuable assets, build attack trees backwards from the attacker's goal.
  • Use known adversary behaviour, such as MITRE ATT&CK techniques, to check that hypotheses reflect what attackers actually do.
  • Write abuse cases next to user stories for new features.

A good hypothesis is specific and testable: it names the facts it relies on and what observation would refute it. "Attackers could compromise the system" is not a hypothesis. "A crafted image could exploit the thumbnail library and give an attacker the worker's role, which can read every tenant's uploads" is.

Turn hypotheses into conclusions you can defend

For each hypothesis, decide what evidence would settle it and gather that evidence: check the role's permissions, read the library's advisories, test whether the worker is sandboxed. Then assess likelihood and impact with a method your organisation already uses, such as the approach in NIST SP 800-30, and decide.

Write the conclusion so a stranger can audit it. "Mitigate: run the thumbnail worker in a sandbox with no network access, and scope its role to a per-tenant prefix. Owner: platform team. Done when: the role policy and sandbox configuration are merged." Or, for an accepted risk: who accepted it, why, with which compensating controls, and until when. Accepted risks without an expiry are how temporary exceptions become permanent architecture.

Worked example: a file upload service

Facts: uploads arrive through an authenticated API, are stored in a private bucket under a per-tenant prefix, and are processed by a worker that generates thumbnails with a third-party image library. The worker's role can read the whole bucket. Unknown: whether the worker has outbound network access.

Hypothesis: a crafted file exploits the image library, giving the attacker code execution in the worker, its role, and therefore every tenant's files; if outbound access exists, the data can leave. Tests: read the role policy (confirmed: bucket-wide read), check the network policy (confirmed: unrestricted egress), check the library's advisories (two parsing flaws last year).

Conclusion: mitigate. Scope the worker's credentials to one tenant per job, remove outbound network access, and process files in an isolated sandbox. Each of those changes alters a fact, and the hypothesis can then be reassessed against the new facts.

Keep it alive

The Threat Modeling Manifesto values continuous refinement over a single delivery. In practice that means modelling each significant change rather than the whole system once, re-checking facts on a schedule, and treating a changed fact as a trigger rather than a footnote. The three-layer structure makes that cheap enough to actually happen.

Sources

  1. Threat Modeling Manifesto

    Threat Modeling Manifesto working group

  2. Four Question Framework for threat modeling

    Adam Shostack

  3. Threat Modeling Cheat Sheet

    OWASP

  4. Microsoft Threat Modeling Tool threats (STRIDE)

    Microsoft

  5. Guide for Conducting Risk Assessments (SP 800-30 Rev. 1)

    NIST

  6. ATT&CK

    MITRE

Practice · 4 min read

How AI can help your existing architecture, and where it can't

An honest account of AI in security architecture review: what it does well (reading everything, connecting evidence, drafting hypotheses), what it cannot do, and how to tell the difference in any tool.

  • AI
  • architecture review
  • evidence

Practice · 4 min read

From vulnerability to architectural impact

A CVSS score describes a bug. Whether it matters depends on your architecture: is the code present, reachable, and holding privileges worth stealing? Four questions that turn an advisory into a decision.

  • vulnerability management
  • CVE
  • CVSS

Foundations · 4 min read

Architecture decision records for security

Security decisions outlive the people who made them. A practical ADR template with security fields, a worked example, and how to keep decisions honest against the system you actually run.

  • ADRs
  • architecture governance
  • risk acceptance