甲骨文於昨日推播了修復了一個漏洞,該漏洞允許攻擊者偽造某些種類的 SSL 證書和握手、雙因素認證資訊,以及由一系列廣泛使用的開放標準產生的授權憑證。這使得攻擊者可以輕鬆地對檔案和其他資料進行數位簽章。
該漏洞影響了 Java 15 及以上版本中對 ECDSA(橢圓曲線數位簽章演演算法)的實現。ECDSA 是一種利用橢圓曲線密碼學原理對資訊進行數位認證的演演算法。與 RSA 或其他加密演演算法相比,ECDSA 的一個關鍵優勢是它生成的金鑰較小,非常適合用於包括基於 FIDO 的 2FA、SMAL 和 OpenID 等標準。
這個漏洞的 CVE ID 為 CVE-2022-21449,最初是由 ForgeRock 安全研究員 Neil Madden 所發現的,他在中寫道:
如果你在這些安全機制中使用 ECDSA 簽名,並且如果你的伺服器在 2022 年 4 月關鍵修補程式更新(CPU)之前執行任何 Java 15、16、17 或 18 版本,攻擊者就可以輕而易舉地完全繞過它們。 如今幾乎所有的 WebAuthn/FIDO 裝置(包括 Yubikeys)都使用 ECDSA 簽名,許多 OIDC 提供商也在使用 ECDSA 簽名的 JWT。
Madden 指出,上述這些受影響的 Java 版本主要是因為它們未能檢查 ECDSA 中的兩個關鍵變數,以確保它們是非零的。
ECDSA 簽名依賴於一個偽亂數,通常表示為 K,用於推導兩個額外的數位 R 和 S。要驗證簽名是否有效,必須檢查涉及 R 和 S 的等式。當等式兩邊相等時,簽名才有效。為了使過程正常工作,R 和 S 都不能為零。
這是因為如果值都是 0,等式兩邊將始終相等,簽名也就一直有效。這意味著只需提交一個空白簽名即可成功通過驗證檢查。
這個 bug 是由相關程式碼從 C++ 改寫成 Java 時引入的,漏洞最早可以追溯到 2020 年 Java 15 釋出的時候。該 bug 在去年 11 月就已被發現並報告給了甲骨文,而甲骨文在推出的 4 月關鍵修補程式更新(CPU)中修復了該問題。
甲骨文在通用漏洞評分系統(Common Vulnerability Scoring System)中將該漏洞的嚴重性評級為 7.5(滿分 10 分),但 Madden 根據他自己的評估,認為該漏洞的嚴重性評級為 10 分。除了 Madden 認為該漏洞十分嚴重,另一位安全專家 Thomas Ptacek 更是將該漏洞評為 「年度加密漏洞」(crypto bug of the year)。
目前 Java 15 及以上版本並沒有像 Java 早期版本那樣被開發者廣泛使用。安全公司 Snyk 在 2021 年統計的資料顯示,當時 Java 15 僅佔了 12% 的份額。