---
name: threat-model
description: '新功能/新系统的轻量威胁建模：固定对象→划定范围与信任边界→资产清单→STRIDE 逐资产威胁表→攻击树（可选）→缓解与优先级，产出可进设计评审的威胁模型文档。为新功能/新改动做设计阶段安全评审、梳理信任边界或画攻击树时用；与安全边界无关的纯 bug 修复、已有成熟建模流程的团队不展开本流程。'
whenToUse: '用户要求对新功能/新系统做威胁建模、设计阶段安全评审、STRIDE 分析、攻击树分析，或要求把安全考虑前置到设计阶段时使用；纯实现细节讨论、与信任边界无关的改动不触发本技能。'
metadata:
  pack: dsh-skill-pack-security
  version: '2.2.13'
---

# 威胁建模（threat-model）

本技能做**设计阶段**的轻量威胁建模：对一次改动/一个新组件，产出信任边界、STRIDE 威胁表与缓解清单。它只覆盖建模方法论；已有审计发现要定级转 `security-audit`，具体漏洞查情报转 `vuln-intel`。产物不含密钥，可进设计文档。

## 1. 固定建模对象（不固定对象，模型不可复现）

```sh
git rev-parse --show-toplevel
git log -1 --format='%H %cd' --date=iso-strict
```

预期输出样例（以实际输出为准）：

```
D:\repo\example
a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6e7f8a9b0 2026-08-14T10:30:00+08:00
```

判据：退出码 0 且第一行为绝对路径；威胁模型文档头部必须记录该提交哈希——评审者据此知道模型针对哪个版本。

## 2. 划定范围：改了什么、边界在哪

```sh
git diff --stat <base>...HEAD
git diff --name-only <base>...HEAD
```

预期输出样例：`src/auth/session.ts | 40 ++++`，随后是改动文件路径列表。
判据：范围 = 本次 diff 触及的文件与组件；**不做全仓库建模**（全仓库建模产出太大、评审没人看）。新建模块没有 diff 时用 `git ls-files -- '<模块目录>'` 代替。
信任边界四类，每个资产必须标出所在边界：进程内（同进程代码之间）、进程间（IPC/HTTP/RPC）、系统边界（本机/内核/文件系统）、外部（第三方服务/用户/上游数据）。

## 3. 资产清单（STRIDE 表的行）

```sh
git ls-files -- 'package.json' 'pnpm-lock.yaml' '.env*' '.github/workflows/**' 'Dockerfile*' '*.tf' 'cordis.yml' '**/cordis.yml' '*.pem' '**/*.key'
```

预期输出样例：每行一个相对路径；无匹配 = 该类资产不存在。
判据：资产至少覆盖四类——数据（密钥、用户数据、配置）、代码（本次改动模块）、通道（API、消息、日志）、宿主（CI、容器、外部依赖）。缺哪类补哪类，不能只列本次 diff 的文件。

## 4. STRIDE 逐资产威胁表

对第 3 节每个资产过六问（完整定义与提问提示见 `references/stride-and-attack-tree.md`）：

| 资产 | S 仿冒 | T 篡改 | R 抵赖 | I 信息泄露 | D 拒绝服务 | E 提权 | 进入路径 | 缓解 |
|---|---|---|---|---|---|---|---|---|
| 例：会话 token | 伪造 token | 篡改声明 | 无审计日志 | 日志打印 token | 会话风暴 | 越权换身份 | API 无签名校验 | 签名 + 最小权限 |

判据：**每一格要么有威胁、要么写明"不适用（原因）"**——空着等于没建模；威胁必须写"谁、通过哪条路径、造成什么影响"三要素，缺一降为"观察"。
填完倒查：每个资产的"进入路径"是否都经过一个信任边界；没经过任何边界的资产 = 边界图遗漏，回第 2 节补。

## 5. 攻击树（可选：只给高风险面画）

```sh
dot -Tpng attack-tree.dot -o attack-tree.png
# 无 graphviz 时用缩进文本树代替（示例见 references）
```

预期输出样例：退出码 0 并生成 `attack-tree.png`。
判据：只对第 4 节中"高影响 × 多前提"的威胁画树，根 = 攻击目标，叶 = 前置条件；**每片叶必须可验证**（一条命令能证明该前提成立/不成立），验证不了的叶子标注"未验证假设"。`.dot` 源文件与渲染图都进评审材料。

## 6. 缓解与优先级

缓解从四个方向选（每个方向的落地模板见 `references/stride-and-attack-tree.md`）：

- 消除：改设计让路径不存在（最高优先，评审会上先问"能不能不做"）；
- 转移：交给已有防护（认证交给 SSO、密钥交给 KMS/CI secrets）；
- 缓解：边界上加校验（签名、鉴权、限流、脱敏日志）；
- 接受：写明理由与残余风险，记录为"接受的风险"。

优先级判据 = 可利用性 × 影响（同 `security-audit` 三要素，去掉"是否已暴露"——设计阶段还没有暴露一说）。

## 7. 交付物与自检

交付物：信任边界描述（文字或图）+ 资产清单 + STRIDE 表 +（可选）攻击树 + 缓解清单。
自检命令（预期输出：无匹配；有匹配 = 表里有没填完的行）：

```sh
grep -nE '\| *TBD *\||待定' threat-model.md
```

## 与其他技能的分工

- `security-audit`：对已有仓库做全面审计与定级——建模发现的高风险路径交给它逐项验证。
- `vuln-intel`：设计里引用的第三方组件有 CVE 时，查详情与影响。
- `supply-chain-review`：建模范围含新增依赖时，对依赖做快速供应链评审。
- `secret-scan`：资产清单里的密钥类资产直接交给它扫描与脱敏。
