首页 > 解决方案 > 出于安全原因升级 Java 运行时,无需使用较新的 Java 版本重新编译应用程序

问题描述

我有一个用 Java 5 编译的旧 Web 应用程序,由于各种原因,它不容易升级到 Java 的新版本,并且目前在 Java 5 下运行。

我的问题是使用较新版本的 Java 运行旧 Web 应用程序(无需使用较新 Java 版本重新编译应用程序并假设这不会导致运行时错误)是否会以任何显着方式减轻旧 Java 运行时的安全风险环境?

(我特指与旧 Java 运行时环境相关的安全风险,我知道传递到较新的 Java 版本不会降低与 XSS 等相关的安全风险)。

标签: javasecurityjvm

解决方案


通常,最好使您的 Java 运行时保持最新。当然,升级是否能减轻任何安全风险取决于应用程序。一个“你好世界!” 应用程序可能不会受到影响,因为它没有安全要求,没有攻击向量并且无论如何也不使用太多运行时组件(攻击面)。

但是,Web 应用程序通常在应用程序服务器上运行,这可能会使用 Java 来实现其 TLS。这意味着您的 TLS 实施很可能多年未收到升级。尽管与 C 相比,Java 在阻止某些攻击方面具有一些优势,但肯定会存在其他漏洞。例如,Heartbleed 极不可能成为问题,因为它依赖于缓冲区溢出,而 Java 具有针对这些溢出的内部保护。PKCS#1 v1.5 填充预言可能适用,因为它取决于实际实现。

由于 Java 可执行文件本身并没有特别容易被利用的错误,它主要取决于从服务器、库和应用程序的运行时类中使用的功能(按此顺序,服务器更有可能占用大量资源) )。升级您的 Java 版本服务器 + 库。一些实用程序库的优先级可能较低,具体取决于其功能,但请保持警惕。如果例如 Apache Commons Codec 出现问题,您不希望出现漏洞。

更重要的是:为您的系统制定更新和升级策略并坚持下去。测试量取决于您是否必须更新或升级系统;如果实施得当,您可以进行更新的自动化测试并进行全面的升级测试。希望这些库使用语义版本控制,以便可以将升级与更新区分开来。


如果在较新版本上运行它不会导致运行时错误取决于应用程序;如果它是在考虑 Java 可移植性的情况下构建的,那么它很可能不会。然而,有可能滥用 Java 语言到它会失败的程度。例如,我看到一个应用程序从一个运行时崩溃到另一个运行时错误地实现equals,而该元素保存在一个列表中。

对于这样一个旧的应用程序,我认为是时候进行全面的测试了,可能还需要进行代码审查,以评估兼容性问题是否是一个主题。我已经让 Java 1.2 应用程序顺利运行,但如前所述,这取决于应用程序的编程方式。为了兼容性和性能问题,我肯定会将类(如果可能)重新编译为最新版本。


您可能首先要迁移到 Java 8,然后再迁移到 Java 11(两者都是长期支持版本)。Java 8 是生命的尽头,但您可能想要双步前进,因为您已经落后太多了。Java 8 版本可能只是用于简短的功能测试。

您可能已经需要为您的 Java 安装获得许可,但我会确保您也涵盖商业方面的内容。对于 Java 8 和 11,应该有一些值得细读的选项。

请注意,Java 10 及更高版本仅支持 64 位。我已经看到其他供应商提供的 32 位版本的 Java 10,但我不会升级到那些版本,因为您会将自己置于另一个角落以摆脱困境。


推荐阅读