检测OpenJDK的修补版本

问题描述 投票:3回答:2

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

如果我理解正确,2016年4月的补丁将自动捆绑到OpenJDK8的下一个版本(在本例中为8u91),但也可用于手动应用。对于想要在修补安全漏洞时保持Java版本原样的风险厌恶用户,后者可能是一个有吸引力的选择。如果用户手动将补丁应用到他们的8u77安装,我有什么方法可以检测到它吗?例如,java -version报告的版本号是否会发生变化?或者没有指示补丁已被应用?

java patch openjdk
2个回答
3
投票

如果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-to-bug-number映射。)

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

hg export 594e8dca337c

获得补丁后,需要检查源代码以检查是否已应用。如果由于某种原因无法获取源代码,对于jdk的更改,使用javap -c反汇编相关类通常就足够了。对于本机代码,您需要一个不同的反汇编程序(例如objdump -dr)。


1
投票

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

此项目源代码的安全修复程序将在JDK 8更新项目中提供,与Oracle产品中发布的安全修复程序大致相同

它们可用于集成到项目的Mercurial森林中。此类源代码补丁不单独提供,由用户手动应用于其他版本。

通常,如果您需要了解是否已在第三方构建中应用特定更改,则需要获取并比较来自上游和第三方构建的源代码和/或其提交历史记录。获取源代码,提交历史记录,修补策略,补丁版本控制和补丁计时的机制可能因第三方而异。

© www.soinside.com 2019 - 2024. All rights reserved.