Threat modeling for consequential systems

Practice · Threat Modeling

A threat model written at design time is a design input, not an after-the-fact explanation: its six questions are asked of 100% of trust boundaries, and every threat with a plausible path to patient harm becomes a hazard entry in the ISO 14971 risk management file.

Why should threat modeling happen at design time?

A threat model written at design time is a design input, not an after-the-fact explanation. Every threat with a plausible path to patient harm becomes a hazard entry in the ISO 14971 risk management file.

A threat model written after the system is built is an explanation of what was already decided. A threat model written at design time is a design input — it changes what gets built, not just what gets documented about it afterward. The difference is entirely about when the exercise happens, not how sophisticated the diagram is.

Threat modeling at design time, not audit time

A threat model produced to satisfy an audit checklist, after architecture decisions are already locked in, can only explain those decisions — it has no power to change them. Run at design time, against a specific system boundary, the same exercise surfaces mitigations that are cheap to design in and expensive to retrofit later.

A systematic elicitation frame

Six questions, asked of every trust boundary in the system, not just the obvious ones:

CategoryQuestion it forcesExample mitigation
SpoofingCan an actor convincingly claim to be someone or something they're not?Mutual TLS, signed and verified tokens
TamperingCan data be modified in transit or at rest without detection?HMAC signatures, write-ahead-log checksums
RepudiationCan an actor deny taking an action, with no way to prove otherwise?An immutable, non-repudiable audit log
Information disclosureCan data reach someone who shouldn't see it?Encryption at rest and in transit, least-privilege access
Denial of serviceCan an actor make the system unavailable to legitimate users?Rate limiting, bounded resource quotas
Elevation of privilegeCan a low-privilege actor gain higher privilege?Authorization checked at every boundary, not only at login

From threat model to risk management file

Not every identified threat is a safety hazard, but every threat with a plausible path to patient or operational harm belongs in the MedTech risk management file as a hazard entry — see ISO 14971:2019. A threat model that never crosses into the risk file has identified problems nobody is formally tracking.

A worked boundary example

A minimal worked example, from this site's own magic-link sign-in boundary:

Boundary: magic-link verification endpoint
Threat: token replay (Tampering / Spoofing) — a captured verification
    URL reused after the legitimate sign-in already completed
Mitigation: token is single-use (consumption is atomic with the
    session-creation write), signed with an HMAC key the client never
    sees, and expires in under 15 minutes
Residual risk: a token captured and replayed within the TTL, before
    first use — accepted, given the delivery channel (email) and the
    short window

Engineering reference only. Not a complete security assessment — a real threat model requires walking your own system's actual boundaries, not substituting this page's example for that work.

Provenance & review state

Last reviewed
Sources
  • NIST SP 800-154 (Draft), Guide to Data-Centric System Threat Modeling — National Institute of Standards and Technology
  • ISO 14971:2019 — International Organization for Standardization
Ingested from

Sign in or sign up

Enter your work email to receive a temporary sign-in link.

By continuing, you agree to our Terms of Service and Privacy Policy.