Skip to content
Categoria: OPSEC10 min read

Threat Modeling with STRIDE for Real Systems

Por Lucas Andrade ·

A practical, defence-first guide to applying the STRIDE threat modeling framework to real production systems, with detection signals and hardening controls.

In this article

Threat modeling is the discipline of thinking about how a system can fail under an adversary before that adversary does the thinking for you. STRIDE, a mnemonic that Microsoft popularised in the early 2000s, remains one of the most durable ways to structure that thinking because it maps neatly onto the properties a defender actually cares about. This article walks through STRIDE from a blue-team perspective: how to run a modeling session on a real production system, how each category maps to concrete detection signals, and how to turn the findings into hardening work that survives contact with a running environment. The goal is not to produce a beautiful diagram that decorates a wiki, but to change what you monitor and what you build. Framed defensively, threat modeling is less about predicting a specific attacker and more about systematically enumerating the ways your own design can betray its security properties, so that you can close or watch each one before it matters.

What STRIDE actually stands for#

STRIDE is an acronym for six categories of threat: Spoofing (pretending to be someone or something you are not), Tampering (unauthorised modification of data or code), Repudiation (denying an action without the system being able to prove otherwise), Information disclosure (exposure of data to parties who should not see it), Denial of service (degrading or removing availability), and Elevation of privilege (gaining capabilities beyond what was granted). Each category is the mirror image of a security property you want to preserve: authentication, integrity, non-repudiation, confidentiality, availability, and authorisation. That symmetry is what makes STRIDE useful. When you find a threat, you already know which property it attacks and therefore which class of control defends it.

How a modeling session works in practice#

A useful session starts with a data-flow diagram, not a network diagram. You draw the external entities (users, third-party services), the processes (your services and workers), the data stores (databases, caches, object storage), and the flows between them. Then you draw trust boundaries: the lines a request crosses when it moves from a less-trusted zone to a more-trusted one, such as the edge between the public internet and your gateway, or between a tenant-facing API and an internal service. Trust boundaries are where STRIDE earns its keep, because almost every interesting threat lives on a boundary crossing. For each element and each flow, you ask which of the six categories apply and record the answer as a concrete, testable statement rather than a vague worry.

Applying the categories to a boundary crossing#

Consider a request arriving at an authenticated API endpoint. Spoofing asks whether an attacker can present a token that is not theirs; the defence is full token validation including signature, expiry, audience, issuer, and an algorithm allowlist. Tampering asks whether the request body or a stored record can be altered outside the rules; the defence is server-side validation and parameterised persistence. Repudiation asks whether you could later prove who did what; the defence is an append-only audit log with a trace identifier. Information disclosure asks whether error messages, verbose responses, or cross-tenant reads leak data; Denial of service asks whether an unbounded body or expensive query can exhaust resources; and Elevation of privilege asks whether a low-privilege caller can reach a high-privilege action, the classic root of authorisation bugs such as insecure direct object references.

Attack surface and where to focus#

Not every element deserves equal attention. The highest-value targets are trust boundaries that separate tenants, boundaries that separate unauthenticated from authenticated traffic, and any process that holds a secret or can act on behalf of others. In multi-tenant systems the single most valuable question is whether a tenant identifier is ever taken from client-controlled input rather than a verified token, because a single such flaw collapses the entire isolation model. Focus your modeling budget on the flows that carry identity and authorisation decisions, and treat purely internal, single-trust-zone flows as lower priority unless they touch secrets or bulk data.

Detection signals mapped to STRIDE#

Threat modeling is only defensive if it changes your telemetry. Spoofing maps to authentication logs: repeated token-validation failures, tokens presented after expiry, and logins from improbable geographies. Tampering maps to integrity monitoring: file-integrity checks on binaries and configuration, database triggers or audit columns that flag out-of-band modification, and checksum mismatches. Repudiation maps directly to the completeness of your audit log; a gap in the log is itself a signal. Information disclosure maps to egress monitoring and to alerts on unusually large or unusually broad query results. Denial of service maps to latency, saturation, and error-rate dashboards. Elevation of privilege maps to authorisation-denied events and, crucially, to authorisation-granted events for sensitive actions, which should be rare enough to review.

Mitigation and hardening controls#

Each STRIDE category has a well-understood family of controls. Against spoofing: strong authentication, multi-factor for humans, mutual TLS or signed requests between services, and short-lived credentials. Against tampering: input validation on the server, parameterised queries, code signing, and immutable infrastructure. Against repudiation: centralised, tamper-evident logging with synchronised clocks. Against information disclosure: encryption in transit and at rest, least-privilege data access, redaction of internal error detail before it reaches a client, and careful review of anything a 5xx response returns. Against denial of service: request-size caps, pagination limits, timeouts on every outbound call, bounded queues, and rate limiting at the edge. Against elevation of privilege: authorisation decided on the server from verified identity, deny-by-default policies, and object-level checks on every by-id route.

Common pitfalls that hollow out a threat model#

The first pitfall is modeling the architecture you wish you had rather than the one that is deployed; verify on the running system, not the design document, because drift is universal. The second is stopping at the diagram and never converting threats into tracked work with owners and due dates. The third is treating STRIDE as a checklist to be completed once, when it should be revisited whenever a new trust boundary appears, such as a new integration or a new tenant tier. The fourth is over-modeling low-value internal flows while under-modeling the authentication and authorisation paths that actually decide who can do what. The fifth is confusing likelihood with severity and ignoring high-impact, low-likelihood threats such as a compromised build pipeline.

A repeatable checklist#

Run your session against this sequence. Draw the data-flow diagram from reality. Mark every trust boundary. For each boundary crossing, walk all six STRIDE categories and write a testable threat statement. Rate each threat by impact and likelihood. For each accepted threat, name a control and, separately, a detection signal, because a control you cannot observe failing is a control you cannot trust. Assign an owner and a ticket. Finally, feed the detection signals into your monitoring so that the model produces alerts, not just documents. Re-run the whole loop whenever the boundary map changes.

Combining STRIDE with risk scoring#

STRIDE enumerates threats but does not rank them, and an unordered list overwhelms any team. Pair the enumeration with a simple, consistent score for impact and likelihood so that scarce engineering time goes to the most dangerous items first. Historical schemes such as DREAD are a starting point, but what matters more than the exact formula is that every rater applies the same criteria and records the reasoning. Keep impact and likelihood cleanly separate: a compromised build pipeline is rare but catastrophic, and must not be dismissed simply because it seems unlikely. Anchor the score to observable facts — does the threat cross a trust boundary, does it touch tenant data, does it bypass authentication — rather than to intuition. The result is an ordered ranking that supports a decision: mitigate, monitor, or knowingly accept, each with a named owner. Without this step the model remains a collection of equally weighted worries from which no one can tell what to fix first, and it quietly loses the authority to drive work.

Embedding threat modeling in the development lifecycle#

A threat model produced only at a big design review is stale the moment the next pull request adds a route. The defensive target state is to make modeling small and continuous rather than large and rare. Bake a lightweight question into the review of any change that touches a trust boundary: does this code introduce a new external input, a new service call, or a new authorization decision, and if so, which of the six STRIDE questions changes as a result? Keep the data-flow diagram as a versioned artifact next to the code, so a new integration updates the boundary map in the same pull request that ships it. Add automated checks where you can — linters for missing authorization, tests that reject cross-tenant reads — so recurring classes are not rediscovered by hand at every session. That way threat modeling shifts from a milestone to a habit and stays aligned with the system as it actually grows, rather than with how it was drawn once at the start.

FAQ: Is STRIDE still relevant for cloud-native and microservice systems?#

Yes, arguably more so. Microservice architectures multiply trust boundaries because every inter-service call is a potential crossing, and STRIDE gives you a consistent way to reason about each one. The framework is transport-agnostic: whether a boundary is crossed by an HTTP call, a message on a queue, or a gRPC stream, the same six questions apply. What changes in cloud-native environments is the volume of boundaries, which is an argument for automating parts of the process, such as generating a baseline data-flow diagram from service metadata.

FAQ: How is STRIDE different from attack trees or the kill chain?#

STRIDE is a categorisation framework that helps you enumerate threats comprehensively against a system model; it answers the question of what can go wrong. Attack trees decompose a single attacker goal into steps and are better for depth on a specific objective. The cyber kill chain and MITRE ATT&CK describe adversary behaviour across a campaign and are better for organising detection engineering. These are complementary: use STRIDE during design to find the threats, ATT&CK during operations to organise how you detect the techniques that realise them, and attack trees when you need to reason deeply about one high-value target.

Conclusion#

STRIDE endures because it is simple enough to run in a room and rigorous enough to change what you build and monitor. Its power comes from the mapping between each threat category and both a control and a detection signal, which turns an abstract modeling exercise into concrete blue-team work. Model the system that is actually deployed, focus on the trust boundaries that carry identity and authorisation, and insist that every accepted threat produce something observable. Keep the artefact lightweight and current rather than exhaustive and stale, because a short model that engineers actually consult beats a comprehensive one that no one opens. Treat the output as a living contract between design and detection, revisited whenever the architecture shifts. Done this way, threat modeling stops being a compliance ritual and becomes the mechanism by which your defences stay ahead of the way your system is actually built.

Related posts

Nenhum comentário ainda

Seja o primeiro a comentar.

Deixe seu comentário

Entre com sua conta Canverly para comentar. Você pode usar a mesma conta em qualquer site da rede.

Entrar com Canverly