编译旧的JDK是否存在任何已知的安全问题?例如,假设Oracle决定在其中一个实现中更改某些关闭安全漏洞的内容。如果我们针对较旧的JDK进行编译,我们仍然会受到攻击吗?
修改 的
我们正在针对JDK 6运行,我们针对Java 5进行编译,这是我试图为其他任何看到此问题的人提出的问题的关键。为了完整起见,我们可以说在ant构建中我们的目标是1.5
编辑2
此外,应用程序中存在可能具有不直接访问的私有API /实现的调用问题。
答案 0 :(得分:6)
除了一些尚未发生的非常假设的利基情况之外,唯一重要的是执行应用程序的版本。
我认为没有任何已知的安全问题已经被@deprecated“修复”,因为这不太合适。
这里有两个问题: 1)您可以让Java编译器生成与旧版本二进制兼容的二进制文件。这会影响您可以使用的语言功能。
2)您可以针对旧版本的Java系统库进行编译,这将影响可用的方法/类,因为它们总是添加新的。
但这些都不会影响应用程序的安全性。重要的是运行应用程序的运行时版本。
观察到更新之间的安全问题是固定的,而不是主要版本,这会引入语言本身的更改。例如,Java 6目前处于更新版本21. Java 6更新了19在Java 6更新18中易受攻击的固定内容。
发布Java 6更新19时,发布了Java 1.5和Java 1.4的更新,以修复Java 1.5(更新24)和Java 1.4(更新26)中的相同问题。请参阅此处的安全基准表:http://www.oracle.com/technetwork/java/javase/6u19-141078.html
答案 1 :(得分:3)
如果您针对JDK 1.5进行编译:
应用程序将使用用户运行时的库运行。由于您的应用程序正在调用Oracle库中的漏洞,因此安全漏洞将得到缓解。
但是,由于您针对1.5进行编译,因此您的用户将能够使用1.5。尽一切可能避免漏洞;如果你无法避免,请在启动时检测JRE版本并在适当时发出警告。
答案 2 :(得分:1)
如果Oracle更改 API (非实现)以提升安全性,他们可能会添加@Deprecated
注释,但会保留向后兼容性一段时间。注释将在较新的编译器中触发警告,但不会在您的编译器中触发,而不是在编译的程序中。 (除非Oracle决定抛出异常或从弃用的方法中记录消息。)
答案 3 :(得分:0)
我会说那些未修复的漏洞仍然存在,您和您的应用仍处于危险之中。
与使用旧的未修补的操作系统或浏览器运行相同的问题。
迁移到更新的JVM是一个很好的动力。