检测OpenJDK的补丁版本

3
我需要确定用户的OpenJDK版本是否容易受到某个安全漏洞的攻击。例如,CVE-2016-0695在OpenJDK 8u77中被发现,如2016年4月关键补丁更新中所述。理想情况下,检测用户的OpenJDK版本是否容易受攻击应该是很简单的,只需检查它是否小于或等于8u77或大于8u77,并相应地标记为易受攻击或不易受攻击(假设所有以前的版本也容易受攻击并且修复将在下一个版本中应用)。然而,手动打补丁会让事情变得复杂。
如果我理解正确的话,2016年4月的补丁将自动捆绑到下一个OpenJDK8版本中(在这种情况下是8u91),但也可以手动应用。对于那些希望保持Java版本不变但又想修补安全漏洞的风险规避用户来说,后者可能是一个有吸引力的选项。如果用户手动将补丁应用到他们的8u77安装程序中,有没有办法检测到?例如,java -version报告的版本号是否会改变?或者没有任何指示表明已应用补丁?

你尝试过应用补丁并测试版本字符串吗? - hardillb
我本来可以提供的,但是你需要一个Oracle支持合同才能访问这些内容(除非它们在其他地方可用?)。 - sevko
@alex-poole,我包含了 [tag:oracle] 标签,因为安全补丁似乎是由 Oracle 发布/管理并通过他们的 opatch 实用程序应用的,所以我想 Oracle 用户可以参与讨论。我应该去掉它吗? - sevko
1
我的错误,抱歉。标签名称有些混淆。 - sevko
@sevko - 是的,这种情况经常发生 *8-) 重新阅读了我的上一条评论,发现它听起来比预期的更尖刻。无论如何,我认为现在删除它也不会有任何帮助。 - Alex Poole
2个回答

3
如果OpenJDK构建来自供应商,则供应商可能会发布安全信息。例如,这里是Debian关于CVE-2016-0695的安全信息。该信息通常包含根据某个供应商特定的版本管理方案确定的第一个修复程序版本。
然而,一般来说,您需要获取那个OpenJDK构建的源代码并审查它们是否需要修复。
要找到与特定CVE ID(比如CVE-2016-0695)相对应的补丁,在大多数情况下,最简单的方法是进入Red Hat Bugzilla跟踪器,在这里查看与CVE-2016-0695相关的错误漏洞,并注意那里列出的内部Oracle错误编号,在此示例中为8138593。然后您需要检出适当的OpenJDK子树,在本例中为jdk组件。
hg clone http://hg.openjdk.java.net/jdk8u/jdk8u/jdk

根据Oracle bug编号(8138593),在历史记录中查找相应的提交:

changeset:   11581:594e8dca337c
user:        igerasim
date:        Thu Dec 24 08:42:10 2015 +0300
summary:     8138593: Make DSA more fair

提交本身不包含CVE ID(这通常在修复程序编写时不可用,因此可以理解),因此需要通过Red Hat漏洞跟踪器进行绕路。(我没有看到来自Oracle的CVE ID与漏洞编号的映射。)

您可以使用另一个Mercurial命令查看补丁:

hg export 594e8dca337c

一旦您获得了补丁,就需要审核源代码以检查是否已经应用。如果由于某些原因无法获取源代码,则对于jdk的更改,通常仅需使用javap -c反汇编相关类即可。对于本地代码,您需要一个不同的反汇编工具(例如objdump -dr)。


2
进一步补充一下,应用补丁并不会自动更改构建号。构建号是OpenJDK构建过程的产物,在配置阶段有许多标志可以设置。 - Martijn Verburg

1

OpenJDK JDK 8更新项目提供源代码,而不是构建或二进制补丁。根据http://openjdk.java.net/projects/jdk8u/qanda.html中的问答:

该项目的源代码的安全修复程序将在与 Oracle 产品发布时间相同的时间内提供给 JDK 8 更新项目

它们可用于集成到项目的Mercurial forest中。这些源代码补丁单独提供,也不能手动应用于其他版本。

通常,如果您需要了解特定更改是否已应用于第三方构建,则需要获取并比较上游和第三方构建以及其提交历史记录的源代码。获取源代码、提交历史记录、打补丁策略、打补丁版本和打补丁时间的机制可能因第三方而异。


我曾经认为Oracle提供了二进制补丁,可以使用类似于opatch实用程序来应用。这是不正确的吗?如果是这样,那么结论就是补丁只存在于源代码形式中,因此我只需要担心它们在JDK维护者级别上被应用(而不是在最终用户级别上,因为他们很少从源代码构建自己的JDK),对吗? - sevko
由于Oracle在OpenJDK社区中没有为单独的OpenJDK 8更新提供可执行二进制文件,因此实际上没有可补丁的二进制文件。Dalibor Topic是Oracle Java平台组的首席产品经理。 - Dalibor Topic

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接