# SAML，內部構造：信件中的簽章

Published: 2026-09-24

SAML 讓您登入幾乎所有工作應用程式，其簽章存在於它簽署的 XML 內部。深入探討：應用程式、瀏覽器和身分提供者之間的登入過程，斷言的樣子，為什麼規範化必須在每個位元組上達成一致，以及為什麼從 2012 年到 2025 年，相同的錯誤類別不斷重現。受 Trail of Bits 的「SAML：糟糕設計的碎形」(在 Hacker News 上獲得 312 點) 啟發。

Canonical: https://thedailydiff.dev/zh-TW/video/2026-09-24-saml-under-the-hood/

## 本影片重點

- SAML：從內部簽署自己的登入
- 2002 年：四種 XML 格式，一個委員會，一個完整產業
- 登入過程：應用程式 → 身分提供者 → 透過您的瀏覽器返回
- 斷言：簽章存在於它簽署的內容內部
- 規範化：在每個位元組上達成一致，否則無人能登入

## 章節

- 0:00 SAML：從內部簽署自己的登入
- 0:34 2002 年：四種 XML 格式，一個委員會，一個完整產業
- 0:46 登入過程：應用程式 → 身分提供者 → 透過您的瀏覽器返回
- 0:59 斷言：簽章存在於它簽署的內容內部
- 1:10 規範化：在每個位元組上達成一致，否則無人能登入
- 1:32 2012 年：檢查器和讀取器查看不同的元素
- 1:51 2018 年和 2025 年：兩個解析器，兩個不同的答案
- 2:08 為什麼它不斷崩潰：糟糕設計的碎形
- 2:27 星期一：首先是 OIDC，一個維護良好的程式庫，嚴格的形狀
- 2:43 內部構造的判決：REVERT

## 翻譯文字稿

譯自英文原版旁白。可用的音訊和字幕由 YouTube 控制。

### SAML：從內部簽署自己的登入

0:00 SAML 是一種 XML，可讓您登入幾乎所有您擁有的工作應用程式， 其簽章存在於它簽署的文件內部， 就像公證人將他的印章釘在他正在密封的信封內部一樣。 委員會撰寫十年後，研究人員測試了十四個 SAML 框架。十一個失敗了。 而本週，一篇 Trail of Bits 的文章稱其為糟糕設計的碎形，登上了 Hacker News 的首頁。 三分鐘內：登入過程如何運作，簽章藏在哪裡，

0:27 以及為什麼大家一致同意的解決方案是不同的協定。 這是 The Daily Diff，內部構造。

### 2002 年：四種 XML 格式，一個委員會，一個完整產業

0:34 二○○二年。 Oasis 的一個安全委員會將四種廠商 XML 格式合併為一種。 大學首先採用它，然後 Okta 憑藉它建立了一家公司， 這是委員會文件轉化為收入最快的一次。 您打開應用程式。

### 登入過程：應用程式 → 身分提供者 → 透過您的瀏覽器返回

0:46 它不知道您是誰，所以它會將您的瀏覽器彈回身分提供者， 例如您公司的 Okta。 您在那裡登入。 Okta 會向您的瀏覽器傳遞一份已簽署的 XML 文件，說明您是誰， 然後瀏覽器會將其發回。

### 斷言：簽章存在於它簽署的內容內部

0:59 該文件就是斷言。 它命名了使用者，簽章位於其中， 透過其 ID 指回斷言。 而整個過程都透過您的瀏覽器進行，也就是說， 透過使用者。 為了檢查它，應用程式

### 規範化：在每個位元組上達成一致，否則無人能登入

1:11 重建了被簽署的確切位元組。 它將簽章剪掉，規範化空白和屬性 順序，並雜湊結果。 這就是規範化，如果兩邊相差一個位元組， 沒有人能登入。 JSON Web Token 的做法不同。 標頭、酬載和簽章並排放置，中間用點分隔。 無需先剪掉任何東西。

### 2012 年：檢查器和讀取器查看不同的元素

1:32 這是漏洞。 檢查簽章的程式碼和讀取使用者名稱的程式碼通常是 兩個不同的部分。 在 2012 年，一篇名為《論破壞 SAML》的論文顯示，您可以將已簽署的斷言移到 讀取器忽略它的地方，然後在它查找的地方放置第二個斷言。 Salesforce 和 Shibboleth 是其中十一個受害者。 在 2018 年，Duo 證明使用者名稱中的註解會讓某些

### 2018 年和 2025 年：兩個解析器，兩個不同的答案

1:55 程式庫只讀取一半的名稱，而簽章仍然通過檢查。 在 2025 年，GitHub 發現在 Ruby SAML 內部，兩個 XML 解析器 對同一份文件存在分歧。 相同的錯誤，新的十年。 Trail of Bits 將其稱為碎形，因為您縮放到的每個層級都有

### 為什麼它不斷崩潰：糟糕設計的碎形

2:12 相同的缺陷。它基於 XML，簽章被包裝在其中， 而實際登入可能只使用了規範的十分之一。 Hacker News 上最熱門的回复來自買家。 如果您沒有 SAML 支援，我可以找到有支援的產品。 兩者都屬實，這就是問題所在。 所以，星期一。首先發布 OpenID Connect，Fly 和 Tailscale 將產品銷售給

### 星期一：首先是 OIDC，一個維護良好的程式庫，嚴格的形狀

2:31 完全沒有 SAML 的企業。 如果客戶強制要求，請使用維護良好的程式庫，保持其修補， 並拒絕看起來不像 Okta 或 Google 發送的訊息。 切勿自行編寫簽章檢查。

### 內部構造的判決：REVERT

2:43 內部構造的判決。 REVERT。將近二十五年，一種永遠不死的錯誤類別， 而大家一致同意的解決方案是不同的協定。 上週六我拆解了通行密鑰，所以在評論中告訴我接下來要拆解什麼。 這就是今天的 The Daily Diff。 我是來自 Axrisi 的 Niko。 負責任地合併。

## 來源

- [Trail of Bits, "SAML: A fractal of bad design" (Matt Schwager, Sep 21, 2026)](https://blog.trailofbits.com/2026/09/21/saml-a-fractal-of-bad-design/) — blog.trailofbits.com
- [Hacker News thread](https://news.ycombinator.com/item?id=49806335) — news.ycombinator.com
- [Somorovsky et al., "On Breaking SAML: Be Whoever You Want to Be", USENIX Security 2012](https://www.usenix.org/conference/usenixsecurity12/technical-sessions/presentation/somorovsky) — www.usenix.org
- [Duo Labs, SAML vulnerabilities affecting multiple implementations (2018): https://duo.com/blog/duo-finds-saml-vulnerabilities-affecting-multiple-implementations · CERT VU#475445](https://www.kb.cert.org/vuls/id/475445) — www.kb.cert.org
- [GitHub Security Lab, "Sign in as anyone: Bypassing SAML SSO authentication with parser differentials" (Mar 12, 2025)](https://github.blog/security/sign-in-as-anyone-bypassing-saml-sso-authentication-with-parser-differentials/) — github.blog
