開發者工具 · JWT 解碼器
alg:none 攻擊與金鑰混淆:為什麼驗證者必須固定演演算法
· 為什麼它很重要
jwt 安全 密碼學
如果驗證者讓令牌選擇自己的演演算法,攻擊者可以不選擇任何演演算法或將 RSA 替換為 HMAC。這篇文章解釋了這兩種攻擊以及防止它們的規則。
驗證自身的令牌 - 標頭欄位如何成為攻擊面
演演算法標籤位於攻擊者控制的令牌輸入。如果驗證者將該標籤視為選擇任何可用驗證模式的權限,則令牌開始影響用於判斷自身的規則。 ToolAcre 精確地公開標籤,以便審閱者可以看到它,但從不以加密方式對其進行操作。
安全方向是相反的:可信任服務配置定義可接受的演演算法係列和關聯金鑰,然後傳入標頭必須符合該策略。解碼面板無法提供該策略,並不能僅僅因為它突出顯示可疑值而被誤認為是保護。
儲存庫標記 alg:none 但未建立不安全 JWT 背後的規範歷史記錄
此實作將 `alg: none` 視為未簽署的宣告,並警告接受它將接受任意內容。它也單獨報告一個空的第三段。儲存庫證據支持在經過身份驗證的工作流程中拒絕此類輸入;它沒有記錄為什麼不安全的 JWT 最初包含在規範中。
因此,歷史措詞是更正的而不是發明的。操作上重要的事情很清楚:需要簽署憑證的服務不得允許令牌標頭停用簽章檢查。 ToolAcre 本身不會執行任何驗證,因此它顯示 `none` 的能力只是為了檢查而進行的檢測。
alg:none 攻擊 — 剝離簽名並要求驗證者接受空白簽名
未簽名攻擊會更改標頭以請求 `none`,根據需要更改宣告,並不提供簽名字節。每個段落在語法上仍然有效,前兩個段落解碼為經過修飾的 JSON。寬容的驗證者會將攻擊者的偏好轉換為身分驗證繞過。
嚴格驗證者沒有在需要簽章令牌時將此輸入升級到受信任狀態的分支。 ToolAcre 的警告有助於在偵錯期間識別形狀,但讀取單字 `none` 並不能阻止後端做出錯誤的決定。強制執行屬於憑證被消耗的地方。
金鑰混淆 — 將公鑰作為 HMAC 秘密提供,以便將 RS256 令牌驗證為 HS256
當驗證者允許具有不相容金鑰角色的演演算法系列並無法將每個選擇綁定到正確的金鑰類型時,就會出現金鑰混淆。公共 RSA 驗證金鑰不是 HMAC 秘密。在攻擊者更改演演算法標籤後將其位元組視為 1 會破壞預期的 public/private 分隔。
防止此類錯誤需要的不僅僅是檢查簽名形狀的段。該服務必須透過可信任配置來配對預期的演演算法、金鑰類型、發行者和令牌設定檔。顯示 RS256 或 HS256 的解碼器無法判斷後端是否維護這些綁定。
修復 - 將接受的演演算法固定在驗證器中,並永遠不要從令牌中派生它們
在驗證者配置中固定接受的演演算法,並在發行人合約允許的範圍內保持清單的範圍盡可能窄。拒絕簽章憑證流的 `none` 並拒絕不匹配,而不是嘗試其他演演算法。不要從未經驗證的標頭或有效負載宣告中派生允許清單。
鍵找出遵循相同的原則。 `kid` 可以在已信任的候選人中進行選擇,但不得建立新的信任來源。不應僅僅因為令牌請求標頭 URL 或嵌入金鑰而遵循它們。驗證者獨立決定其來源。
工作範例 - 讀取 ToolAcre JWT 解碼器中的標頭以發現 alg:none,以及為什麼發現它與受保護不同
建立一個無害的令牌標頭,宣告 `none` 並將第三段留空。 ToolAcre 解碼 JSON,報告宣告的演演算法,警告它未簽署並記錄缺少的簽名。這正是檢查工具所期望的行為。
該練習並不能證明 API 拒絕令牌。透過針對實際驗證器和配置的受控負面測試單獨確認這一點。如果 API 接受它,則修復屬於該驗證邊界;向解碼器添加更大聲的警告不會保護請求。
這不包括 - 許多特定於庫的修復;請參閱 RFC 8725 和您的庫的變更日誌
庫 API、預設值和歷史修復因產品和版本而異。該模組沒有確定哪個選項名稱將演演算法固定在堆疊中,本文有意不發明任何內容。閱讀所選庫的當前檔案和變更日誌,然後在您自己的測試套件中練習拒絕案例。
也測試錯誤的金鑰類型、未知的 `kid` 值、缺少簽章和意外的令牌設定檔。目標是表明配置勝過令牌建議。成功的解碼不屬於這些接受斷言,因為語法成功與每個惡意範例相容。
重點:由驗證者決定,而不是令牌 — 解碼器可以幫助您查看標頭,但只有固定驗證才能保護您
驗證者決定;令牌沒有。 ToolAcre 可能會顯示標有 `none` 的標頭、不熟悉的演演算法或令人驚訝的密鑰標識符。這種可見性有助於分類,但只有固定的演演算法策略和正確綁定的可信任金鑰才能阻止接受。
絕不建議啟用 `none`、從不受信任的標頭中選擇驗證金鑰或將顯示的簽章長度視為驗證。解碼進行檢查,然後透過受控測試證明真實加密邊界上的拒絕和接受行為。