问题描述
我有一个使用Java 5编译的旧Web应用程序,由于各种原因,该应用程序不容易升级到Java的较新版本,并且当前在Java 5下运行。
我的问题是,使用新版本的Java运行旧的Web应用程序(而不用新的Java版本重新编译该应用程序,并假设这不会导致运行时错误)是否将以任何重大方式减轻旧Java运行时的安全风险。环境?
(我特别是在谈论与较旧的Java运行时环境相关的安全风险,我知道,传递到较新的Java版本不会降低与XSS等相关的安全风险的事实)。
1楼
通常,最好使Java运行时保持最新状态。 当然,通过升级可以缓解任何安全风险取决于应用程序。 一个“ Hello World!” 应用程序很可能不会受到影响,因为它没有安全性要求,没有攻击媒介,而且无论如何也不会使用太多运行时组件(攻击面)。
但是,Web应用程序通常在应用服务器上运行,该服务器可能会使用Java来实现TLS。 这意味着您的TLS实施有可能多年未升级。 尽管与C相比,Java具有阻止某些攻击的优势,但是肯定会存在其他漏洞。 例如,Heartbleed极不可能成为问题,因为它取决于缓冲区溢出,并且Java具有针对这些溢出的内部保护。 PKCS#1 v1.5填充预告片很可能适用,因为它取决于实际的实现。
由于Java可执行文件本身并没有特别容易利用的漏洞困扰,因此它主要取决于服务器,库和应用程序的运行时类使用的功能(按此顺序,服务器可能会占用较大的内存) )。 升级Java版本和服务器+库。 某些实用程序库的优先级可能会有所不同,具体取决于其功能,但请保持警惕。 如果例如Apache Commons Codec出现了问题,则您不希望存在漏洞。
更重要的是:为您的系统创建更新和升级策略并遵守该策略。 测试量取决于您是否必须更新或升级系统。 如果实施得当,则可以进行自动测试以进行更新,并进行完整的测试以进行升级。 希望这些库使用语义版本控制,以便可以将升级与更新区分开。
如果在较新版本上运行它不会导致运行时错误,则取决于应用程序;
如果它是在考虑到Java可移植性的情况下构建的,则绝不可能。
但是,滥用Java语言的程度可能会导致失败。
例如,我看到一个应用程序从一个运行时崩溃到另一个运行时崩溃,该运行错误地将equals
保留在列表中时实现了equals
。
对于这样的旧应用程序,我认为是时候进行全面测试,并可能需要进行代码审查来评估兼容性问题是否是主题。 我已经使Java 1.2应用程序运行顺利,但是如上所述,这取决于应用程序的编程方式。 我当然会(如果可能)将类重新编译为最新版本,以兼顾兼容性和性能问题。
您可能首先要迁移到Java 8,然后再转到Java 11(这两个都是长期支持版本)。 Java 8即将寿终正寝,但您可能需要做一个双重步骤,因为您已经远远落后了。 Java 8版本可能只是为了进行简短的功能测试。
您可能已经需要Java安装许可,但是我要确保您还涉及商业领域。 对于Java 8和11,应该有一些值得细读的选项。
请注意,Java 10及更高版本仅是64位。 我已经看过其他供应商提供的32位Java 10版本,但是我不会升级到那些版本,因为您会陷入另一个困境。