資訊中心管理
隱藏威脅逼近:過時的 Java 系統安全風險
前往目錄
保持企業系統的安全應該是理所當然的,對吧?但現實中,由於安全性涉及的層面太多,反而容易忽略一些最關鍵的部分,例如 Java 執行環境。

在2019 年之前,確保 JDK 保持最新的安全更新相對簡單,且不需要額外付費。當 Sun Microsystems 推出 Java 時,除了用於嵌入式系統或單一用途應用(例如使用內嵌電腦的售票機)外, 開發者可以免費下載 Java 開發工具包。 即使 Java 發布了新版本,舊版本仍有一段免費更新的緩衝期,讓使用者可以平穩過渡。

2010 年,Oracle 收購 Sun Microsystems,最初仍維持相同的 JDK 發布方式,直到 2019 年才開始改變政策。他們將 Java 的發布模式從基於功能(feature-based)改為基於時間(timebased),即每年固定在 3 月和 9 月發布更新版本。由於發行節奏加快,Oracle 引入長期支援版(LTS,Long-Term Support),但不可能對所有版本都提供長期維護與技術支援。最初每三年才會有一個 LTS 版本,但現在縮短為兩年。

目前的 LTS 版本為 JDK 8、11、17 和 21,而 JDK 6、7 這些較舊的開源版本已經不再受到 Oracle 官方的支援,即使是付費商業版本也已停止支援。

安全更新到底有多重要呢? Java 已經有將近 30 年的歷史了,難道還沒把所有的漏洞都修補完嗎?

遺憾的,並沒有,而且現實上,這永遠不可能發生。OpenJDK 包含 750 萬行程式碼,並依賴許多外部函式庫,而這些 元件可能都還隱藏著尚未發現的安全漏洞。接下來,我們將透過具體數據來說明這個問題的嚴重性。

在 Azul 發布的 2024 年 Oracle 使用、定價和遷移調查與報告中,37% 的參與者使用 JDK 17,比其他任 何版本都多。
Azul 發布的 2024 年 Oracle 使用、定價和遷移調查與報告中,37% 的參與者使用 JDK 17,比其他任何版本都多。

基於過時Java建置的應用程式存在漏洞

如果你的應用程式是建立在過時的 Java 版本上,將會面臨許多安全漏洞的風險。

舉例來說,如果你的應用程式仍然使用 JDK 6,並且自 2013 年 4 月 Oracle 停止提供免費更新後就沒有再更新,那麼你的系統已經暴露在 425 個安全漏洞之下,其中 89 個屬於嚴重漏洞,這可能讓你的應用程式容易遭受攻擊。

即時更新系統至關重要,因為這關係到系統安全性。Oracle 針對每次更新提供兩種版本,可稱為關鍵修補更新 (CPU,Critical Patch Update)和補丁集更新(PSU,Patch Set Update)。 CPU 更新僅包含與安全性相關的修正, 不會影響其他功能,通常變更範圍較小,即使是較大的更新,修正項目通常也少於 10 項,最多不超過 15 項。而 PSU 更新除了包含安全性修正,還包 含錯誤修復、效能改善與其他程式碼變更,因此更新規模較大,每次更新可能涉及 200 到 400 項變更。

隱藏威脅逼近: 過時的 Java 系統安全風險

 PSU更新可能帶來重大影響

更新中包含的變更越多,應用程式的功能受到影響的可能性就越大。由於每次更新之間僅隔三個月的時間,但應用程式的測試時間有限,這導致某些 PSU 更新可能會對系統產生重大影響。例如,2022 年 7 月的 PSU 包含一個修復程序,但該修復程序阻止基於 Hadoop Cluster、Solr 和 Lucene 的應用程式正常運作。

自從 Oracle 調整發行版本與授權模式以來,總共發布了 22 次更新,其中有 6 次 PSU 更新由於引入新的錯誤,必須進行修正並重新發布。從發現問題到推出修正更新的時間從不到兩週到超過五週不等。而 CPU 更新則從未受到類似影響, 因此取得 CPU 更新對於維持應用程式的最高安全性至關重要。

然而,所有免費的 OpenJDK 二進位發行版本僅提供 PSU 版本,因此部分使用者可能認為等待幾週才能部署更新是可以接受的風險,但這其實是非常危險的。

利用Apache Struts來攻擊未打補丁的系統

當 JDK 更新發佈時,所有已修復的漏洞都會在發行說明中公開,這會讓攻擊者能夠獲取相關資訊,並試圖尋找尚未修補的應用程式來加以利用。這種風險可能帶來嚴重後果,讓我們以 Java 常用函式庫 Apache Struts 為例說明。

2023 年 12 月 7 日,Struts 漏洞的詳細資訊被公佈。根據通用漏洞評分系統(CVSS),該漏洞的評分高達 9.8 分,屬於嚴重級別漏洞。此外,這個漏洞可能導致遠端程式碼執行(RCE),這比僅能用於阻斷服務(DoS)的漏洞危害更大。

僅僅四天後,就有概念驗證(PoC)程式碼被發布,展示了如何利用這個漏洞。而在該程式碼公開後的 24 小時內,就在未修補的系統上觀察到攻擊。如果必須等待兩週甚至更久才能獲得可用的 Java 安全更新,那麼應用程式將暴露在風險之中。這樣的風險,您能承擔嗎?