Blog chevron_right 未分类

过时的 Java 中潜藏的威胁

确保企业系统尽可能安全,这应该是不言自明的,不是吗?遗憾的是,由于需要考虑的安全问题太多,某些最重要的地方往往忽略了这一点。

例如,Java 运行时。

2019 年之前,使用最新的安全补丁更新 JDK 非常简单,而且不会产生直接成本。当 Sun Microsystems 发布 Java 时,您可以免费下载 Java 开发工具包,除非将其用于某种嵌入式或一次性应用程序(例如使用嵌入式 PC 的售票亭)。即使 Java 的新版本每隔两三年甚至四年才发布一次,它们与免费更新的持续供应也有很大的重叠,从而确保了平稳过渡。

Oracle 在 2010 年收购了 Sun 之后,继续以同样的方式提供 JDK,一直到 2019 年。第一个变化是从基于功能的发布计划变为基于时间的发布计划。如今,Java 新版本的发布变得像时钟一样规律,每年三月和九月各发布一次。

这种更快的发布节奏导致 Oracle JDK 长期支持 (LTS) 版本的推出,因为为所有版本提供扩展维护和支持并不现实。最初,每三年发布一次新的 LTS,但现在已缩短为两年。

当前的 LTS 版本有 JDK 8、11、17 和 21。Oracle 已经停止对较早的开源 Java 版本(JDK 6 和 7)提供支持,包括商业支持。

在 Azul 的 2024 年 Oracle 使用、定价和迁移情况调查与报告中,37% 的参与者使用 JDK 17,比任何其他版本都要多。

安全更新有多重要?毕竟,Java 现在已有将近 30 年的历史;难道我们现在还没有消除所有漏洞吗?遗憾的是没有,而且实际上,这是不可能的。OpenJDK 包含 750 万行代码,依赖于许多外部库,而所有这些库都可能存在未被发现的漏洞。

我们用一些确凿的数据来说明这一点。

基于过时 Java 构建的应用程序暴露于漏洞之下

假设您在 JDK 6 上运行应用程序,并且自 Oracle 停止免费公开更新(2013 年 4 月)以来一直没有更新。在这种情况下,您的应用程序面临总共 425 个漏洞,其中 89 个为关键漏洞。

及时更新系统的能力至关重要。

Oracle 为每个更新提供了两个版本,称为关键补丁更新 (CPU) 和补丁集更新 (PSU)。CPU 包含仅安全方面的变更;PSU 包含安全方面的变更、错误修复、性能改进和任何其他代码变更。大小差异显著。大型 CPU 可能包含 15 个更改,但通常少于 10 个。另一方面,一个 PSU 可能包含 200 到 400 个变更。

属性 CPUs PSUs
变更类型 仅安全方面的变更 任何代码变更,包括安全方面的变更、错误修复和性能改进
变更数量 通常少于 10 个 200-400 之间

PSU 可能会产生重大影响

更新中包含的变更越多,其中某项变更影响应用程序功能的可能性就越大。由于两次更新之间的间隔只有三个月,只能对应用程序进行有限的测试。这会导致 PSU 产生重大影响的情况。例如,2022 年 7 月的 PSU 包含一个修复程序,该修复程序阻止基于 Hadoop 集群、基于 Solr 和基于 Lucene 的应用程序正常工作。

自 Oracle 变更其发行版和许可以来,已进行了 22 次更新。其中,有 6 个 PSU 需要修改和发布新版本,以解决出现的回归问题。创建新更新的时间从不到两周到超过五周不等。从来没有任何 CPU 受到过这样的影响。要最大程度地保证应用程序的安全,访问 CPU 至关重要。

由于 OpenJDK 的所有免费二进制发行版都只提供 PSU 版本,一些用户可能会认为几周之后才能部署,这是可以接受的风险。

这非常危险。

使用 Apache Strusts 的未打补丁系统受到攻击

当 JDK 更新发布时,所有已解决的漏洞都会在发行说明中披露。不良分子现在掌握了信息,他们能够设法利用未打补丁的应用程序。

我们以常用的 Java 库 Apache Struts 为例,来说明这可能会带来多大的危险。

2023 年 12 月 7 日,发布了有关 Struts 漏洞的详细信息。通用漏洞评分系统 (CVSS) 对此漏洞的评分为 9.8 分(满分 10 分),属于严重漏洞。此外,它还有可能允许远程代码执行 (RCE),这比可用于拒绝服务 (DOS) 的漏洞要严重得多。

仅仅四天后,就发布了概念验证代码,展示如何利用此漏洞。在此代码发布后的 24 小时内,未打补丁的系统就遭到攻击。等待两周或更长时间,才有可用的 Java 更新,这将使您的应用程序暴露在危险之下。您愿意承担这个风险吗?

Azul 的 Platform Core 提供经过 TCK(技术兼容性套件)测试的 OpenJDK Zulu 版本,每个季度都涉及 CPU 和 PSU。它还支持 JDK 6 和 7。这为您的任务关键型企业 Java 应用程序提供了最大的安全性和稳定性,而无需强制将旧应用程序升级到新版本。