Security Threat Model Skill

Write a STRIDE-based threat model for a service or feature.

Security Threat Model Skill — The Skill Playground: pick the Executive Update skill, fill in a few notes, hit run, and watch a structured executive… (from the mohitagw15856/pm-claude-skills README)

From the mohitagw15856/pm-claude-skills README — shows the whole collection, not only this skill. · view on GitHub

How to use it

Claude Code
  1. Run the line below. It pulls the whole folder into ~/.claude/skills/security-threat-model.
  2. Describe your job in plain words. Claude Code follows the skill from there.
Claude Code — installs the whole folder, not just SKILL.md
npx degit mohitagw15856/pm-claude-skills/skills/security-threat-model#main ~/.claude/skills/security-threat-model

For one project only, change the path to .claude/skills/security-threat-model.

Claude (web or desktop app)
  1. On this page open ⋯ → Download .md.
  2. Save it as SKILL.md in a folder, zip the folder, then Customize → Skills → + → Create skill → Upload a skill.
  3. Pick the file and Save. Claude shows the name and description and runs a security scan.
  4. Check the skill is switched on.
  5. Start a new chat and describe your job in plain words. The AI follows the skill from there.
ChatGPT or another app
  1. ChatGPT: make a Project and paste it into Instructions.
  2. Neither? Paste it at the top of a new chat — it works for that chat.
Not working?
  • Check which app you pasted it into — the steps above name the right one.
  • Some skills need the paid tier of Claude or ChatGPT.
Step-by-step guide with screenshots · Ask in the forum

Paste into Claude, ChatGPT or Cursor.

Source of Security Threat Model Skill

Show the full text264 lines
namedescriptiondeprecatedsupersededBy
security-threat-modelWrite a STRIDE-based threat model for a service or feature. Use when asked to produce a threat model, document security risks, identify attack vectors, assess a service's security posture, or prepare for a security design review. Produces a structured threat model covering assets, trust boundaries, STRIDE threat enumeration per component, risk scores, mitigation controls, and residual risk sign-off.2026-08-21threat-model

Security Threat Model Skill

Produce a complete STRIDE-based threat model for a service or feature. A threat model is not a list of things that could go wrong — it is a structured analysis of attackers, assets, boundaries, and controls that lets an engineering team make informed, documented security decisions.

A good threat model is specific enough that a new engineer can understand what is being protected, why each control exists, and what risk the team has accepted.

Required Inputs

Ask for these if not already provided:

  • Service name and description — what the service does, who uses it
  • Architecture overview — components, dependencies, data flows (a diagram description or ASCII diagram is fine)
  • Deployment environment — cloud provider, VPC/network topology, where it runs (Kubernetes, ECS, VMs, serverless)
  • Data sensitivity — what data does this service handle? PII, payment data, credentials, internal-only?
  • Existing controls — authentication method, encryption in transit/at rest, current WAF/firewall, existing security scanning
  • Trust levels — who are the principals? (anonymous public, authenticated users, internal services, admins)

Output Format


Security Threat Model: [Service Name]

Service: [Name] | Team: [Team name] Author: [Name] | Reviewed by: [Security lead / peer] Date: [Date] | Next review: [Date — recommend 6 months or after major architecture change] Classification: [Internal / Confidential]


1. Overview

[2–3 sentences describing the service, its role in the system, and the scope of this threat model. State what is in scope and what is explicitly out of scope.]

In scope:

  • [Component or data flow]
  • [Component or data flow]

Out of scope:

  • [e.g. Third-party payment processor internals]
  • [e.g. Corporate network / end-user devices]

2. Asset Register

Assets are the things worth protecting — data, capabilities, and reputational value.

Asset Description Sensitivity Owner
[e.g. User PII] Names, email addresses, profile data High — GDPR-regulated [Team]
[e.g. API credentials] Service-to-service auth tokens Critical [Team]
[e.g. Session tokens] User authentication state High [Team]
[e.g. Audit logs] Record of user and admin actions Medium [Team]
[e.g. Service availability] Uptime of the [X] endpoint Medium [Team]

Data classification key:

  • Critical — Credential material; exposure enables direct system compromise
  • High — PII, financial data, health data; regulated or high reputational impact
  • Medium — Internal configuration, non-sensitive business data
  • Low — Public information, anonymised data

3. Trust Boundaries and Architecture

Trust boundaries are the lines that separate zones with different trust levels. Threats often occur when data or requests cross a boundary.

  ┌─────────────────────────────────────────────────────────────────┐
  │  INTERNET (Untrusted)                                           │
  │                                                                 │
  │   [Public User]          [Bot / Attacker]                       │
  └──────────────────────────────┬──────────────────────────────────┘
                                 │ HTTPS
                    ─ ─ ─ ─ ─ ─ ─│─ ─ ─ ─ ─ ─ ─ ─
                    Trust Boundary: Public → DMZ
                    ─ ─ ─ ─ ─ ─ ─│─ ─ ─ ─ ─ ─ ─ ─
                                 ▼
  ┌──────────────────────────────────────────────────────────────────┐
  │  DMZ / Edge Layer                                                │
  │   ┌────────────┐     ┌──────────────┐                           │
  │   │  WAF / CDN │────▶│  API Gateway │                           │
  │   └────────────┘     └──────┬───────┘                           │
  └──────────────────────────────┼───────────────────────────────────┘
                    ─ ─ ─ ─ ─ ─ ─│─ ─ ─ ─ ─ ─ ─ ─
                    Trust Boundary: Edge → Application VPC
                    ─ ─ ─ ─ ─ ─ ─│─ ─ ─ ─ ─ ─ ─ ─
                                 ▼
  ┌──────────────────────────────────────────────────────────────────┐
  │  Application VPC (Private)                                       │
  │   ┌──────────────┐     ┌────────────┐     ┌──────────────────┐  │
  │   │  [Service A] │────▶│ [Service B]│────▶│  [Database]      │  │
  │   └──────────────┘     └────────────┘     └──────────────────┘  │
  │                                ▲                                  │
  │                                │                                  │
  │   ┌──────────────┐             │                                  │
  │   │  Admin (IAM) │─────────────┘                                 │
  └──────────────────────────────────────────────────────────────────┘

Trust Boundaries identified:

Boundary From To Auth mechanism Encrypted
TB-1 Public internet API Gateway [JWT / OAuth / API key] TLS 1.2+
TB-2 API Gateway Service A [mTLS / internal JWT / IAM role] [Yes/No]
TB-3 Service A Database [Connection string + IAM / username+password] [Yes/No]
TB-4 Admin Service B [IAM role / VPN + MFA] TLS

4. STRIDE Threat Analysis

STRIDE is a threat classification framework. For each significant component, enumerate threats in each category.

STRIDE key:

  • S — Spoofing: Impersonating another user, service, or system
  • T — Tampering: Modifying data or code without authorisation
  • R — Repudiation: Denying an action occurred; insufficient audit trail
  • I — Information Disclosure: Exposing data to unauthorised parties
  • D — Denial of Service: Making the service unavailable
  • E — Elevation of Privilege: Gaining capabilities beyond what is authorised
Component: [API Gateway / Auth Layer]
ID Category Threat Attack vector Existing control
T-001 S Attacker forges a JWT token to authenticate as another user Weak signing key or algorithm confusion (alg:none) [e.g. RS256 with key rotation / none]
T-002 S Attacker replays a stolen session token Theft via XSS or network sniff [e.g. Token expiry + refresh rotation]
T-003 T Attacker modifies request headers to bypass tenant isolation Missing validation of tenant ID header [e.g. Server-side tenant resolution / none]
T-004 R No audit trail for admin authentication events Logging not configured for auth failures [e.g. CloudTrail enabled / none]
T-005 I Auth error messages reveal whether an email exists Verbose error responses [e.g. Normalised error responses / none]
T-006 D Credential stuffing exhausts rate limits and blocks legitimate users Automated login attempts [e.g. Rate limiting per IP + CAPTCHA / none]
T-007 E Compromised low-privilege token used to call admin endpoint Missing role check on admin routes [e.g. RBAC middleware on all routes / none]
Component: [Application Service / Business Logic]
ID Category Threat Attack vector Existing control
T-008 T SQL/NoSQL injection via unsanitised user input Unparameterised queries [e.g. ORM with parameterised queries / none]
T-009 T Mass assignment — attacker sets fields they should not (e.g. isAdmin: true) API accepts extra fields without allowlist [e.g. Input validation / none]
T-010 I Insecure direct object reference — user accesses another user's resource Missing ownership check on resource ID [e.g. Ownership middleware / none]
T-011 I Sensitive data in application logs (PII, tokens) Over-logging in debug mode [e.g. Log scrubbing / none]
T-012 D Unprotected expensive endpoint triggers large DB scan No pagination or query cost limit [e.g. Pagination enforced / none]
T-013 R Business-critical state changes not logged No audit event on [operation] [e.g. Audit log table / none]
Component: [Database]
ID Category Threat Attack vector Existing control
T-014 I Database exposed to internet (misconfigured security group) Direct connection from outside VPC [e.g. No public IP, security group restricts to app subnet]
T-015 I Backup snapshots not encrypted or accessible to wrong accounts Unencrypted snapshot, public S3 [e.g. Encrypted snapshots, private S3 bucket]
T-016 T Privilege escalation via DB account with excessive permissions App uses a superuser DB account [e.g. Least-privilege DB role per service / none]
T-017 D Runaway query or bulk delete causes data loss or outage No query timeout or soft-delete [e.g. Statement timeout, soft-delete on critical tables / none]
Component: [Internal Service-to-Service Communication]
ID Category Threat Attack vector Existing control
T-018 S Rogue internal service impersonates a trusted service No mutual authentication between services [e.g. mTLS / service mesh / none]
T-019 I Internal traffic sniffed on shared network Unencrypted service-to-service calls [e.g. Service mesh with TLS / none]
T-020 E Compromised internal service calls privileged endpoints No scoping on internal tokens [e.g. Scoped service tokens / none]

5. Risk Register

Score each threat: Likelihood (1–5) × Impact (1–5) = Risk Score (1–25)

Priority bands: Critical (20–25) | High (12–19) | Medium (6–11) | Low (1–5)

ID Threat summary Likelihood Impact Score Priority Status
T-001 JWT forgery — auth bypass 2 5 10 Medium [Open / Mitigated / Accepted]
T-002 Session token replay 3 4 12 High [Open / Mitigated / Accepted]
T-007 Privilege escalation via missing role check 3 5 15 High [Open / Mitigated / Accepted]
T-008 SQL injection 2 5 10 Medium [Open / Mitigated / Accepted]
T-010 IDOR — cross-user data access 3 4 12 High [Open / Mitigated / Accepted]
T-014 Database exposed to internet 1 5 5 Low [Open / Mitigated / Accepted]
T-018 Rogue internal service impersonation 2 4 8 Medium [Open / Mitigated / Accepted]

6. Mitigations Table

For every Open threat with priority Medium or above, define a specific mitigation.

ID Threat Mitigation Owner Target date Ticket
T-002 Session token replay Implement token rotation on refresh — invalidate old token server-side immediately [Engineer name] [Date] [JIRA-123]
T-007 Privilege escalation Add RBAC middleware to all /admin/* routes; write integration test for role boundary [Engineer name] [Date] [JIRA-124]
T-010 IDOR Add ownership assertion to all resource-fetching service methods; add to code review checklist [Engineer name] [Date] [JIRA-125]
T-011 PII in logs Audit logging calls for PII fields; add scrubbing to logger middleware [Engineer name] [Date] [JIRA-126]
T-018 Rogue service impersonation Enable mTLS via service mesh or issue scoped service tokens per service [Engineer name] [Date] [JIRA-127]

7. Accepted Risks

Accepted risks are threats the team has decided not to mitigate right now. Every accepted risk must have a named owner and a review date.

ID Threat Reason for acceptance Risk owner Review date
T-014 Database public exposure Database has no public IP assigned; control already in place — accepted as low likelihood [Name] [Date]
[ID] [Threat] [Reason — e.g. "Effort exceeds risk at current scale; re-evaluate at 10× traffic"] [Name] [Date]

8. Security Controls Summary

Control Type Covers threats Implemented
JWT RS256 with 15-min expiry Preventive T-001, T-002 [Yes / Partial / No]
RBAC middleware on all routes Preventive T-007, T-020 [Yes / Partial / No]
Parameterised queries (ORM) Preventive T-008 [Yes / Partial / No]
Rate limiting (100 req/min per IP) Preventive T-006, T-012 [Yes / Partial / No]
CloudTrail / audit logging Detective T-004, T-013 [Yes / Partial / No]
Automated SAST in CI pipeline Detective T-008, T-009 [Yes / Partial / No]
Encrypted backups + private S3 Preventive T-015 [Yes / Partial / No]
Least-privilege DB role Preventive T-016 [Yes / Partial / No]
Incident response runbook Corrective All [Yes / Partial / No]

9. Review Cadence

Trigger Action
Every 6 months Full threat model review — update risk scores, close mitigated items
Major architecture change Update trust boundary diagram and re-run STRIDE for new components
Security incident Review relevant threats; add any newly discovered vectors
New data classification Add assets to register; assess whether new STRIDE categories apply
Third-party dependency added Assess supply chain threats for the new dependency

Next scheduled review: [Date] Review owner: [Name / Security lead]


Quality Checks

  • Every trust boundary is named and its authentication mechanism is specified — not left as "TBD"
  • Every Critical and High risk in the risk register has a mitigation with a named owner and a target date
  • Every accepted risk has a named risk owner and a review date — no unowned accepted risks
  • The asset register includes data sensitivity levels and at least one entry for credential material
  • STRIDE analysis covers all major components — not just the API layer
  • Mitigation actions are specific enough to become a ticket (not "improve security")
  • The ASCII trust boundary diagram matches the architecture description provided

Anti-Patterns

  • Do not restrict STRIDE analysis to only the API layer — threats exist at every component including the database and internal services
  • Do not leave mitigations as vague directives like "improve security" — every mitigation must be specific enough to become a ticket
  • Do not accept risks without a named owner and a review date — unowned accepted risks are not managed risks
  • Do not write a threat model that covers only theoretical threats — prioritise by likelihood and impact using the risk register
  • Do not omit the asset register — without knowing what is being protected, the STRIDE analysis has no anchor
1---
2name: security-threat-model
3description: "Write a STRIDE-based threat model for a service or feature. Use when asked to produce a threat model, document security risks, identify attack vectors, assess a service's security posture, or prepare for a security design review. Produces a structured threat model covering assets, trust boundaries, STRIDE threat enumeration per component, risk scores, mitigation controls, and residual risk sign-off."
4deprecated: 2026-08-21
5supersededBy: threat-model
6---
7 
8# Security Threat Model Skill
9 
10Produce a complete STRIDE-based threat model for a service or feature. A threat model is not a list of things that could go wrong — it is a structured analysis of attackers, assets, boundaries, and controls that lets an engineering team make informed, documented security decisions.
11 
12A good threat model is specific enough that a new engineer can understand what is being protected, why each control exists, and what risk the team has accepted.
13 
14## Required Inputs
15 
16Ask for these if not already provided:
17- **Service name and description** — what the service does, who uses it
18- **Architecture overview** — components, dependencies, data flows (a diagram description or ASCII diagram is fine)
19- **Deployment environment** — cloud provider, VPC/network topology, where it runs (Kubernetes, ECS, VMs, serverless)
20- **Data sensitivity** — what data does this service handle? PII, payment data, credentials, internal-only?
21- **Existing controls** — authentication method, encryption in transit/at rest, current WAF/firewall, existing security scanning
22- **Trust levels** — who are the principals? (anonymous public, authenticated users, internal services, admins)
23 
24## Output Format
25 
26---
27 
28# Security Threat Model: [Service Name]
29 
30**Service:** [Name] | **Team:** [Team name]
31**Author:** [Name] | **Reviewed by:** [Security lead / peer]
32**Date:** [Date] | **Next review:** [Date — recommend 6 months or after major architecture change]
33**Classification:** [Internal / Confidential]
34 
35---
36 
37## 1. Overview
38 
39[2–3 sentences describing the service, its role in the system, and the scope of this threat model. State what is in scope and what is explicitly out of scope.]
40 
41**In scope:**
42- [Component or data flow]
43- [Component or data flow]
44 
45**Out of scope:**
46- [e.g. Third-party payment processor internals]
47- [e.g. Corporate network / end-user devices]
48 
49---
50 
51## 2. Asset Register
52 
53Assets are the things worth protecting — data, capabilities, and reputational value.
54 
55| Asset | Description | Sensitivity | Owner |
56|---|---|---|---|
57| [e.g. User PII] | Names, email addresses, profile data | High — GDPR-regulated | [Team] |
58| [e.g. API credentials] | Service-to-service auth tokens | Critical | [Team] |
59| [e.g. Session tokens] | User authentication state | High | [Team] |
60| [e.g. Audit logs] | Record of user and admin actions | Medium | [Team] |
61| [e.g. Service availability] | Uptime of the [X] endpoint | Medium | [Team] |
62 
63**Data classification key:**
64- **Critical** — Credential material; exposure enables direct system compromise
65- **High** — PII, financial data, health data; regulated or high reputational impact
66- **Medium** — Internal configuration, non-sensitive business data
67- **Low** — Public information, anonymised data
68 
69---
70 
71## 3. Trust Boundaries and Architecture
72 
73Trust boundaries are the lines that separate zones with different trust levels. Threats often occur when data or requests cross a boundary.
74 
75```
76 ┌─────────────────────────────────────────────────────────────────┐
77 │ INTERNET (Untrusted) │
78 │ │
79 │ [Public User] [Bot / Attacker] │
80 └──────────────────────────────┬──────────────────────────────────┘
81 │ HTTPS
82 ─ ─ ─ ─ ─ ─ ─│─ ─ ─ ─ ─ ─ ─ ─
83 Trust Boundary: Public → DMZ
84 ─ ─ ─ ─ ─ ─ ─│─ ─ ─ ─ ─ ─ ─ ─
85 ▼
86 ┌──────────────────────────────────────────────────────────────────┐
87 │ DMZ / Edge Layer │
88 │ ┌────────────┐ ┌──────────────┐ │
89 │ │ WAF / CDN │────▶│ API Gateway │ │
90 │ └────────────┘ └──────┬───────┘ │
91 └──────────────────────────────┼───────────────────────────────────┘
92 ─ ─ ─ ─ ─ ─ ─│─ ─ ─ ─ ─ ─ ─ ─
93 Trust Boundary: Edge → Application VPC
94 ─ ─ ─ ─ ─ ─ ─│─ ─ ─ ─ ─ ─ ─ ─
95 ▼
96 ┌──────────────────────────────────────────────────────────────────┐
97 │ Application VPC (Private) │
98 │ ┌──────────────┐ ┌────────────┐ ┌──────────────────┐ │
99 │ │ [Service A] │────▶│ [Service B]│────▶│ [Database] │ │
100 │ └──────────────┘ └────────────┘ └──────────────────┘ │
101 │ ▲ │
102 │ │ │
103 │ ┌──────────────┐ │ │
104 │ │ Admin (IAM) │─────────────┘ │
105 └──────────────────────────────────────────────────────────────────┘
106```
107 
108**Trust Boundaries identified:**
109 
110| Boundary | From | To | Auth mechanism | Encrypted |
111|---|---|---|---|---|
112| TB-1 | Public internet | API Gateway | [JWT / OAuth / API key] | TLS 1.2+ |
113| TB-2 | API Gateway | Service A | [mTLS / internal JWT / IAM role] | [Yes/No] |
114| TB-3 | Service A | Database | [Connection string + IAM / username+password] | [Yes/No] |
115| TB-4 | Admin | Service B | [IAM role / VPN + MFA] | TLS |
116 
117---
118 
119## 4. STRIDE Threat Analysis
120 
121STRIDE is a threat classification framework. For each significant component, enumerate threats in each category.
122 
123**STRIDE key:**
124- **S** — Spoofing: Impersonating another user, service, or system
125- **T** — Tampering: Modifying data or code without authorisation
126- **R** — Repudiation: Denying an action occurred; insufficient audit trail
127- **I** — Information Disclosure: Exposing data to unauthorised parties
128- **D** — Denial of Service: Making the service unavailable
129- **E** — Elevation of Privilege: Gaining capabilities beyond what is authorised
130 
131### Component: [API Gateway / Auth Layer]
132 
133| ID | Category | Threat | Attack vector | Existing control |
134|---|---|---|---|---|
135| T-001 | S | Attacker forges a JWT token to authenticate as another user | Weak signing key or algorithm confusion (alg:none) | [e.g. RS256 with key rotation / none] |
136| T-002 | S | Attacker replays a stolen session token | Theft via XSS or network sniff | [e.g. Token expiry + refresh rotation] |
137| T-003 | T | Attacker modifies request headers to bypass tenant isolation | Missing validation of tenant ID header | [e.g. Server-side tenant resolution / none] |
138| T-004 | R | No audit trail for admin authentication events | Logging not configured for auth failures | [e.g. CloudTrail enabled / none] |
139| T-005 | I | Auth error messages reveal whether an email exists | Verbose error responses | [e.g. Normalised error responses / none] |
140| T-006 | D | Credential stuffing exhausts rate limits and blocks legitimate users | Automated login attempts | [e.g. Rate limiting per IP + CAPTCHA / none] |
141| T-007 | E | Compromised low-privilege token used to call admin endpoint | Missing role check on admin routes | [e.g. RBAC middleware on all routes / none] |
142 
143### Component: [Application Service / Business Logic]
144 
145| ID | Category | Threat | Attack vector | Existing control |
146|---|---|---|---|---|
147| T-008 | T | SQL/NoSQL injection via unsanitised user input | Unparameterised queries | [e.g. ORM with parameterised queries / none] |
148| T-009 | T | Mass assignment — attacker sets fields they should not (e.g. `isAdmin: true`) | API accepts extra fields without allowlist | [e.g. Input validation / none] |
149| T-010 | I | Insecure direct object reference — user accesses another user's resource | Missing ownership check on resource ID | [e.g. Ownership middleware / none] |
150| T-011 | I | Sensitive data in application logs (PII, tokens) | Over-logging in debug mode | [e.g. Log scrubbing / none] |
151| T-012 | D | Unprotected expensive endpoint triggers large DB scan | No pagination or query cost limit | [e.g. Pagination enforced / none] |
152| T-013 | R | Business-critical state changes not logged | No audit event on [operation] | [e.g. Audit log table / none] |
153 
154### Component: [Database]
155 
156| ID | Category | Threat | Attack vector | Existing control |
157|---|---|---|---|---|
158| T-014 | I | Database exposed to internet (misconfigured security group) | Direct connection from outside VPC | [e.g. No public IP, security group restricts to app subnet] |
159| T-015 | I | Backup snapshots not encrypted or accessible to wrong accounts | Unencrypted snapshot, public S3 | [e.g. Encrypted snapshots, private S3 bucket] |
160| T-016 | T | Privilege escalation via DB account with excessive permissions | App uses a superuser DB account | [e.g. Least-privilege DB role per service / none] |
161| T-017 | D | Runaway query or bulk delete causes data loss or outage | No query timeout or soft-delete | [e.g. Statement timeout, soft-delete on critical tables / none] |
162 
163### Component: [Internal Service-to-Service Communication]
164 
165| ID | Category | Threat | Attack vector | Existing control |
166|---|---|---|---|---|
167| T-018 | S | Rogue internal service impersonates a trusted service | No mutual authentication between services | [e.g. mTLS / service mesh / none] |
168| T-019 | I | Internal traffic sniffed on shared network | Unencrypted service-to-service calls | [e.g. Service mesh with TLS / none] |
169| T-020 | E | Compromised internal service calls privileged endpoints | No scoping on internal tokens | [e.g. Scoped service tokens / none] |
170 
171---
172 
173## 5. Risk Register
174 
175Score each threat: **Likelihood (1–5)** × **Impact (1–5)** = **Risk Score (1–25)**
176 
177Priority bands: Critical (20–25) | High (12–19) | Medium (6–11) | Low (1–5)
178 
179| ID | Threat summary | Likelihood | Impact | Score | Priority | Status |
180|---|---|---|---|---|---|---|
181| T-001 | JWT forgery — auth bypass | 2 | 5 | 10 | Medium | [Open / Mitigated / Accepted] |
182| T-002 | Session token replay | 3 | 4 | 12 | High | [Open / Mitigated / Accepted] |
183| T-007 | Privilege escalation via missing role check | 3 | 5 | 15 | High | [Open / Mitigated / Accepted] |
184| T-008 | SQL injection | 2 | 5 | 10 | Medium | [Open / Mitigated / Accepted] |
185| T-010 | IDOR — cross-user data access | 3 | 4 | 12 | High | [Open / Mitigated / Accepted] |
186| T-014 | Database exposed to internet | 1 | 5 | 5 | Low | [Open / Mitigated / Accepted] |
187| T-018 | Rogue internal service impersonation | 2 | 4 | 8 | Medium | [Open / Mitigated / Accepted] |
188 
189---
190 
191## 6. Mitigations Table
192 
193For every Open threat with priority Medium or above, define a specific mitigation.
194 
195| ID | Threat | Mitigation | Owner | Target date | Ticket |
196|---|---|---|---|---|---|
197| T-002 | Session token replay | Implement token rotation on refresh — invalidate old token server-side immediately | [Engineer name] | [Date] | [JIRA-123] |
198| T-007 | Privilege escalation | Add RBAC middleware to all `/admin/*` routes; write integration test for role boundary | [Engineer name] | [Date] | [JIRA-124] |
199| T-010 | IDOR | Add ownership assertion to all resource-fetching service methods; add to code review checklist | [Engineer name] | [Date] | [JIRA-125] |
200| T-011 | PII in logs | Audit logging calls for PII fields; add scrubbing to logger middleware | [Engineer name] | [Date] | [JIRA-126] |
201| T-018 | Rogue service impersonation | Enable mTLS via service mesh or issue scoped service tokens per service | [Engineer name] | [Date] | [JIRA-127] |
202 
203---
204 
205## 7. Accepted Risks
206 
207Accepted risks are threats the team has decided not to mitigate right now. Every accepted risk must have a named owner and a review date.
208 
209| ID | Threat | Reason for acceptance | Risk owner | Review date |
210|---|---|---|---|---|
211| T-014 | Database public exposure | Database has no public IP assigned; control already in place — accepted as low likelihood | [Name] | [Date] |
212| [ID] | [Threat] | [Reason — e.g. "Effort exceeds risk at current scale; re-evaluate at 10× traffic"] | [Name] | [Date] |
213 
214---
215 
216## 8. Security Controls Summary
217 
218| Control | Type | Covers threats | Implemented |
219|---|---|---|---|
220| JWT RS256 with 15-min expiry | Preventive | T-001, T-002 | [Yes / Partial / No] |
221| RBAC middleware on all routes | Preventive | T-007, T-020 | [Yes / Partial / No] |
222| Parameterised queries (ORM) | Preventive | T-008 | [Yes / Partial / No] |
223| Rate limiting (100 req/min per IP) | Preventive | T-006, T-012 | [Yes / Partial / No] |
224| CloudTrail / audit logging | Detective | T-004, T-013 | [Yes / Partial / No] |
225| Automated SAST in CI pipeline | Detective | T-008, T-009 | [Yes / Partial / No] |
226| Encrypted backups + private S3 | Preventive | T-015 | [Yes / Partial / No] |
227| Least-privilege DB role | Preventive | T-016 | [Yes / Partial / No] |
228| Incident response runbook | Corrective | All | [Yes / Partial / No] |
229 
230---
231 
232## 9. Review Cadence
233 
234| Trigger | Action |
235|---|---|
236| Every 6 months | Full threat model review — update risk scores, close mitigated items |
237| Major architecture change | Update trust boundary diagram and re-run STRIDE for new components |
238| Security incident | Review relevant threats; add any newly discovered vectors |
239| New data classification | Add assets to register; assess whether new STRIDE categories apply |
240| Third-party dependency added | Assess supply chain threats for the new dependency |
241 
242**Next scheduled review:** [Date]
243**Review owner:** [Name / Security lead]
244 
245---
246 
247## Quality Checks
248 
249- [ ] Every trust boundary is named and its authentication mechanism is specified — not left as "TBD"
250- [ ] Every Critical and High risk in the risk register has a mitigation with a named owner and a target date
251- [ ] Every accepted risk has a named risk owner and a review date — no unowned accepted risks
252- [ ] The asset register includes data sensitivity levels and at least one entry for credential material
253- [ ] STRIDE analysis covers all major components — not just the API layer
254- [ ] Mitigation actions are specific enough to become a ticket (not "improve security")
255- [ ] The ASCII trust boundary diagram matches the architecture description provided
256 
257## Anti-Patterns
258 
259- [ ] Do not restrict STRIDE analysis to only the API layer — threats exist at every component including the database and internal services
260- [ ] Do not leave mitigations as vague directives like "improve security" — every mitigation must be specific enough to become a ticket
261- [ ] Do not accept risks without a named owner and a review date — unowned accepted risks are not managed risks
262- [ ] Do not write a threat model that covers only theoretical threats — prioritise by likelihood and impact using the risk register
263- [ ] Do not omit the asset register — without knowing what is being protected, the STRIDE analysis has no anchor
264 

Discussion

Alternatives

Also in SecuritySee all 533 in Development →