先決定你現在是要學,還是要在專案裡做
網站負責解釋與分發工作包;真正的 Repository 掃描、缺口判斷與文件產出交給 Coding Agent。
SDLC 實作課 · 交付物練習
先理解這份文件替你消除什麼不確定
在攻擊者之前先把資料流畫清楚
把「我們會被怎麼打」從感覺變成清單。輸出 trust boundary、資產、威脅、緩解措施,餵給 NFR 與 Code Review。
誰負責、交給誰
主責: Architect
協作: Security/Compliance、SA 確認資料分類
下游收件: Dev(防禦實作)、QA(負面測試)
何時值得做
必要時機: 新增外部介面、處理高敏感資料、權限模型變更
不需要時: 純內部工具、無資料分級提升
常見誤用: 把 OWASP Top 10 抄一份當交付;忽略 trust boundary 圖
- 01讀大綱
- 02比範本
- 03填素材
- 04貼提示詞
- 05對照驗收
Anatomy · 文件解剖
輕量版先回答 6 個核心章節
章節名稱可以因團隊調整,但每一段要求的判斷不能被省略。先讀問題,再看格式。
- 01
Executive Summary
範本必要章節
3-5 行說明範圍、最高風險 asset、最大未緩解 residual risk
- 02
Trust Boundaries & Assets
範本必要章節
列出主要 trust boundary 與跨越的 asset。輕量版至少 1 個 boundary
- 03
STRIDE Analysis(per asset)
範本必要章節
每個 asset 必跑 STRIDE 六類,不適用要寫 N/A 並說明為何
- 05
Mitigations(核心)
範本必要章節
每個 mitigation 含 addresses(威脅 ref)+ effectiveness + side_effect
- 10
Decision Log
範本必要章節
每條必含 chosen + 至少 1 個 rejected option + 拒絕原因
- 12
Confidence & Sources & TODO
範本必要章節
把已確認的內容、判斷依據與仍待補充的資訊清楚分開。
Study · 對照學習
同一份交付物,先練核心,再看完整深度
輕量範本適合第一次練習與 MVP;完整範本保留跨職能交棒需要的細節。兩者都要求未知事項保持可見。
這張卡目前提供已審定的輕量與完整範本;不以 AI 臨時生成的內容冒充實際案例。
30 分鐘內先完成核心章節。
---
doc_type: "threat-model"
variant: "light"
status: "draft"
owner: "<your-name>"
last_updated: "YYYY-MM-DD"
upstream:
required: ["data-flow-diagram", "assets-list"]
optional: ["nfr-security"]
---
# Threat Model: <system-name>
**Status:** Draft · **Owner:** <Architect/Security> · **Last updated:** YYYY-MM-DD
> [!IMPORTANT]
> **AI 填寫規則:** 本範本 6 段(編號 1, 2, 3, 5, 10, 12),全部必填——刻意沿用完整版的章節編號讓兩版可對照。**威脅建模框架 = STRIDE**(不可用 OWASP Top 10 替代)。每個威脅行內加 `(依據:DFD §flow-X / asset §A-N)`;每欄位帶 `[H]/[M]/[L]` confidence badge;缺資料寫 `_TODO: 需要 XXX_` **不編造攻擊路徑**;輕量版針對 ≤ 2 個 trust boundary + 主要 asset 跑 STRIDE。
---
## 1. Executive Summary
<!-- ai-fill: 3-5 行說明範圍、最高風險 asset、最大未緩解 residual risk -->
<3-5 行說明>
> **TL;DR:** <一句話:最高風險路徑 + 對應 mitigation 狀態>
---
## 2. Trust Boundaries & Assets
<!-- ai-rule: 列出主要 trust boundary 與跨越的 asset。輕量版至少 1 個 boundary -->
### Trust Boundaries
| ID | Name | Crosses (assets) | Confidence |
|---|---|---|---|
| TB-1 | internet → API gateway | session token, user PII | **[H]** |
| TB-2 | API → internal DB | credentials, payment token | **[H]** |
### Assets
| ID | Name | Classification | Location |
|---|---|---|---|
| A-1 | user PII (email/phone) | confidential | OLTP DB |
| A-2 | session token (JWT) | confidential | client + signing key in KMS |
---
## 3. STRIDE Analysis(per asset)
<!-- ai-rule: 每個 asset 必跑 STRIDE 六類,不適用要寫 N/A 並說明為何 -->
### A-1: User PII (across TB-1)
| Category | Threat | Feasibility | Confidence |
|---|---|---|---|
| **Spoofing** | 攻擊者冒用 user JWT | M | **[H]** |
| **Tampering** | MITM 修改 request 內容 | L (TLS 1.3) | **[H]** |
| **Repudiation** | user 否認操作(缺 audit log) | M | **[M]** |
| **Info disclosure** | API response 過度暴露欄位 | M | **[H]** |
| **DoS** | 大量 enumeration scrape PII | M | **[M]** |
| **EoP** | low-priv user 透過 IDOR 取他人 PII | H | **[H]** |
---
## 5. Mitigations(核心)
<!-- ai-rule: 每個 mitigation 含 addresses(威脅 ref)+ effectiveness + side_effect -->
| ID | Addresses | Control | Effectiveness | Side effect |
|---|---|---|---|---|
| M-1 | A-1 EoP (IDOR) | row-level access check + tenant_id 強制 | **[H]** | +5ms latency |
| M-2 | A-1 DoS scrape | rate limit per token + WAF rule | **[M]** | 正當用戶可能被誤判 |
| M-3 | A-1 Spoofing | short JWT TTL (15min) + refresh token | **[H]** | UX 摩擦:頻繁 refresh |
---
## 10. Decision Log
<!-- ai-rule: 每條必含 chosen + 至少 1 個 rejected option + 拒絕原因 -->
| Date | Decision | Options | Chosen | Rejected why | Confidence |
|---|---|---|---|---|---|
| YYYY-MM-DD | Service-to-service auth | mTLS / JWT / IP allowlist | mTLS | JWT (key 管理)、IP allowlist (cloud IP 漂移) | **[H]** |
---
## 12. Confidence & Sources & TODO
- **整份文件最低 confidence 欄位:** <列出所有 [L] 與 [M]>
- **Fabricated assumptions(推測但 input 未明說):**
- <假設 1:例:假設 token 是 JWT>
- **Highest-value next input:** <下一份最該補的:completed DFD / penetration test report>
### TODO(缺資料)
- _TODO: 需要 Security 確認 KMS rotation 政策_
---
> [!CAUTION]
> **輸出前 AI 自檢:**
> - [ ] 6 段 H2 章節齊全(編號 1, 2, 3, 5, 10, 12,刻意不連號)
> - [ ] 用 STRIDE 框架(不是 OWASP Top 10 抄一份)
> - [ ] 每個 asset 跑 STRIDE 六類(N/A 須說明)
> - [ ] 每個 mitigation 含 addresses + effectiveness + side_effect
> - [ ] Decision Log ≥ 1 條,每條有 rejected reason
> - [ ] 沒有編造攻擊路徑(每條威脅有 DFD / asset source)
> - [ ] 無 YAML / JSON schema 輸出(threat model 是給人讀的 markdown)Practice · 換你試做
先用自己的話交代素材,不需要先學會工程術語
確定的就寫,不確定的留白。下一步要做的是請 Agent 找缺口,不是讓它替你猜一套合理答案。
可以先留白;複製提示詞後再到 Coding Agent 裡補充。
AI Practice · 手動三步
先問、再寫、最後審,不把整條流程鎖死
每一步都是獨立工作包。你可以停下補資料、修改限制或重做某一步,不需要服從固定的 Agent 接力流程。
只找阻擋文件成立的未知
先補會改變範圍、判斷或驗收結果的資訊,不急著寫文件。
我要製作「Threat Model · 威脅建模」。先不要產出文件。
請根據我的素材,找出會影響這份文件正確性或可執行性的未知事項,一次最多問 5 題。
每題請包含:
1. 問題
2. 為什麼現在必須知道
3. 它會影響哪個章節或決定
已經回答的事不要重問;可以延後的事標成「待決策」;不要替我猜答案。
本文件的核心章節:Executive Summary、Trust Boundaries & Assets、STRIDE Analysis(per asset)、Mitigations(核心)、Decision Log、Confidence & Sources & TODO複製後,請在標示位置貼上自己的素材。
Review · 自己驗收
文件存在,不代表下一個角色真的能使用
逐條檢查 Agent 的輸出。人類負責需求、限制與驗收,也必須能說明重要結論從哪裡來。
帶著這份文件,繼續到「非功能需求 · NFR / -ilities」
下一張卡會接住新的決策問題;不用一次把整條 SDLC 全做完。
