Threat-models a design BEFORE implementation — spec/PRD/data-model/route sketch in, THREAT-MODEL.md out with actor×asset inventory, data flows across trust boundaries, STRIDE sweep mapped to the repo's detection skills, per-persona abuse cases, and an audit contract (the actor×surface matrix + acceptance criteria) the future security-audit must disposition. Use when the user shares a design doc, spec, PRD, or architecture, or asks to threat-model a system before or during early build — before...
Pro scans all 5 files and shows the line behind each finding
Scanned 9/23/2026
npx -y skills add jiayaoqijia/cryptoskill --skill ashrafiucse-design-threat-review --agent claude-codeInstalls into .claude/skills of the current project.
Are you the author of Ashrafiucse Design Threat Review?
Add the live security badge to your README — it updates automatically with every re-scan.
[](https://www.skillsdirectory.com/skills/jiayaoqijia-ashrafiucse-design-threat-review)More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.
---
name: design-threat-review
description: Threat-models a design BEFORE implementation — spec/PRD/data-model/route sketch in, THREAT-MODEL.md out with actor×asset inventory, data flows across trust boundaries, STRIDE sweep mapped to the repo's detection skills, per-persona abuse cases, and an audit contract (the actor×surface matrix + acceptance criteria) the future security-audit must disposition. Use when the user shares a design doc, spec, PRD, or architecture, or asks to threat-model a system before or during early build — before the code exists to audit.
license: MIT
---
# Design Threat Review
Security decisions are cheapest before code exists. This skill runs at design
time and produces the ONE artifact that `../security-audit/SKILL.md` Phase 0/2
consumes at audit time — a shared actor×surface matrix plus acceptance
criteria. Design → implementation → audit: one artifact, no seams.
## Ground rules
- Input is prose/diagrams as readily as code — absence of code is the point.
- Output is ONE file: `THREAT-MODEL.md` in the project root (the only file you create).
- Every threat gets a code-phase detector (sibling skill) AND an acceptance
criterion. A threat with no detector becomes a design-protected control —
never leave a threat with neither.
## Step 0 — Gather inputs
Read whatever exists: spec/PRD, ERD/data model, route sketches, integration
list, personas. If thin, ask or record assumptions:
- Which account types/roles exist? Who grants them?
- What does each role SUBMIT that another role OPENS? (moderation surfaces)
- Where does money/entitlement change hands? What artifact marks "paid"?
- What PII/secrets exist, and where do they flow — including logs, emails,
support tools, third parties?
- What calls INTO the system (webhooks, SSO, imports, postbacks)?
## Step 1 — Assets & actors
- **ASSETS**: content/IP, money & entitlements, PII, credentials/secrets,
admin power, availability.
- **ACTORS**: anonymous, authenticated user, staff/moderator,
admin/tenant-admin, service/webhook caller, third-party integration.
- Build the actor×asset power matrix: each cell = the actor's legitimate
power over that asset. Illegitimate power is exactly what Step 3/4 hunt.
## Step 2 — Data flows & trust boundaries
Sketch the flows (e.g. student submits review → stored → pending queue →
staff opens detail view → approve → public page). Mark EVERY trust-boundary
crossing: browser↔app, app↔db, app↔third-party, queue/worker, email render,
admin origin. Each crossing becomes a coverage-matrix cell. Content that
crosses a boundary UNPURIFIED and is opened by a HIGHER-privilege actor is
the highest-priority cell class (see `../laravel-security/SKILL.md` Step 4
privilege-direction table and `../course-platform-security/SKILL.md` §6.5).
## Step 3 — Threat sweep (STRIDE → repo detection skills)
For each flow element, sweep STRIDE; tag each credible threat with the
sibling skill that must catch it in code:
| STRIDE | Ask at each boundary | Detector skill |
|---|---|---|
| Spoofing | can a weaker actor pose as a stronger one at this boundary? | `../auth-review/SKILL.md` |
| Tampering | does content cross unpurified and get rendered? (stored→rendered) | `../injection-flaws/SKILL.md` + framework skill (e.g. laravel Step 4) |
| Repudiation | do money/state transitions leave tamper-evident traces? | `../flow-security/SKILL.md` |
| Info disclosure | does a boundary leak gated/PII data (catalog, preview, logs)? | `../data-exposure/SKILL.md`, `../course-platform-security/SKILL.md` |
| DoS | can one cheap request cause expensive work? | `../config-hardening/SKILL.md`, `../graphql-security/SKILL.md` |
| Elevation | does unprivileged input reach privileged surfaces? | `../auth-review/SKILL.md` + course skill §6.5 |
Domain lenses: course/e-learning → the course skill's three personas;
payments/subscriptions → flow-security state machines (what fulfills an
entitlement, what can replay).
## Step 4 — Abuse cases per persona
For each actor, write the attacker version: what do they WANT (free content,
another user's data, a staff session, a refund) and which cell do they
abuse? Defaults that must not be argued away:
- Unprivileged→privileged content flows (moderation) default to
**severity-if-missed: Critical** — the approval workflow itself is the
delivery mechanism (MISSES.md 2026-09-23: student review → staff detail
view → admin ATO).
- Preview/free-tier flows default to Critical-if-full-content.
## Step 5 — Write THREAT-MODEL.md (the audit contract)
1. Actor×asset power matrix (Step 1) and flows+boundaries (Step 2).
2. Threat list — one section per threat, same shape as security-audit Phase 3
findings so the scorer and future audits parse both the same way
(`T-NNN` ids; the spec anchor is the citable `file:line` evidence):
```markdown
### T-01: <threat title> — <severity-if-missed>
- **Actor → Asset:** student → admin power
- **Surface:** moderation detail view
- **Spec anchor:** spec.md:17-19
- **Detector skill:** ../laravel-security/SKILL.md Step 4 (privilege direction) + ../course-platform-security/SKILL.md §6.5
- **Acceptance criterion:** <the control implementation MUST show, stated as a checkable fact>
```
The acceptance criterion is checkable — e.g. "review body passes through
e() before any formatting in EVERY staff view — list AND detail — or is
stored purified" — never "input is handled safely".
3. The pre-seeded actor×surface coverage matrix, all cells ⬜ — the exact
artifact `../security-audit/SKILL.md` Phase 0 loads and Phase 2 (gate v2)
forces to disposition.
4. Handoff notes: acceptance criteria are the implementation's security
requirements; the first audit reads THREAT-MODEL.md, runs the detector
skills, and disposition-checks every threat row and every matrix cell.
## Reporting
End with a 3-line verbal summary: highest severity-if-missed threat, the
single acceptance criterion most likely to be skipped in implementation,
and the detector skill that will catch it later if it is.
Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.
No comments yet. Be the first to comment!