检测 OpenJDK 的补丁版本

Detecting a patched version of OpenJDK

我需要确定用户的 OpenJDK 版本是否容易受到特定安全漏洞的影响。例如,CVE-2016-0695 是在 OpenJDK 8u77 中发现的,如 April 2016 Critical Patch Update 中所揭示的那样。理想情况下,检测用户的 OpenJDK 版本是否易受攻击就像检查它是 <= 8u77 还是 > 8u77 并相应地将其标记为易受攻击一样简单(假设所有以前的版本也易受攻击并且修复被下一个版本应用)。不过,图片因手动补丁而变得混乱。

如果我没理解错的话,2016 年 4 月的补丁将自动捆绑到下一版本的 OpenJDK8(本例中为 8u91)中,但也可用于手动应用。对于那些希望在修补安全漏洞时保持 Java 版本不变的风险厌恶用户来说,后者可能是一个有吸引力的选择。如果用户手动将补丁应用于他们的 8u77 安装,我有什么方法可以检测到吗?比如java -version报告的版本号有变化吗?还是没有迹象表明已应用补丁?

如果 OpenJDK 构建来自供应商,供应商可能会发布安全信息。例如,这里是 CVE-2016-0695 security information from Debian。根据某些特定于供应商的版本控制方案,此信息通常包含第一个固定包版本。

但是,一般来说,您需要获取该 OpenJDK 构建的源代码,并在需要修复时查看它们。

要查找与特定 CVE ID(例如 CVE-2016-0695)对应的补丁,在大多数情况下,最简单的方法是转到 Red Hat Bugzilla 跟踪程序,此处 the flaw bug for CVE-2016-0695,并注意此处列出的内部 Oracle 错误编号,在本例中为 8138593。然后您需要检查适当的 OpenJDK 子树,在本例中为 jdk 组件:

hg clone http://hg.openjdk.java.net/jdk8u/jdk8u/jdk

并根据 Oracle 错误编号 (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)。

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

的问答

Security fixes for this Project's source code will be made available in the JDK 8 Update Project around the same time as they're released in products from Oracle

提供它们是为了集成到项目的 Mercurial 森林中。此类源码补丁单独提供,其他版本需用户手动应用。

一般来说,如果您需要了解某个特定更改是否已应用到第三方构建中,您将需要获取并比较来自上游和第三方构建的源代码 and/or 他们的提交历史。获取源代码、提交历史、补丁策略、补丁版本控制和补丁时间的机制可能因第三方而异。