Threat Modeling: The Security Review Your Team Is Probably Skipping
Why building software without threat modeling is like leaving your front door unlocked, and how to fix it
Threat Modeling: The Security Review Your Team Is Probably Skipping

Why building software without threat modeling is like leaving your front door unlocked, and how to fix it
Every week, another data breach makes headlines. Another API exposed. Another token leaked. Another organization scrambling to patch a vulnerability that could have been caught before a single line of code was deployed, if only someone had stopped to ask the right questions.
The hard truth? Most of these incidents weren’t sophisticated zero-day attacks. They were the result of threats that were entirely predictable, threats that a structured threat modeling exercise would have surfaced during the design phase.
I’ve been doing threat modeling reviews for software systems at my organization, and this guide is the practical walkthrough I wish I had when I started. Whether you’re a developer, an architect, or a security-minded team lead, this one is for you.
What Is Threat Modeling, Really?
Threat modeling is the practice of systematically identifying, analyzing, and mitigating security risks in a software system, before those risks become real-world exploits.
Think of it as a structured “what could go wrong?” conversation about your system, anchored in its actual architecture. Not hypothetical, vague security concerns. Real, specific threats tied to real components.
Done well, it answers four fundamental questions:
- What are we building? (architecture and data flows)
- What can go wrong? (threats)
- What are we doing about it? (mitigations)
- Did we do a good job? (review and validation)
Why Bother? The Case for Making This a Standard Practice
Here’s something most teams don’t realize: fixing a security flaw during design costs roughly 10x less than fixing it after deployment, and 100x less than responding to an active breach.
Threat modeling also does something checklists and penetration tests can’t, it builds a shared mental model of your system’s attack surface across your entire team. Developers, architects, and security engineers end up speaking the same language.
Beyond cost savings, threat modeling helps you:
- Prioritize security work — not all threats are equal, and you shouldn’t treat them as such
- Document security decisions for future team members and auditors
- Satisfy compliance requirements in regulated industries
- Build security into the design, rather than bolting it on afterward
The STRIDE Framework: Your Threat Identification Toolkit
There are several threat modeling methodologies (PASTA, LINDDUN, VAST, and others), but STRIDE is the most widely adopted for good reason, it’s practical, memorable, and maps threats to concrete technical mitigations.
STRIDE is an acronym developed by Microsoft, where each letter represents a category of threat:
S — Spoofing
Can an attacker impersonate a legitimate user or system component?
Spoofing threats are about authentication failures. An attacker pretending to be a trusted API client, forging credentials, or hijacking a session are all spoofing threats.
Common mitigations: Strong authentication (OAuth 2.0, JWT with signature validation), mutual TLS, API key validation tied to organizational context.
Example question to ask: If someone obtained a valid-looking token, could they access resources that don’t belong to them?
T — Tampering
Can an attacker modify data in transit or at rest?
Tampering threats target data integrity. This includes modifying API request payloads, altering database records, or intercepting and changing messages between services.
Common mitigations: TLS encryption for data in transit, message signing, input validation, checksums, database integrity constraints.
Example question to ask: What happens if an attacker intercepts and modifies a payload between two internal services?
R — Repudiation
Can a user or system deny having performed an action?
Repudiation threats are about accountability. If a critical operation occurs with no audit trail, such as rotating an access token, deleting a resource, or modifying a policy, you have no way to prove who did it or when.
Common mitigations: Comprehensive audit logging for critical operations, tamper-evident log storage, log monitoring, including user IDs and timestamps in every audit event.
Example question to ask: If an administrator deletes a user account or changes a critical system setting, do we have enough audit information to trace exactly who made that change and when?
I — Information Disclosure
Can sensitive data be accessed by unauthorized parties?
This is one of the most commonly materialized threats. Information disclosure happens when secrets, tokens, PII, or internal system details are exposed through API responses, error messages, logs, or insecure storage.
Common mitigations: Never returning sensitive values in plain text in responses, hashing secrets at rest using strong algorithms with unique salts, ensuring error messages don’t leak internal stack traces, scrubbing logs of sensitive data.
Example question to ask: Does any API response contain a credential, token, or key that could be intercepted or stored by an unintended party?
D — Denial of Service
Can an attacker degrade or disable the service?
DoS threats are about availability. This includes flooding endpoints with requests, sending oversized payloads, triggering expensive operations repeatedly, or exhausting connection pools.
Common mitigations: Rate limiting at the gateway or API layer, payload size limits, resource quotas, autoscaling, circuit breakers.
Example question to ask: What happens if an attacker sends thousands of requests per second to this endpoint? Is there a rate limit?
E — Elevation of Privilege
Can a lower-privileged user gain access to higher-privileged operations?
Privilege escalation threats occur when authorization controls are missing, inconsistent, or only enforced at one layer of the system (e.g., only in the frontend but not the backend).
Common mitigations: Role-based access control (RBAC) enforced at every layer, scope validation at the API level AND at downstream services, principle of least privilege for all roles, entitlement matrices defining exactly who can do what.
Example question to ask: If a regular user crafts a direct API request bypassing the UI, can they perform admin-level operations?
How to Actually Run a Threat Modeling Session
Here’s a practical workflow that works well in real projects. You don’t need expensive tools, a whiteboard and a focused group are all you need to get started.
Step 1: Define the Scope
Be specific. Are you modeling a new feature? An integration? An entire service? Scope creep kills threat modeling sessions. Define what’s in scope and explicitly note what’s out of scope.
Step 2: Build an Architecture Diagram
Draw the system. Include:
- Actors — who interacts with the system (users, external services, internal services)
- Resources/Assets — the components that need protection (databases, APIs, message queues)
- Data flows — how data moves between components
- Trust boundaries — the lines where data crosses from a less-trusted to a more-trusted context (and vice versa)
Trust boundaries are where most interesting threats live. Every time data crosses a trust boundary, ask yourself: what could go wrong here?
Step 3: Define Actors and Their Permissions
Create an entitlement matrix, which is simply a table mapping each actor or role to each operation, with a clear Yes or No for whether they are allowed to perform it. This forces clarity and often reveals gaps in authorization design.

Step 4: Walk Through Each Interaction Using STRIDE
For every significant interaction in your system (especially those crossing trust boundaries), go through each STRIDE category and ask: is this threat possible here? Is it mitigated?
Document each threat with:
- Category (which STRIDE letter)
- Description (what specifically could happen)
- Materializable (is this actually exploitable given the current design — Yes/No)
- Mitigation (what prevents it, or what needs to be built)
Step 5: Classify Threats and Track Open Items
Not every threat is equally serious. Classify threats by whether they’re already mitigated, partially mitigated, or open. Open threats should become tracked issues in your project management tool with clear owners and deadlines.
Be explicit about accepted risks too. Sometimes a risk is real but the cost of mitigation outweighs the impact. That is a valid business decision, but it must be documented and acknowledged rather than silently ignored.
Step 6: Fill Out a Security Review Checklist
At the end of the exercise, go through a security checklist covering areas like:
- Input validation — are all inputs validated on the server side?
- Rate limiting — are sensitive endpoints protected?
- Authentication and authorization — enforced at every layer?
- Secrets management — are credentials stored securely, never in plain text?
- Audit logging — are critical operations logged with sufficient detail?
- Encryption — TLS in transit, encryption at rest?
- Vulnerability scanning — static analysis, dependency scanning, dynamic testing?
This checklist transforms the threat model from a one-time exercise into an ongoing quality gate.
Common Pitfalls to Avoid
Only modeling at the perimeter. Internal service-to-service communication carries real risk too. Model it.
Treating it as a one-time exercise. Threat models should be living documents. Revisit them when the architecture changes significantly.
Skipping the entitlement matrix. Privilege escalation vulnerabilities are embarrassingly common. A clear permissions matrix catches them early.
Not tracking open threats as issues. A threat identified but not tracked is a threat that will be forgotten.
Only doing it for brand-new systems. Legacy systems often have the most accumulated risk. Retrofitting a threat model onto an existing system is challenging but valuable.
Enforcing controls only at one layer. A common pattern is validating authorization in the API gateway but not in downstream microservices. If someone bypasses the gateway, they have unrestricted access. Enforce controls at every layer.
Where to Start If You’ve Never Done This Before
If threat modeling is new to your team, here’s a minimal first step: pick one feature currently in design, draw its architecture diagram, and spend two hours walking through STRIDE as a team.
You don’t need to be a security expert to start. You need to be someone who asks “what could go wrong here?” with genuine curiosity and enough architectural context to answer it.
Final Thoughts
Software systems are more interconnected, more exposed, and more targeted than ever. The good news is that most successful attacks exploit predictable, well-understood vulnerability patterns, and those are exactly the patterns that STRIDE is designed to surface.
Threat modeling is not a guarantee of perfect security. It won’t catch every vulnerability. But it will make you think like an attacker before you ship, and that shift in perspective is one of the most valuable things you can build into your development culture.
The question isn’t whether your system has security risks. It does. The question is whether you’ve looked for them.
Start looking.
If you found this useful, consider sharing it with your team. Security is a team sport — the more people thinking about it, the better.
메타데이터
- post_id
- e18c2d3aeba1
- slug
- threat-modeling-the-security-review-your-team-is-probably-skipping-e18c2d3aeba1
- url
- https://medium.com/@swenushika/threat-modeling-the-security-review-your-team-is-probably-skipping-e18c2d3aeba1
- canonical_url
- https://medium.com/@swenushika/threat-modeling-the-security-review-your-team-is-probably-skipping-e18c2d3aeba1
- author_url
- https://medium.com/@swenushika
- status
- ok
- fetched_at
- 2026-07-14 12:12:17