<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Threat Model on Tarragon</title><link>https://tarrragon.github.io/blog/tags/threat-model/</link><description>Recent content in Threat Model on Tarragon</description><generator>Hugo -- gohugo.io</generator><language>zh-TW</language><copyright>Tarragon (CC BY 4.0)</copyright><lastBuildDate>Fri, 19 Jun 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://tarrragon.github.io/blog/tags/threat-model/index.xml" rel="self" type="application/rss+xml"/><item><title>監控資料洩漏的 Threat Model</title><link>https://tarrragon.github.io/blog/monitoring/07-security-privacy/monitoring-data-threat-model/</link><pubDate>Fri, 19 Jun 2026 00:00:00 +0000</pubDate><guid>https://tarrragon.github.io/blog/monitoring/07-security-privacy/monitoring-data-threat-model/</guid><description>&lt;p>監控系統收集的資料本身就是有價值的攻擊目標。Error 訊息包含 stack trace 和系統架構資訊，event 資料包含使用者行為模式，lifecycle 資料包含部署時程和系統狀態。攻擊者取得這些資料後可以用於進一步的攻擊 — stack trace 揭露程式碼結構，部署資訊揭露更新節奏，行為資料揭露高價值使用者。&lt;/p>
&lt;h2 id="威脅場景一傳輸竊聽">威脅場景一：傳輸竊聽&lt;/h2>
&lt;h3 id="攻擊方式">攻擊方式&lt;/h3>
&lt;p>攻擊者在 SDK 和 collector 之間的網路路徑上攔截未加密的 HTTP 流量。同網段的 ARP spoofing、WiFi sniffing、或中間人（MITM）proxy。&lt;/p>
&lt;h3 id="暴露的資料">暴露的資料&lt;/h3>
&lt;p>事件的完整 JSON payload — 包括 redaction 後殘留的資訊（使用者行為、系統狀態、error message）。API key 或 basic auth credential 如果在 HTTP header 中明文傳送，也會被攔截。&lt;/p>
&lt;h3 id="防護">防護&lt;/h3>
&lt;p>使用 HTTPS 加密傳輸（&lt;a href="https://tarrragon.github.io/blog/monitoring/07-security-privacy/transport-security/" data-link-title="Transport 安全" data-link-desc="HTTPS / basic auth / 同區網也要加密的理由 — 監控資料在傳輸途中的保護機制">Transport 安全&lt;/a>）。所有 SDK 到 collector 的通訊走 TLS — 自簽憑證在自用場景足夠，公開部署用 Let&amp;rsquo;s Encrypt。&lt;/p>
&lt;h2 id="威脅場景二儲存入侵">威脅場景二：儲存入侵&lt;/h2>
&lt;h3 id="攻擊方式-1">攻擊方式&lt;/h3>
&lt;p>攻擊者取得 collector server 的存取權限（SSH 入侵、容器逃逸、雲端 IAM 權限提升），直接讀取儲存的事件檔案。&lt;/p>
&lt;h3 id="暴露的資料-1">暴露的資料&lt;/h3>
&lt;p>所有歷史事件 — 包含 redaction 處理後的事件。如果 redaction 不完整（遺漏了某些敏感欄位），歷史事件中可能包含 secret。&lt;/p>
&lt;h3 id="防護-1">防護&lt;/h3>
&lt;p>&lt;strong>最小化儲存&lt;/strong>：只保留必要期限的資料，過期自動刪除（&lt;a href="https://tarrragon.github.io/blog/monitoring/07-security-privacy/gdpr-minimization/" data-link-title="GDPR 最小化原則的工程落地" data-link-desc="資料最小化、目的限制、儲存限制 — GDPR 三個核心原則在監控系統的工程實作方式">GDPR 最小化原則&lt;/a>）。攻擊者能取得的資料量與保留期間成正比。&lt;/p>
&lt;p>&lt;strong>檔案系統加密&lt;/strong>：LUKS（Linux）或 FileVault（macOS）對整個磁碟加密。Server 關機後磁碟資料無法被讀取。&lt;/p>
&lt;p>&lt;strong>access log 監控&lt;/strong>：記錄所有對事件儲存的存取操作（&lt;a href="https://tarrragon.github.io/blog/monitoring/07-security-privacy/collector-access-control/" data-link-title="Collector Access Control 實作" data-link-desc="認證（誰在送資料）/ 授權（允許送什麼）/ access log（誰在什麼時候送了什麼）— collector 端的三層存取控制">Collector Access Control&lt;/a>）。異常存取（非工作時間、非預期的 IP）觸發告警。&lt;/p>
&lt;h2 id="威脅場景三endpoint-濫用">威脅場景三：Endpoint 濫用&lt;/h2>
&lt;h3 id="攻擊方式-2">攻擊方式&lt;/h3>
&lt;p>攻擊者取得 SDK 的 API key（從 client 端的程式碼或設定檔中提取），大量寫入垃圾事件或惡意 payload。&lt;/p>
&lt;h3 id="影響">影響&lt;/h3>
&lt;p>&lt;strong>資料汙染&lt;/strong>：合法事件和垃圾事件混在一起，分析結果不可靠。&lt;/p>
&lt;p>&lt;strong>資源耗盡&lt;/strong>：大量寫入消耗 collector 的儲存和處理能力。&lt;/p>
&lt;p>&lt;strong>注入攻擊&lt;/strong>：如果 collector 的查詢介面沒有做好輸入驗證，惡意 payload 中的特殊字元可能觸發 injection。&lt;/p>
&lt;h3 id="防護-2">防護&lt;/h3>
&lt;p>&lt;strong>Rate limit&lt;/strong>：每個 API key 的寫入速率限制。正常的 SDK 行為有可預測的寫入頻率（每分鐘 N 個事件），超出正常範圍的寫入被拒絕。&lt;/p>
&lt;p>&lt;strong>Schema validation&lt;/strong>：collector 只接受符合定義 schema 的事件。格式異常的 payload 在寫入前被丟棄。&lt;/p>
&lt;p>&lt;strong>API key 輪替&lt;/strong>：如果 API key 被洩漏，輪替 key 讓舊 key 失效。SDK 端更新新 key 後恢復正常。&lt;/p>
&lt;h2 id="威脅場景四內部越權存取">威脅場景四：內部越權存取&lt;/h2>
&lt;h3 id="攻擊方式-3">攻擊方式&lt;/h3>
&lt;p>有 collector 讀取權限的人（開發者、維運人員）存取超出自己職責範圍的事件資料。例如開發者查看行為分析資料（只應該看 debug 資料），或前端開發者查看 server-side 的 error 事件。&lt;/p>
&lt;h3 id="防護-3">防護&lt;/h3>
&lt;p>&lt;strong>角色分離&lt;/strong>：不同用途的資料用不同的存取權限（&lt;a href="https://tarrragon.github.io/blog/monitoring/07-security-privacy/collector-access-control/" data-link-title="Collector Access Control 實作" data-link-desc="認證（誰在送資料）/ 授權（允許送什麼）/ access log（誰在什麼時候送了什麼）— collector 端的三層存取控制">Collector Access Control&lt;/a>）。Debug 資料和行為分析資料分開授權。&lt;/p>
&lt;p>&lt;strong>去識別化&lt;/strong>：即使有存取權限，看到的也是去識別化後的資料（&lt;a href="https://tarrragon.github.io/blog/monitoring/07-security-privacy/anonymization-strategy/" data-link-title="去識別化策略" data-link-desc="IP 截斷 / user agent 簡化 / stack trace 路徑清理 / session UUID — 四種去識別化技術的適用場景和實作方式">去識別化策略&lt;/a>）。IP 截斷、user agent 簡化、stack trace 路徑清理 — 降低資料的個人可識別性。&lt;/p></description><content:encoded><![CDATA[<p>監控系統收集的資料本身就是有價值的攻擊目標。Error 訊息包含 stack trace 和系統架構資訊，event 資料包含使用者行為模式，lifecycle 資料包含部署時程和系統狀態。攻擊者取得這些資料後可以用於進一步的攻擊 — stack trace 揭露程式碼結構，部署資訊揭露更新節奏，行為資料揭露高價值使用者。</p>
<h2 id="威脅場景一傳輸竊聽">威脅場景一：傳輸竊聽</h2>
<h3 id="攻擊方式">攻擊方式</h3>
<p>攻擊者在 SDK 和 collector 之間的網路路徑上攔截未加密的 HTTP 流量。同網段的 ARP spoofing、WiFi sniffing、或中間人（MITM）proxy。</p>
<h3 id="暴露的資料">暴露的資料</h3>
<p>事件的完整 JSON payload — 包括 redaction 後殘留的資訊（使用者行為、系統狀態、error message）。API key 或 basic auth credential 如果在 HTTP header 中明文傳送，也會被攔截。</p>
<h3 id="防護">防護</h3>
<p>使用 HTTPS 加密傳輸（<a href="/blog/monitoring/07-security-privacy/transport-security/" data-link-title="Transport 安全" data-link-desc="HTTPS / basic auth / 同區網也要加密的理由 — 監控資料在傳輸途中的保護機制">Transport 安全</a>）。所有 SDK 到 collector 的通訊走 TLS — 自簽憑證在自用場景足夠，公開部署用 Let&rsquo;s Encrypt。</p>
<h2 id="威脅場景二儲存入侵">威脅場景二：儲存入侵</h2>
<h3 id="攻擊方式-1">攻擊方式</h3>
<p>攻擊者取得 collector server 的存取權限（SSH 入侵、容器逃逸、雲端 IAM 權限提升），直接讀取儲存的事件檔案。</p>
<h3 id="暴露的資料-1">暴露的資料</h3>
<p>所有歷史事件 — 包含 redaction 處理後的事件。如果 redaction 不完整（遺漏了某些敏感欄位），歷史事件中可能包含 secret。</p>
<h3 id="防護-1">防護</h3>
<p><strong>最小化儲存</strong>：只保留必要期限的資料，過期自動刪除（<a href="/blog/monitoring/07-security-privacy/gdpr-minimization/" data-link-title="GDPR 最小化原則的工程落地" data-link-desc="資料最小化、目的限制、儲存限制 — GDPR 三個核心原則在監控系統的工程實作方式">GDPR 最小化原則</a>）。攻擊者能取得的資料量與保留期間成正比。</p>
<p><strong>檔案系統加密</strong>：LUKS（Linux）或 FileVault（macOS）對整個磁碟加密。Server 關機後磁碟資料無法被讀取。</p>
<p><strong>access log 監控</strong>：記錄所有對事件儲存的存取操作（<a href="/blog/monitoring/07-security-privacy/collector-access-control/" data-link-title="Collector Access Control 實作" data-link-desc="認證（誰在送資料）/ 授權（允許送什麼）/ access log（誰在什麼時候送了什麼）— collector 端的三層存取控制">Collector Access Control</a>）。異常存取（非工作時間、非預期的 IP）觸發告警。</p>
<h2 id="威脅場景三endpoint-濫用">威脅場景三：Endpoint 濫用</h2>
<h3 id="攻擊方式-2">攻擊方式</h3>
<p>攻擊者取得 SDK 的 API key（從 client 端的程式碼或設定檔中提取），大量寫入垃圾事件或惡意 payload。</p>
<h3 id="影響">影響</h3>
<p><strong>資料汙染</strong>：合法事件和垃圾事件混在一起，分析結果不可靠。</p>
<p><strong>資源耗盡</strong>：大量寫入消耗 collector 的儲存和處理能力。</p>
<p><strong>注入攻擊</strong>：如果 collector 的查詢介面沒有做好輸入驗證，惡意 payload 中的特殊字元可能觸發 injection。</p>
<h3 id="防護-2">防護</h3>
<p><strong>Rate limit</strong>：每個 API key 的寫入速率限制。正常的 SDK 行為有可預測的寫入頻率（每分鐘 N 個事件），超出正常範圍的寫入被拒絕。</p>
<p><strong>Schema validation</strong>：collector 只接受符合定義 schema 的事件。格式異常的 payload 在寫入前被丟棄。</p>
<p><strong>API key 輪替</strong>：如果 API key 被洩漏，輪替 key 讓舊 key 失效。SDK 端更新新 key 後恢復正常。</p>
<h2 id="威脅場景四內部越權存取">威脅場景四：內部越權存取</h2>
<h3 id="攻擊方式-3">攻擊方式</h3>
<p>有 collector 讀取權限的人（開發者、維運人員）存取超出自己職責範圍的事件資料。例如開發者查看行為分析資料（只應該看 debug 資料），或前端開發者查看 server-side 的 error 事件。</p>
<h3 id="防護-3">防護</h3>
<p><strong>角色分離</strong>：不同用途的資料用不同的存取權限（<a href="/blog/monitoring/07-security-privacy/collector-access-control/" data-link-title="Collector Access Control 實作" data-link-desc="認證（誰在送資料）/ 授權（允許送什麼）/ access log（誰在什麼時候送了什麼）— collector 端的三層存取控制">Collector Access Control</a>）。Debug 資料和行為分析資料分開授權。</p>
<p><strong>去識別化</strong>：即使有存取權限，看到的也是去識別化後的資料（<a href="/blog/monitoring/07-security-privacy/anonymization-strategy/" data-link-title="去識別化策略" data-link-desc="IP 截斷 / user agent 簡化 / stack trace 路徑清理 / session UUID — 四種去識別化技術的適用場景和實作方式">去識別化策略</a>）。IP 截斷、user agent 簡化、stack trace 路徑清理 — 降低資料的個人可識別性。</p>
<p><strong>access log 審計</strong>：所有讀取操作記錄在 access log 中，定期 review。</p>
<h2 id="下一步路由">下一步路由</h2>
<ul>
<li>SDK 端的 redaction → <a href="/blog/monitoring/07-security-privacy/sdk-redaction-api/" data-link-title="SDK Redaction API 設計" data-link-desc="預設 redaction rule 過濾已知敏感欄位、自訂 pattern 擴展應用特有的 secret 格式 — redaction 在 SDK 端執行，敏感資料不離開 client">SDK Redaction API 設計</a></li>
<li>Transport 層保護 → <a href="/blog/monitoring/07-security-privacy/transport-security/" data-link-title="Transport 安全" data-link-desc="HTTPS / basic auth / 同區網也要加密的理由 — 監控資料在傳輸途中的保護機制">Transport 安全</a></li>
<li>Collector 端保護 → <a href="/blog/monitoring/07-security-privacy/collector-access-control/" data-link-title="Collector Access Control 實作" data-link-desc="認證（誰在送資料）/ 授權（允許送什麼）/ access log（誰在什麼時候送了什麼）— collector 端的三層存取控制">Collector Access Control 實作</a></li>
<li>去識別化技術 → <a href="/blog/monitoring/07-security-privacy/anonymization-strategy/" data-link-title="去識別化策略" data-link-desc="IP 截斷 / user agent 簡化 / stack trace 路徑清理 / session UUID — 四種去識別化技術的適用場景和實作方式">去識別化策略</a></li>
<li>Client-side SDK 認證的多層緩解策略 → <a href="/blog/monitoring/07-security-privacy/client-sdk-authentication/" data-link-title="Client-side SDK 認證的根本限制" data-link-desc="嵌在 client 端的 credential 必然可被提取 — 認清 architecture 天花板後的多層緩解策略，從 origin 驗證到 device attestation">Client-side SDK 認證</a></li>
</ul>
]]></content:encoded></item><item><title>Threat model 明確性：「防什麼」與「不防什麼」必須對稱</title><link>https://tarrragon.github.io/blog/report/threat-model-explicitness/</link><pubDate>Fri, 01 May 2026 00:00:00 +0000</pubDate><guid>https://tarrragon.github.io/blog/report/threat-model-explicitness/</guid><description>&lt;h2 id="核心原則">核心原則&lt;/h2>
&lt;p>&lt;strong>寫資安 mitigation 必須對稱：每段「防什麼」要配「不防什麼」、不能單邊寫。&lt;/strong> 讀者沒拿到「不防 Y」、會用 universal validity 詮釋 mitigation——預設「防 X」涵蓋整個 threat space、實際只是 X 的 subset。Threat model 的 boundary 是 mitigation 論述的一部分、不是補充說明、不能省。&lt;/p>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>寫法&lt;/th>
 &lt;th>讀者會形成的結論&lt;/th>
 &lt;th>結論的 scope&lt;/th>
 &lt;th>實作覆蓋率&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>「使用 HTTPS 保護傳輸」&lt;/td>
 &lt;td>HTTPS 防傳輸風險&lt;/td>
 &lt;td>全部傳輸風險（universal）&lt;/td>
 &lt;td>subset（中間人 read）&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>「使用 HTTPS 防中間人讀取、不防 endpoint 信任失效」&lt;/td>
 &lt;td>HTTPS 防 X、不防 Y&lt;/td>
 &lt;td>顯式 scope&lt;/td>
 &lt;td>對應 X、reader 知道補 Y&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;p>差別在於讀者實作時的覆蓋判斷——前者讀完跳過 endpoint 驗證、後者讀完知道要補 Y。&lt;/p>
&lt;hr>
&lt;h2 id="情境">情境&lt;/h2>
&lt;p>資安寫作有兩個誘因會讓 threat model boundary 被省略：&lt;/p>
&lt;ol>
&lt;li>&lt;strong>正向陳述優先&lt;/strong>規範（AGENTS.md 原則二）會誤把「不防 Y」歸類為負面句、批量改寫時刪掉、跟 &lt;a href="../positive-rewrite-preserves-contrast/">#94 正向改寫保留對照論據&lt;/a> 同病&lt;/li>
&lt;li>&lt;strong>章節篇幅控制&lt;/strong>會把 threat boundary 當成「進階補充」往後丟、留主章節「乾淨主旨」&lt;/li>
&lt;/ol>
&lt;p>兩者都會產出 universal-flavored 的 mitigation 句子。讀者讀「使用 X 即可保護 Y」時、Y 會被腦補成「所有 Y 相關攻擊」、X 跟 Y 之間的 scope 配對被 silent 地放大成 universal。&lt;/p>
&lt;p>實際資安章節（&lt;code>backend/07-security-data-protection/&lt;/code>）會出現的形態：&lt;/p>





&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="ln">1&lt;/span>&lt;span class="cl">判讀訊號：登入驗證節奏失衡
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">2&lt;/span>&lt;span class="cl">前置控制面：authentication / incident-severity&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>這個寫法把 threat 抽象成「節奏失衡」、把 mitigation 抽象成「authentication」——對熟手 OK、對學習者讀完會以為「用 authentication 就擋節奏失衡」、實作時不會去問 authentication 的局部 scope（防 credential 弱、不防 session 重放、不防 supply chain 信任傳導）。&lt;/p>
&lt;hr>
&lt;h2 id="理想做法">理想做法&lt;/h2>
&lt;p>每個 mitigation 句子強制走「對稱論述」結構：&lt;/p>
&lt;h3 id="對稱論述模板">對稱論述模板&lt;/h3>





&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="ln">1&lt;/span>&lt;span class="cl">[Mitigation X] 防 [in-scope threat A]、
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">2&lt;/span>&lt;span class="cl">不防 [out-of-scope threat B]（[B 的補強路由 / 外部引用]）。&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>三個欄位都要填：&lt;/p>
&lt;ul>
&lt;li>&lt;strong>In-scope threat&lt;/strong>：X 真正擋的攻擊類型（具體、不抽象）&lt;/li>
&lt;li>&lt;strong>Out-of-scope threat&lt;/strong>：讀者最容易誤以為 X 也擋的攻擊（讀者直覺會 extrapolate 的方向）&lt;/li>
&lt;li>&lt;strong>補強路由&lt;/strong>：Y 該由什麼補（其他章節 / 外部標準 / 已知條件）、不能只丟「自己想辦法」&lt;/li>
&lt;/ul>
&lt;p>例（HTTPS 章節）：&lt;/p>





&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="ln">1&lt;/span>&lt;span class="cl">HTTPS 防中間人「讀取」傳輸內容（passive eavesdrop）、
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">2&lt;/span>&lt;span class="cl">不防 endpoint 「身分驗證」失效（compromised CA / cert pinning bypass）、
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">3&lt;/span>&lt;span class="cl">endpoint 信任靠 cert pinning + CT log monitoring 補（見 7.5）。&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>例（per-IP rate limit）：&lt;/p>





&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="ln">1&lt;/span>&lt;span class="cl">per-IP rate limit 擋「單來源」連續嘗試（brute force from single host）、
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">2&lt;/span>&lt;span class="cl">不擋「分散來源」嘗試（botnet / credential stuffing）、
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">3&lt;/span>&lt;span class="cl">分散攻擊靠 reputation-based filtering + adaptive challenge 補（見 7.3）。&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="對稱不是補負面是scope-顯式化">對稱不是「補負面」、是「scope 顯式化」&lt;/h3>
&lt;p>跟 &lt;a href="../positive-rewrite-preserves-contrast/">#94 正向改寫保留對照論據&lt;/a> 同骨：「不防 Y」不是負向陳述、是 mitigation 的 scope qualifier。把 contrast 寫進句子、不是違反「正向陳述優先」、是讓主句的 X claim 站得住。&lt;/p></description><content:encoded><![CDATA[<h2 id="核心原則">核心原則</h2>
<p><strong>寫資安 mitigation 必須對稱：每段「防什麼」要配「不防什麼」、不能單邊寫。</strong> 讀者沒拿到「不防 Y」、會用 universal validity 詮釋 mitigation——預設「防 X」涵蓋整個 threat space、實際只是 X 的 subset。Threat model 的 boundary 是 mitigation 論述的一部分、不是補充說明、不能省。</p>
<table>
  <thead>
      <tr>
          <th>寫法</th>
          <th>讀者會形成的結論</th>
          <th>結論的 scope</th>
          <th>實作覆蓋率</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>「使用 HTTPS 保護傳輸」</td>
          <td>HTTPS 防傳輸風險</td>
          <td>全部傳輸風險（universal）</td>
          <td>subset（中間人 read）</td>
      </tr>
      <tr>
          <td>「使用 HTTPS 防中間人讀取、不防 endpoint 信任失效」</td>
          <td>HTTPS 防 X、不防 Y</td>
          <td>顯式 scope</td>
          <td>對應 X、reader 知道補 Y</td>
      </tr>
  </tbody>
</table>
<p>差別在於讀者實作時的覆蓋判斷——前者讀完跳過 endpoint 驗證、後者讀完知道要補 Y。</p>
<hr>
<h2 id="情境">情境</h2>
<p>資安寫作有兩個誘因會讓 threat model boundary 被省略：</p>
<ol>
<li><strong>正向陳述優先</strong>規範（AGENTS.md 原則二）會誤把「不防 Y」歸類為負面句、批量改寫時刪掉、跟 <a href="../positive-rewrite-preserves-contrast/">#94 正向改寫保留對照論據</a> 同病</li>
<li><strong>章節篇幅控制</strong>會把 threat boundary 當成「進階補充」往後丟、留主章節「乾淨主旨」</li>
</ol>
<p>兩者都會產出 universal-flavored 的 mitigation 句子。讀者讀「使用 X 即可保護 Y」時、Y 會被腦補成「所有 Y 相關攻擊」、X 跟 Y 之間的 scope 配對被 silent 地放大成 universal。</p>
<p>實際資安章節（<code>backend/07-security-data-protection/</code>）會出現的形態：</p>





<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="ln">1</span><span class="cl">判讀訊號：登入驗證節奏失衡
</span></span><span class="line"><span class="ln">2</span><span class="cl">前置控制面：authentication / incident-severity</span></span></code></pre></div><p>這個寫法把 threat 抽象成「節奏失衡」、把 mitigation 抽象成「authentication」——對熟手 OK、對學習者讀完會以為「用 authentication 就擋節奏失衡」、實作時不會去問 authentication 的局部 scope（防 credential 弱、不防 session 重放、不防 supply chain 信任傳導）。</p>
<hr>
<h2 id="理想做法">理想做法</h2>
<p>每個 mitigation 句子強制走「對稱論述」結構：</p>
<h3 id="對稱論述模板">對稱論述模板</h3>





<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="ln">1</span><span class="cl">[Mitigation X] 防 [in-scope threat A]、
</span></span><span class="line"><span class="ln">2</span><span class="cl">不防 [out-of-scope threat B]（[B 的補強路由 / 外部引用]）。</span></span></code></pre></div><p>三個欄位都要填：</p>
<ul>
<li><strong>In-scope threat</strong>：X 真正擋的攻擊類型（具體、不抽象）</li>
<li><strong>Out-of-scope threat</strong>：讀者最容易誤以為 X 也擋的攻擊（讀者直覺會 extrapolate 的方向）</li>
<li><strong>補強路由</strong>：Y 該由什麼補（其他章節 / 外部標準 / 已知條件）、不能只丟「自己想辦法」</li>
</ul>
<p>例（HTTPS 章節）：</p>





<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="ln">1</span><span class="cl">HTTPS 防中間人「讀取」傳輸內容（passive eavesdrop）、
</span></span><span class="line"><span class="ln">2</span><span class="cl">不防 endpoint 「身分驗證」失效（compromised CA / cert pinning bypass）、
</span></span><span class="line"><span class="ln">3</span><span class="cl">endpoint 信任靠 cert pinning + CT log monitoring 補（見 7.5）。</span></span></code></pre></div><p>例（per-IP rate limit）：</p>





<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="ln">1</span><span class="cl">per-IP rate limit 擋「單來源」連續嘗試（brute force from single host）、
</span></span><span class="line"><span class="ln">2</span><span class="cl">不擋「分散來源」嘗試（botnet / credential stuffing）、
</span></span><span class="line"><span class="ln">3</span><span class="cl">分散攻擊靠 reputation-based filtering + adaptive challenge 補（見 7.3）。</span></span></code></pre></div><h3 id="對稱不是補負面是scope-顯式化">對稱不是「補負面」、是「scope 顯式化」</h3>
<p>跟 <a href="../positive-rewrite-preserves-contrast/">#94 正向改寫保留對照論據</a> 同骨：「不防 Y」不是負向陳述、是 mitigation 的 scope qualifier。把 contrast 寫進句子、不是違反「正向陳述優先」、是讓主句的 X claim 站得住。</p>
<table>
  <thead>
      <tr>
          <th>違反「正向陳述優先」</th>
          <th>符合「正向陳述優先」 + 對稱 boundary</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>「不要忘了 X 不防 Y」（命令）</td>
          <td>「X 防 A、不防 B（B 由 C 補）」（陳述）</td>
      </tr>
      <tr>
          <td>「Y 是 X 的限制」（負面 framing）</td>
          <td>「X 的 scope 是 A」（正面 framing）</td>
      </tr>
  </tbody>
</table>
<p>主句仍然承載 X 的 mitigation claim（正向）、不防 Y 是 scope qualifier、不是論述主體——結構符合「正向陳述優先」、語意保留 boundary。</p>
<h3 id="threat-model-的層級對應">Threat model 的層級對應</h3>
<p>對稱論述要在三個層級保持一致：</p>
<table>
  <thead>
      <tr>
          <th>層級</th>
          <th>對稱 threat model 的形態</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>章節級</td>
          <td>章節 lead 段列出整體 threat scope + 不在 scope 的 threat 路由</td>
      </tr>
      <tr>
          <td>段落級</td>
          <td>每個 mitigation 段配對應 threat 跟 boundary</td>
      </tr>
      <tr>
          <td>句子級</td>
          <td>「X 防 A、不防 B」單句承載</td>
      </tr>
  </tbody>
</table>
<p>三個層級任一缺、reader 都可能 silent universal 詮釋。實作 audit 時三層分別檢查、不是只看句子。</p>
<hr>
<h2 id="沒這樣做的麻煩">沒這樣做的麻煩</h2>
<h3 id="reader-用-universal-詮釋實作覆蓋永遠是-worst-case">Reader 用 universal 詮釋、實作覆蓋永遠是 worst case</h3>
<p>人類讀句子時、預設的 scope 是 universal、不是 minimal——這是語言學跟認知偏差的結合。「使用 X 防 Y」讀者預設 X 防整個 Y space。要讓讀者預設 minimal、必須<strong>顯式給 boundary</strong>——這跟物件的 type narrowing 同骨：沒寫 narrowing predicate、預設 widest type。</p>
<p>跟 <a href="../false-sense-of-security-as-primary-failure/">#100 false sense of security</a> 主軸對應——universal 詮釋是 false sense 的主要產地。</p>
<h3 id="reviewer-跟原作者對-mitigation-的-scope-認知會-silent-drift">Reviewer 跟原作者對 mitigation 的 scope 認知會 silent drift</h3>
<p>含糊 threat model 的 mitigation 段、不同 reviewer 讀會 reconstruct 出不同的 in-scope 集合。原作者腦中是 [A, B]、reviewer 讀成 [A, B, C, D]、實作者實作為 [A, B, C, D, E]——三個人對同一段話的覆蓋認知都不同、且都覺得自己對。對稱寫法讓 scope 變成 fact、不是 reconstruction。</p>
<h3 id="多-mitigation-疊加時的-gap-永遠看不到">多 mitigation 疊加時的 gap 永遠看不到</h3>
<p>多個 mitigation 各自寫 in-scope、不寫 out-of-scope、疊加時的 gap（哪個 threat 沒人擋）就看不到。對稱寫法讓每個 mitigation 都有顯式 boundary、疊加 audit 時可以做集合運算（聯集 in-scope 應涵蓋 threat space、否則有 gap）。沒對稱寫法、audit 工具只能憑感覺、無法量化覆蓋。</p>
<hr>
<h2 id="跟其他抽象層原則的關係">跟其他抽象層原則的關係</h2>
<table>
  <thead>
      <tr>
          <th>原則</th>
          <th>關係</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td><a href="../false-sense-of-security-as-primary-failure/">#100 False sense of security 主要失敗模式</a></td>
          <td><strong>本卡是消滅 #100 的具體 dimension 1</strong> — universal 詮釋是 false sense 的主要產地、對稱論述是直接的 mitigation</td>
      </tr>
      <tr>
          <td><a href="../positive-rewrite-preserves-contrast/">#94 正向改寫保留對照論據</a></td>
          <td><strong>同骨 sibling</strong> — #94 在寫作規範執行層、本卡在資安寫作層、都在說「contrast 是論述完整性的一部分、不能為了正向化而刪」</td>
      </tr>
      <tr>
          <td><a href="../minimum-necessary-scope-is-sanity-defense/">#43 最小必要範圍是 sanity 防線</a></td>
          <td><strong>scope explicitness 同骨</strong> — #43 在 JS 邊界 / selector / observer scope、本卡在 mitigation 的 threat scope、都在說「scope 不顯式 = 失控的 widening」</td>
      </tr>
      <tr>
          <td><a href="../security-teaching-rigor-asymmetry/">#99 資安教學審查標準對應風險不對稱</a></td>
          <td>上游動機 — #99 立論「為什麼要 verifiability-first」、本卡是 verifiability 的具體實現之一</td>
      </tr>
      <tr>
          <td><a href="../yes-no-binary-collapse/">#80 Yes/No 二選 collapse</a></td>
          <td>「X 防 Y 嗎」的 yes/no 詮釋是 collapse、對稱論述是把多維度（A 防 / B 不防 / 由 C 補）展開回多軸</td>
      </tr>
  </tbody>
</table>
<hr>
<h2 id="判讀徵兆">判讀徵兆</h2>
<table>
  <thead>
      <tr>
          <th>徵兆</th>
          <th>該做的事</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>Mitigation 段只寫 in-scope、沒寫 out-of-scope</td>
          <td>補對稱論述、加 out-of-scope + 補強路由</td>
      </tr>
      <tr>
          <td>「使用 X 防 Y」單句、Y 是抽象詞（傳輸風險 / 身分風險）</td>
          <td>Y 太寬、specific 化 Y 的 in-scope subset、列出 out-of-scope 補 boundary</td>
      </tr>
      <tr>
          <td>章節 lead 段沒列整體 threat scope</td>
          <td>補章節級 threat model、確立 scope qualifier 的 anchor</td>
      </tr>
      <tr>
          <td>多個 mitigation 段並列、各自寫 mitigation、沒寫疊加 gap</td>
          <td>補疊加 audit、聯集 in-scope vs 整體 threat space、找 gap</td>
      </tr>
      <tr>
          <td>把「不防 Y」寫成獨立警告段、跟 mitigation 分開</td>
          <td>對稱論述應該同句承載、分開寫會被讀者跳過或當成「進階補充」</td>
      </tr>
      <tr>
          <td>Reviewer 讀完問「那 Z 攻擊呢？」</td>
          <td>Z 在 reader 直覺 in-scope、原文沒對稱寫、補 Z 為 out-of-scope 並標路由</td>
      </tr>
      <tr>
          <td>「之後讀者實作時會自己想到 boundary」</td>
          <td>是 <a href="../external-trigger-for-high-roi-work/">#72</a> 結構性跳過、補 audit trigger</td>
      </tr>
  </tbody>
</table>
<hr>
<h2 id="適用範圍與邊界">適用範圍與邊界</h2>
<ul>
<li><strong>適用</strong>：所有資安 mitigation 論述（auth / crypto / 傳輸 / 防護 / 標準引用）；高風險領域的「方法論述」（concurrency primitive 的 ordering 保證、distributed consensus 的 failure mode）</li>
<li><strong>不適用</strong>：純歷史 / 概念介紹文章（不教 mitigation、不需 threat model）、研究探討（讀者預期自行 explore boundary）</li>
<li><strong>邊界</strong>：「對稱論述」≠「列出所有不防的 threat」——只列讀者直覺會 extrapolate 的方向、不是 enumerate 整個 threat space。判別準則：「讀者讀完 X 防 A 之後、心裡最可能誤以為 X 也防的 B 是什麼？」——B 就是該寫的 out-of-scope</li>
<li><strong>過度對稱反例</strong>：每個 mitigation 列十個 out-of-scope threat、文體變 audit-driven（為了 audit checklist 而寫）、不是 reader-driven（為讓讀者建立可驗證 mental model 而寫）；單一 mitigation 的 out-of-scope 通常 1-2 個直覺 extrapolation 方向就夠、列 10 個 = 把 audit 模板當成寫作目標、退化成 #67 寫作便利度反向</li>
</ul>
<p>本卡是資安 audit 第一個維度（threat model）、配 #102 mitigation 對位、#103 context-dependence、#104 citation 形成完整的 audit dimension 集合。</p>
]]></content:encoded></item></channel></rss>