我需要确定用户的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-to-bug-number映射。)
您可以使用另一个Mercurial命令查看补丁:
hg export 594e8dca337c
获得补丁后,需要检查源代码以检查是否已应用。如果由于某种原因无法获取源代码,对于jdk
的更改,使用javap -c
反汇编相关类通常就足够了。对于本机代码,您需要一个不同的反汇编程序(例如objdump -dr
)。
OpenJDK JDK 8更新项目提供源代码,而不是构建或二进制补丁。根据http://openjdk.java.net/projects/jdk8u/qanda.html的问答
此项目源代码的安全修复程序将在JDK 8更新项目中提供,与Oracle产品中发布的安全修复程序大致相同
它们可用于集成到项目的Mercurial森林中。此类源代码补丁不单独提供,由用户手动应用于其他版本。
通常,如果您需要了解是否已在第三方构建中应用特定更改,则需要获取并比较来自上游和第三方构建的源代码和/或其提交历史记录。获取源代码,提交历史记录,修补策略,补丁版本控制和补丁计时的机制可能因第三方而异。