SAML 在設計上是不安全的 | joonas.fi
安全斷言標記語言 (SAML) 是一種用於在各方之間交換身份驗證和授權資料的開放標準。SAML 通常用於單點登入 (“使用 Google 登入”、“使用 Twitter 登入”等)。這意味著當您想登入 example.com 時,example.com 可以信任並使用外部身份驗證提供程式來為您斷言使用者的身份。SAML 是關於跨組織邊界(網路域)傳達這些身份驗證和身份詳細資訊。
雖然 Google支援 SAML用例,但 Google/Facebook 主要使用 OAuth2 來處理這些“使用 Google 登入”一般公共身份驗證流程。
SAML 用於很多地方,它也可能影響您的安全。
SAML 最近出現了災難性的漏洞 ,影響非常大。例如,如果我理解正確(我可能理解,因為安全研究人員轉發了我的反應)芬蘭稅務機關,大多數政府服務和健康記錄系統都很脆弱,攻擊者可能會繼續窺探人們的納稅申報表、健康記錄以及基本上任何可線上獲取的與政府相關的內容。
它在很大程度上被媒體忽略了,也許是因為這些漏洞沒有被利用(或者沒有檢測到這樣的例項)。
為什麼 SAML 不安全?
SAML 使用基於計算值的簽名。這種做法本質上是不安全的,因此 SAML 作為設計是不安全的。
為什麼對計算值進行簽名很危險?
總而言之:一旦您將安全性基於某些計算屬性,您現在就可以利用此計算中的任何缺陷、差異或歧義。計算越複雜,就越危險。SAML 簽名計算非常複雜。
但是讓我們繼續解釋這個概念。讓我們拿一個偽身份檔案(儘管實際 SAML 是 XML):
$ cat assertion.json { "signed_in_user": "Joonas" } |
我們可以簽署上面的檔案,就像一堆位元組:
$ cat assertion.json | sha1sum e58dc03a7491f9e5fb2ed664b23d826489c42cc5 |
現在,如果我們稍微更改檔案(我在 {之前新增了空格)。我們注意到簽名發生了變化:
$ cat assertion.json { "signed_in_user": "Joonas" } $ cat assertion.json | sha1sum 0bc80a9ee02f611b70319c9fe12b7e504107354a |
這是一個非常好的屬性,因為理想情況下,我們希望對安全關鍵文件(SAML 是)的任何更改(即使是那些在 JSON 級別被認為毫無意義的更改)以生成不同的簽名。
此屬性稱為不可延展性。
延展性通用定義:
可以在不破碎的情況下塑造成其他東西的東西的質量,例如粘土的延展性。
我們將blob文件簽名為原始位元組 使得這種不可延展性,即它不能在不破壞它的情況下成形。這是資訊保安領域的理想行為。
SAML 具有延展性,因為它的簽名基於計算值,
為了透過示例進行解釋,讓我們回到 JSON 示例。我們將使用jq (一個 JSON 轉換實用程式)從我們的文件內部計算一些東西:
$ cat assertion.json { "signed_in_user": "Joonas" } $ cat assertion.json | jq . { "signed_in_user": "Joonas" } |
(jq .意味著只需重新列印整個文件)
注意檔案是如何透過管道jq刪除空間的?那是因為在 JSON 級別,空間並不重要。乍一看,這似乎並不有趣,但我們正在快速前往 危險區域。
讓我們對計算值進行簽名:
$ cat assertion.json | jq . | sha1sum e58dc03a7491f9e5fb2ed664b23d826489c42cc5 |
即使檔案仍然有空格修改,簽名現在與原始簽名匹配(來自沒有新增空格的檔案)。
為什麼這很危險?讓我們再次更改檔案:
$ cat assertion.json { "signed_in_user": "EvilAttacker", "signed_in_user": "Joonas" } $ cat assertion.json | jq . | sha1sum e58dc03a7491f9e5fb2ed664b23d826489c42cc5 # the above is because: $ cat assertion.json | jq . { "signed_in_user": "Joonas" } |
簽名仍然與原始檔案匹配。這是因為重複鍵是有效的 JSON,在處理時被刪除,並且大多數 JSON 實現讓最後一個鍵獲勝。
現在,如果您有兩段不同的程式碼來處理 SAML 文件,並且它們對 JSON 重複鍵(= 訊息語義內容)有不同的解釋/解析器行為,會發生什麼?
攻擊者要求身份提供者為他簽署斷言,但由於 SAML 的延展性,他能夠攻擊解析器差異並篡改文件,使其對簽名驗證仍然有效,但可以訪問不同使用者的資料。
現在我希望解釋了延展性和基於計算/解釋內容的簽名是多麼危險。
實踐中的 SAML 漏洞
這些 SAML 漏洞發生的事情並不像我們的 JSON 示例那麼簡單,但這說明了這些漏洞的原理及其根本原因:對計算值和延展性進行簽名。
最新的漏洞是由於 XML 往返不穩定性造成的 (請參閱標題“XML 往返漏洞是什麼樣的”)。
總之,當解析 XML -> 編寫 XML 產生語義不同的文件時,就會出現漏洞,即encode(decode(xmlDocument)) != xmlDocument)。
....
點選標題
讓我們擺脫 SAML。 一些專家似乎推薦 OAuth2 或 OpenID Connect:
- https://twitter.com/pquerna/status/1338517755352387584
- https://github.com/dexidp/dex/discussions/1884
如果供應商向您提供 SAML,請尋求替代方案。
相關文章
- 在AWS上的架構部署與設計架構
- 在wildfly中使用SAML協議連線keycloak協議
- 融雲 IM 在 Electron 平臺上的設計實踐
- 100年後的程式設計是什麼樣子的?(上)程式設計
- 設計好的報表是如何在 web 上顯示的Web
- HTTP/2天生是不安全的 - portswiggerHTTP
- 現在的你,是開發工程師、程式設計師還是碼農?工程師程式設計師
- JUC併發程式設計學習(五)集合類不安全程式設計
- 程式設計師在企業中是如何做需求的程式設計師
- 在國企做程式設計師是怎樣的體驗?程式設計師
- 在中國程式設計師是青春飯嗎?程式設計師
- HTML在網頁設計中是什麼作用?HTML網頁
- 外媒:小米8在設計上模仿了蘋果的iPhone X蘋果iPhone
- 無線通訊在智慧公交系統上的設計應用
- 在HR眼中,一個合格的前端程式設計師是怎樣的?前端程式設計師
- Rust 程式設計影片教程(進階)——025_5 實現不安全的 traitRust程式設計AI
- 什麼是網頁設計的"原子設計”?網頁
- 不要用JWT替代session管理(上):全面瞭解Token,JWT,OAuth,SAML,SSOJWTSessionOAuth
- 造成類在多執行緒時不安全的原因執行緒
- 以前的程式設計師,現在的程式設計師程式設計師
- 類程式設計的WAF(上)程式設計
- 現代化程式設計 — 在 Swoole 上開發 Laravel 框架的應用程式設計Laravel框架
- Rust 程式設計視訊教程(進階)——025_5 實現不安全的 traitRust程式設計AI
- 在小公司程式設計是一種什麼樣的體驗?程式設計
- 5k和5萬程式設計師的差距原來是在於10大程式設計禁忌!程式設計師
- 紋理是怎樣顯示在模型上的模型
- 傳說中的骨灰級程式設計師是如何排查線上問題的程式設計師
- 29-HashMap 為什麼是執行緒不安全的?HashMap執行緒
- 最好的程式是程式設計師在處理其他事情時編寫的程式!程式設計師
- 優思學院|學懂DFMEA,識別設計上的潛在失效模式!模式
- Rust 程式設計影片教程(進階)——025_3 呼叫不安全的函式或方法Rust程式設計函式
- 基於Confluence6資料中心的SAML單點登入設定SSL/TLSTLS
- 現在的程式設計師的程式碼風格真的是超乎我的想象能力程式設計師
- 面試掛在了 LRU 快取演算法設計上面試快取演算法
- 歷史文化展廳在設計上需要遵循哪些原則?
- 程式設計師們,還在掙扎著上不了github嗎程式設計師Github
- Rust 程式設計影片教程(進階)——025_1 不安全 Rust 介紹Rust程式設計
- 簡單易懂的設計模式(上)設計模式