Heartbleed:如何可靠且可移植地检查 OpenSSL 版本?

Mar*_*ijn 88 security linux ubuntu openssl heartbleed

我正在寻找一种可靠且可移植的方法来检查 GNU/Linux 和其他系统上的 OpenSSL 版本,以便用户可以轻松地发现他们是否应该因为 Heartbleed 错误而升级他们的 SSL。

我认为这很容易,但我很快在使用最新的 OpenSSL 1.0.1g 的 Ubuntu 12.04 LTS 上遇到了问题:

openssl 版本 -a

我期待看到一个完整的版本,但我得到了这个:

OpenSSL 1.0.1 2012 年 3 月 14 日
建立时间:2013 年 6 月 4 日星期二 07:26:06 UTC
平台: [...]

令我不快的是,版本字母没有显示。没有 f,没有 g,只有“1.0.1”,就是这样。列出的日期也无助于发现(非)易受攻击的版本。

1.0.1 (af) 和 1.0.1g 之间的差异至关重要。

问题:

  • 检查版本的可靠方法是什么,最好是跨发行版?
  • 为什么不首先显示版本号?除了 Ubuntu 12.04 LTS 之外,我无法在其他任何设备上进行测试。

其他人也报告了这种行为。几个例子:

一些(特定于发行版的)建议正在推出:

  • Ubuntu 和 Debian:apt-cache policy opensslapt-cache policy libssl1.0.0. 将版本号与此处的软件包进行比较:http : //www.ubuntu.com/usn/usn-2165-1/
  • Fedora 20:(yum info openssl感谢 Twitter 上的 @znmeb)和yum info openssl-libs

检查旧版本的 OpenSSL 是否仍然存在:

事实证明,在 Ubuntu 和 Debian 上更新 OpenSSL 包并不总是足够的。您还应该更新 libssl1.0.0 包,然后检查是否openssl version -a指示built on: Mon Apr 7 20:33:29 UTC 2014

Hop*_*00b 66

基于您的OpenSSL的版本显示的日期,看来你看到完整的版本显示在那里。

Open SSL 1.0.1 于 2012 年 3 月 14 日发布。1.0.1a 于 2012 年 4 月 19 日发布。

所以,我将继续并断言这openssl version -a是显示系统上安装的完整版 OpenSSL 的正确的跨发行版方式。它似乎适用于我有权访问的所有 Linux 发行版,也是 help.ubuntu.com OpenSSL 文档中建议的方法。Ubuntu LTS 12.04 随附了 vanilla OpenSSL v1.0.1,该版本看起来像一个缩写版本,因为后面没有字母。

话虽如此,看来Ubuntu(或他们如何打包 OpenSSL)存在一个主要错误,即openssl version -a从 2012 年 3 月 14 日起继续返回原始 1.0.1 版本,无论 OpenSSL 是否已升级到任何较新的版本。而且,就像下雨时的大多数事情一样,它会倾盆大雨。

Ubuntu 并不是唯一习惯将更新向后移植到 OpenSSL(或其他软件包)中的主要发行版,它比依赖每个人都认可的上游更新和版本编号更重要。在 OpenSSL 的情况下,字母版本号仅代表错误修复和安全更新,这似乎几乎无法理解,但我被告知这可能是因为FIPS 验证的插件主要 Linux 发行版与 OpenSSL 打包在一起。由于任何更改都会触发重新验证的要求,即使更改会堵塞安全漏洞,因此它是版本锁定的。

例如,在 Debian 上,固定版本显示的版本号是 ,1.0.1e-2+deb7u5而不是 的上游版本1.0.1g

因此,目前还没有可靠、可移植的方法来检查跨 Linux 发行版的 SSL 版本,因为它们都使用自己的反向移植补丁和具有不同版本编号方案的更新。您必须查找您运行的每个不同 Linux 发行版的固定版本号,并根据该发行版的特定版本编号检查已安装的 OpenSSL 版本,以确定您的服务器是否正在运行易受攻击的版本。

  • HopelessN00b,向后移植修复而不是碰撞版本的政策没有任何可疑之处;这是确保平台稳定性的一种非常好的方式,这在服务器环境中非常受欢迎。像任何决定一样,它有用户需要注意的后果;但仅仅因为它打破了“*我正在运行 foo xyz,因此我/我不会受到最新漏洞的攻击*”的推理路线,这并不会使它成为一件坏事。 (19认同)
  • @NickW @Jubal @MadHatter 不过,OpenSSL 的问题是:[`OpenSSL 1.0.0 发布后,版本控制方案发生了变化。信件版本(例如 1.0.1a)只能包含错误和安全修复程序,而没有新功能。`](https://www.openssl.org/support/faq.html#MISC8) 因此,放弃上游版本控制一无所获方案; 向后移植更新本质上与使用更新版本相同,因为无论如何更新只包括安全性和错误修复。它所做的是混淆事情,让我们无法在 Linux 发行版中可移植地检查 OpenSSL 版本。 (13认同)
  • @towo 版本号存在是有原因的。如果我们只是因为“企业”或其他原因而将上游版本号扔出窗口,那为什么还要为版本号操心呢?不妨开始用头韵来命名我们所有的东西。我们可以将易受攻击的 OpenSSL 版本称为 *Holy Heartbleed*,将固定版本称为 *Cunning Coagulant*。 (10认同)
  • @HopelessN00b 我认为你已经陷入了“这是在 XYZ 版本中修复的”陷阱,他们没有遵循版本号,因为所有导入最新版本的都是错误和安全修复。如果他们增加了版本号,您还会期望附加功能..“我有 OpenSSL v XYZ,为什么我没有 ECDHA ???? ..etc”。当您了解这只是错误修正时,这是有道理的。 (7认同)
  • 我的安装是一个简单的 Ubuntu 12.04 LTS,没有我自己编译或从 Ubuntu 存储库以外的其他来源下载的任何内容。如果 Ubuntu 分发带有缩写版本号的 OpenSSL,那么 `openssl version -a` 不是一种可移植的方法(至少不能移植到 Ubuntu)。我检查了 `apt-cache policy openssl`,它的响应是:`Installed: 1.0.1-4ubuntu5.12`,这是 Ubuntu 刚刚为 12.04 LTS 发布的 1.0.1g。我在检查之前注销并重新登录。 (3认同)
  • Cripes,这个 ubuntu 错误只是引起了我几分钟的混乱和轻微的恐慌。那是多么愚蠢。 (3认同)
  • @HopelessN00bGeniusofnetwork 我们可以轻松检查*版本*,这与检查*修复*(或向后移植)不同。至于在 Debian/Ubuntu 上轻松检查:`aptitude changelog libssl1.0.0 | grep -B10 CVE-2014-0160` (2认同)

Roy*_*ams 18

如果您想要真正跨平台的东西,请检查漏洞本身而不是依赖版本号。

您的代码可能会报告已知易受攻击的版本号,但实际代码并不易受攻击。反过来——默默地易受攻击的代码——可能更糟!

许多捆绑开源产品(如 OpenSSL 和 OpenSSH)的供应商将有选择地对旧版本代码进行紧急修复,以保持 API 的稳定性和可预测性。对于“长期发布”和设备平台尤其如此。

但是默默地执行此操作(不添加自己的版本字符串后缀)的供应商冒着在漏洞扫描器中触发误报(并使用户感到困惑)的风险。因此,为了使这个透明和可验证,一些供应商将他们自己的字符串附加到主要包版本。Debian (OpenSSL) 和 FreeBSD(在 OpenSSH 中,通过VersionAddendumsshd_config 指令)有时会这样做。

由于其他程序检查版本号的许多直接和间接方式,不这样做的供应商可能这样做是为了最大限度地减少损坏的机会。

所以它看起来像这样:

$ cat /etc/lsb-release 
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=12.04
DISTRIB_CODENAME=precise
DISTRIB_DESCRIPTION="Ubuntu 12.04.4 LTS"

$ openssl version
OpenSSL 1.0.1 14 Mar 2012
Run Code Online (Sandbox Code Playgroud)

...即使它已被修补

$ dpkg -l openssl | grep openssl
ii  openssl  1.0.1-4ubuntu5.12  [truncated]

$ ls -la `which openssl`
-rwxr-xr-x 1 root root 513208 Apr  7 12:37 /usr/bin/openssl

$ md5sum /usr/bin/openssl
ea2a858ab594905beb8088c7c2b84748  /usr/bin/openssl
Run Code Online (Sandbox Code Playgroud)

有了这样的事情,如果你不相信版本号,你会更好


Sch*_*hof 14

不幸的是,我不确定是否有跨平台的方式来做到这一点。正如我在一篇博客文章中讨论的那样,在升级到固定版本后,Ubuntu 12.04 上显示的 OpenSSL 版本仍为 1.0.1。

仅适用于 Ubuntu 12.04,如果以下所有条件均属实,您可以判断您是否已更新:

  1. dpkg -s openssl | grep Version 显示版本 1.0.1-4ubuntu5.12 或更高版本。
  2. dpkg -s libssl1.0.0 | grep Version 显示版本 1.0.1-4ubuntu5.12 或更高版本。
  3. openssl version -a 显示 2014 年 4 月 7 日或之后的“构建日期”。

感谢@danny 提供更多信息。

  • 好的,在这种情况下,我必须添加包版本“1.0.1-4ubuntu5.12”仅适用于 Ubuntu 12.04 LTS。根据消息来源,如果您使用的是 Ubuntu 12.10,您应该至少看到“1.0.1c-3ubuntu2.7”版本,如果您使用的是 13.10,那么它至少应该是“1.0.1e-3ubuntu1.2”版本: http://www.ubuntu.com/usn/usn-2165-1/ (2认同)