Black Hat Europe 2025 | The Fragile Lock: Novel Bypasses For SAML Authentication
三句話摘要
研究人員揭示利用 XML 解析器差異與「虛空規範化」技術,實現對 SAML 身份驗證的完全繞過攻擊。 SAML 的安全性長期建立在解析器行為差異與單人維護的 libxml2 之上,任何使用 Ruby SAML(< 1.18.0)或未經審查的 PHP XML 簽名庫的系統都應立即升級,否則攻擊者僅需一個電子郵件地址即可完全繞過身份驗證。 簽名包裝攻擊的歷史盲點:過去 20 年的簽名包裝(Signature Wrapping)攻擊研究僅聚焦於「權限提升」,從未實現完整的身份驗證繞過鏈;本研究首次將其升級為徹底入侵目標系統。
重點整理
重點- 1
簽名包裝攻擊的歷史盲點:過去 20 年的簽名包裝(Signature Wrapping)攻擊研究僅聚焦於「權限提升」,從未實現完整的身份驗證繞過鏈;本研究首次將其升級為徹底入侵目標系統。
- 2
XML 解析器不一致是根本弱點:GitLab Enterprise 使用的 Ruby SAML 同時依賴 rexml(用正規表示式解析 XML)與 Nokogiri(libxml2 的封裝),兩者對命名空間前綴、重複屬性、文件類型宣告的處理行為不同,攻擊者可在驗證層「隱藏」惡意節點,在業務邏輯層「顯示」偽造斷言。
- 3
虛空規範化(Void Canonicalization)創造黃金 XML:透過插入精心設計的相對 URI 宣告,讓 libxml2 的規範化函式返回空字串但 Nokogiri 忽略該返回值,最終對空字串計算雜湊值並塞入簽名,製造出「始終通過驗證」的 XML,無需任何有效私鑰。
- 4
整個 SAML 生態系建立在脆弱地基上:libxml2 的 README 明確說明整個專案僅由一人維護且存在大量安全漏洞;SAML 的複雜性(XPath、XSLT、規範化)製造了龐大攻擊面,或許是時候淘汰 SAML。
實用技巧與重點
乾貨- 漏洞與 CVE:
- GitLab Enterprise 版本:17.8.4(完全身份驗證繞過)
- Ruby SAML 修復版本:1.18.0(完整重寫兩庫協作邏輯);1.12.4 僅熱修復、仍有殘留漏洞
- 相關 CVE 已於研究公開前(2025 年 3 月)由維護者發布
- 工具與函式庫:
- Ruby SAML 庫(業務邏輯:rexml;簽名驗證:rexml + Nokogiri)
- Nokogiri(libxml2 的 Ruby 封裝)
- libxml2(C 語言,底層 XML 處理核心)
- Rob Richardson XML Signature Library(PHP,GitHub 上廣泛複製貼上使用,直接忽略 libxml2 的 false 返回值)
- Okta(身份提供商,預設對外暴露已簽名的聯合元數據)
- Microsoft Entra(可用於查詢聯合元數據信封簽名)
- 攻擊四步驟流程:
- 在頂層插入相對 URI 宣告,破壞規範化邏輯,使簽名值計算為空字串
- 對空字串計算雜湊值,得到「黃金摘要值」,永遠通過驗證
- 取得有效信封簽名(來源:Okta 聯合元數據、Microsoft Entra 元數據,或在 SAML 請求中放置高位 ASCII 字元的 ID 觸發無效規範化)
- 將惡意斷言放入 XML Schema 允許的擴展節點(如 AccessExtension 或 SubStatusDetail)
- 攻擊效果與條件:
- 只需知道受害者電子郵件地址(可從 LinkedIn 取得)
- 若目標啟用 2FA,可利用「帶引號的郵件地址」在服務提供商側創建新使用者帳號
- Okta 即使刪除開發者帳號後,聯合元數據 URL 仍持續有效
- 受影響範圍:
- 所有 Ruby SAML 實作(< 1.18.0)
- PHP XML 簽名函式庫(Rob Richards 版本,廣泛複製於 GitHub 各 SAML 提供商)
- 不受影響:C 語言實作(正確檢查返回值)、Java(不使用 libxml2)
結論
結論“SAML 的安全性長期建立在解析器行為差異與單人維護的 libxml2 之上,任何使用 Ruby SAML(< 1.18.0)或未經審查的 PHP XML 簽名庫的系統都應立即升級,否則攻擊者僅需一個電子郵件地址即可完全繞過身份驗證。”
完整解析
詳細SAML 作為企業單點登入的核心標準已有 20 年歷史,其安全性完全建立在身份提供商(如 Okta)以私鑰對 XML 斷言簽名這一機制之上。研究者從 Juho Forsman 關於 XML 序列化與反序列化不一致性的研究出發,於 2024 年 9 月開始深入挖掘,並迅速發現當時最新版 GitLab Enterprise 存在完整身份驗證繞過漏洞。此前針對 SAML 的簽名包裝攻擊僅被用於權限提升,從未出現過完整利用鏈——這正是本研究的突破點。
GitLab Enterprise 使用的 Ruby SAML 庫在業務邏輯層使用 rexml(一個以正規表示式解析 XML 的解析器),在簽名驗證層則同時使用 rexml 和 Nokogiri(libxml2 的 Ruby 封裝)。研究者發現,當 XML 元素存在兩個相同屬性時,rexml 不遵循 XML 標準的限制(通常應拋出錯誤),這使得攻擊者可以向 rexml 隱藏真正的簽名,同時讓 Nokogiri 看到另一個偽造版本。兩個解析器針對 XML 命名空間前綴的不同處理方式,進一步放大了這種差異:透過在 XML 前綴下重新聲明命名空間,可讓 Nokogiri 認為某個簽名節點根本不是數位簽章,從而在驗證層將其忽略。
關鍵突破來自「虛空規範化(Void Canonicalization)」技術。XML 規範化標準明確禁止使用相對 URI 作為引用元素的 URI,libxml2 的對應函式遇到相對 URI 會返回 false 並中止。然而,Nokogiri 作為封裝層直接忽略這個返回值,將緩衝區輸出當作有效結果使用。攻擊者因此可在頂層插入精心設計的相對 URI 宣告,完全控制規範化的輸出——使其成為空字串,再對空字串計算 SHA-256 雜湊值塞入摘要欄位,製造出「黃金 XML」:無論斷言內容為何,此 XML 永遠能通過簽名驗證。PHP 的 Rob Richardson XML 簽名庫因相同原因——忽略 libxml2 的 false 返回值——也受到相同影響,且在 GitHub 上被廣泛複製貼上至各類 SAML 實作中。
在現場演示中,研究者針對 GitLab Enterprise 17.8.4 搭配 Okta 的環境,僅憑目標使用者的電子郵件地址,透過自製的瀏覽器擴充套件在幾秒內完成身份驗證繞過並以任意使用者身份登入。Okta 預設對外公開已簽名的聯合元數據,使攻擊者無需任何特殊條件即可取得有效信封簽名。真實目標的案例研究顯示,即便服務商自訂了快取保護機制,也可轉而利用 Microsoft Entra 的聯合元數據繞過;若目標帳號啟用了雙重驗證,可利用帶引號的郵件地址格式在服務提供商側創建新帳號。目前 Ruby SAML 1.18.0 已完整修復,但 1.12.4 分支僅有熱修復且官方已宣布停止支援;整個 SAML 生態系的根本隱患——單人維護的 libxml2 及其複雜的攻擊面——在可預見的未來仍將持續存在。
關鍵時刻
Pipeline v2帶時間戳的重點,會在逐字稿層級分析上線後產生。目前請先透過原始影片觀看。
事實查核
Pipeline v2說法查證是下一次管線升級的一部分。KeyFrame 只會顯示它真正能驗證的內容。

