出于安全原因升级Java运行时,而无需使用较新的Java版本重新编译应用程序

时间:2019-02-13 12:34:39

标签: java security jvm

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

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

(我特别是在谈论与较旧的Java运行时环境有关的安全风险,我知道将其传递到较新的Java版本不会降低与XSS等有关的安全风险的事实。)

1 个答案:

答案 0 :(得分:1)

通常最好使Java运行时保持最新状态。当然,通过升级可以缓解任何安全风险取决于应用程序。一个“ Hello World!”该应用程序很可能不会受到影响,因为它没有安全性要求,没有攻击向量,而且无论如何也不会使用太多运行时组件(攻击面)。

但是,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版本,但是我不会升级到那些版本,因为您会将自己放在另一个角落,以摆脱困境。