如何确保您的 Java 应用程序安全
在之前,大多数 Java 用户访问 JDK 更新的方式发生了变化。其原因是 Oracle 对 JDK 的开发方式和 Oracle JDK 的许可条款所做的更改。
Oracle JDK 11 和 Oracle JDK 8(从更新 211 开始)现在使用 Oracle 技术网络许可协议。这将免费使用限制为仅四种情况:
- 个人使用(用于个人应用程序的笔记本电脑或台式机)
- 开发使用
- Oracle 批准的产品使用
- Oracle 云基础架构使用
对于所有其他情况,必须从 Oracle 购买 Java SE 订阅。
这要求用户就他们的 JDK 部署策略做出决定。一种这样的方法是“好吧,它在我们现在拥有的 JDK 上运行良好;让我们坚持下去吧”。
这有一个明显的缺陷,即该决定将对应用程序的安全性产生的影响。
自从人们开始开发软件以来,其他人一直在努力寻找以非预期方式使用它的方法。这通常是出于恶意目的,例如窃取信用卡号或用户身份。我们使用术语黑客来描述能够破坏计算机安全的人。黑客可以通过无数种方式来实现他们的目标;从欺骗人们泄露机密信息(网络钓鱼)到通过缓冲区溢出等技术对软件进行复杂的操作。
不幸的是,软件越复杂,黑客利用漏洞的可能性就越大。JDK 是一个非常复杂的软件,因此可能包含漏洞。
当发现软件中的漏洞时,它们通常被记录为常见漏洞和暴露 (CVE)。由 Mitre Corporation 运营的国家网络安全 FFRDC 维护 CVE 数据库。每个由唯一编号标识的 CVE 都有漏洞的文本描述。
此外,每个 CVE 都有一个通用漏洞评分系统 (CVSS) 值。这不包含在 CVE 中,但在由美国国家科学技术研究院 (NIST) 托管的国家漏洞数据库中维护。CVSS 提供了一个基本分数和一组指标。基本分数是一个介于 0.1 和 10.0 之间的值,表示漏洞的严重程度(从技术上讲,基本分数从 0.0 开始,但根据定义,任何分数为零的东西都不是漏洞)。基本分数是根据一组指标计算得出的,这些指标表明漏洞的不同方面。这些指标涉及诸如是否可以通过网络利用漏洞、是否需要对机器进行物理访问等事项。
- 0.0:无
- 0.1-3.9:低
- 4.0-6.9:中等
- 7.0-8.9:高
- 9.0-10.0:严重
让我们看看让您的 JDK 保持最新状态有多么重要。
首先,我回顾了过去三年的更新,并提取了每个都解决的具有最高 CVSS 基础分数的漏洞。这显示在下表中。
处理器日期 | 最高 CVSS | 受影响的 JDK 版本 |
2020 年 7 月 2020 年 4 月 2020 年 1 月 2019 年 10 月 2019 年 7 月 | 8.38.3(多个) 8.1 6.8(多个) 6.8 | 7、8、11、147、8、11、13、14 7、8、11、13 7、8、11、13 7、8、11、12 |
2019 年 4 月 | 9.0 | 8 |
2019 年 1 月 | 6.1 | 6、7、8、11 |
2018 年 10 月 | 9.0 | 8,11 |
2018 年 7 月 | 5.9 | 6、7、8、10 |
2018 年 4 月 | 8.3 | 6、7、8、9、10 |
2018 年 1 月 | 8.3(多个) | 6,7,8,9 |
2017 年 10 月 | 9.6(多个) | 6,7,8,9 |
2017 年 7 月 | 9.6(多个) | 7,8 |
如您所见,大多数更新至少解决了一个高评分漏洞,并解决了几个关键漏洞。当我们将其限制为 Oracle Java SE 许可更改后的更新时,我们仍然看到一个具有严重漏洞,三个具有高漏洞。有趣的是,2019 年 4 月更新中解决的关键漏洞存在于用于构建 JDK 的 Windows DLL 中,而不是任何 JDK 代码中。
接下来,我分析了自 2015 年 1 月以来的所有更新,这些都是现成的信息。查看所有解决的漏洞并将它们划分为风险组,我们可以生成一个条形图,如下所示:
我将关键的分成两部分,以突出显示有多少个得分为 10 的。
如您所见,总共解决了 320 个 CVE,其中大部分处于中低范围。关键 CVE 的数量是 59,这会让您思考保持 JDK 最新的重要性。
然而,还有一点复杂。
Oracle 为每个更新提供了两个不同的版本;这对于他们所有的软件都是一样的。这些称为重要补丁更新 (CPU) 和补丁集更新 (PSU)。
CPU 仅包含与解决安全漏洞相关的更改。PSU 提供所有这些更改,以及任何其他错误修复、小幅增强等。这样做的原因是为了在需要修补关键漏洞时快速推出更新。由于 CPU 包含的更改集较小,因此不太可能对应用程序的稳定性产生影响(即不太可能阻止您的应用程序工作)。使用 CPU 完成触摸测试后,您可以部署它以确保应用程序的最大安全性。然后,在将 PSU 部署到生产机器之前,您可以花更长时间测试 PSU(通常运行一整套回归测试)。这确保了您的应用程序的最大稳定性。
这里需要注意的一点是,并非所有 OpenJDK 二进制提供程序都了解 CPU 和 PSU 之间的区别。有些人称他们的更新为 CPU,而实际上它是 PSU。在部署之前,您应该仔细查看所获得的内容。
为了突出同时拥有 CPU 和 PSU 的好处,我们只需要看看 2020 年 7 月的更新。这包括对一个本身引入回归的错误的修复。这种回归的影响是大量使用的软件,如 Hadoop Cluster、Solr 和 Lucene 不再可靠地工作,这对于使用它们的任务关键型应用程序来说是一个严重的问题。回归不在安全补丁中,因此不包含在 CPU 中。
7 月 27 日(即预定的 7 月更新发布后的 12 天)发布了作为更新 265 的修复,从而解决了回归问题。初始更新包含对基本分数为 8.3 的 CVE 的修复,其详细信息已在发行说明中公开。如果您使用的是受影响的软件系统之一,如果您只有全包式 PSU,黑客将有近两周的时间来尝试利用它。如果您还可以访问 CPU,您就可以推出必要的安全补丁,保护您的系统免受威胁,然后无忧无虑地等待修订后的 PSU 发布。
Azul 的 Zulu Enterprise 版本的 OpenJDK 面向希望确保其系统提供最高级别的安全性和稳定性的用户。除了提供每个更新的 CPU(安全)和 PSU(完整)版本之外,我们还努力在 Oracle 发布它们的版本后尽快交付这些更新。自 JDK 8 的免费公开更新结束后,Zulu Enterprise 客户可以在 Oracle 发布后的一小时内下载更新。这基本上是同时的。
总之,很明显,确保所有运行基于 JVM 的应用程序的系统都保持最新更新是多么重要。