我正在寻找一种可靠且可移植的方法来检查 GNU/Linux 和其他系统上的 OpenSSL 版本,这样用户可以很容易地发现他们是否应该因为 Heartbleed 错误而升级他们的 SSL。
我认为这很容易,但我很快在 Ubuntu 12.04 LTS 上遇到了最新的 OpenSSL 1.0.1g 问题:
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,我无法在其他任何东西上测试它。
其他人也在报告这种行为。几个例子:
- https://twitter.com/orblivion/status/453323034955223040
- https://twitter.com/axiomsofchoice/status/453309436816535554
一些(特定于发行版的)建议滚滚而来:
- Ubuntu 和 Debian:
apt-cache policy openssl
和apt-cache policy libssl1.0.0
. 将版本号与此处的软件包进行比较:http ://www.ubuntu.com/usn/usn-2165-1/ - Fedora 20:(
yum info openssl
感谢推特上的@znmeb)和yum info openssl-libs
检查旧版本的 OpenSSL 是否仍然存在:
- 它并不完全可靠,但您可以尝试
lsof -n | grep ssl | grep DEL
. 请参阅Heartbleed:如何可靠且可移植地检查 OpenSSL 版本?为什么这可能不适合你。
事实证明,在 Ubuntu 和 Debian 上更新 OpenSSL 包并不总是足够的。您还应该更新 libssl1.0.0 包,然后检查是否openssl version -a
指示built on: Mon Apr 7 20:33:29 UTC 2014
。
根据您的 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 版本,以确定您的服务器是否运行易受攻击的版本。
如果您想要真正跨平台的东西,请检查漏洞本身,而不是依赖版本号。
您的代码可能会报告已知易受攻击的版本号,但实际代码并非易受攻击。反之——无声的易受攻击的代码——可能会更糟!
许多捆绑 OpenSSL 和 OpenSSH 等开源产品的供应商将选择性地对旧版本代码进行紧急修复,以保持 API 的稳定性和可预测性。对于“长期发布”和设备平台尤其如此。
但是,默默地这样做(不添加自己的版本字符串后缀)的供应商冒着在漏洞扫描程序中触发误报的风险(并使用户感到困惑)。因此,为了使这个透明和可验证,一些供应商将他们自己的字符串附加到主要包版本。Debian (OpenSSL) 和 FreeBSD(在 OpenSSH 中,通过
VersionAddendum
sshd_config 指令)有时都会这样做。不这样做的供应商可能会这样做,以尽量减少由于其他程序检查版本号的许多直接和间接方式而损坏的机会。
所以它看起来像这样:
...即使它已被修补:
有了这样的事情,如果你不信任版本号,你会更好。
不幸的是,我不确定是否有跨平台的方式来做到这一点。正如我在一篇博文中所讨论的,在升级到固定版本后,Ubuntu 12.04 REMAINS 1.0.1 上显示的 OpenSSL 版本。
仅适用于 Ubuntu 12.04,如果以下所有条件都属实,您可以判断您是否已更新:
dpkg -s openssl | grep Version
显示版本 1.0.1-4ubuntu5.12 或更高版本。dpkg -s libssl1.0.0 | grep Version
显示版本 1.0.1-4ubuntu5.12 或更高版本。openssl version -a
显示 2014 年 4 月 7 日或之后的“构建”日期。感谢@danny 提供更多信息。
试试下面的。它将从 ssh 链接的加密库中提取所有字符串。它产生多于一行的输出,但如有必要可以转换为 1 行。
生产
例如在出现之前在 Gentoo 上
上面的命令导致
后
哎呀,还是没有g。
这些脚本中的任何一个都测试所有服务,还是只测试HTTPS?AFAIK,PostgreSQL很容易受到攻击,但这只是一个谣言,直到出现野外攻击。
有一个可供使用的metasploit脚本。
您可以输入这个(使用 GnuWin32 OpenSSL 二进制版本 1.0.1.6 测试,日期为 2014-01-14),或者只使用下面评论中的脚本。它更准确,更简单!
一旦连接类型 B,您将在易受攻击的主机上看到并且您不会断开连接:
您将获得与此类似的心跳响应。
在已修补的主机上,您将看到类似于以下的响应,并且您将被断开连接:
输入 B
资源:
还有这些工具:
https://github.com/titanous/heartbleeder
http://filippo.io/Heartbleed/
https://github.com/musalbas/heartbleed-masstest
我在 devcentral 中找到了这个脚本:
替换
example.com
为您要检查的服务器的名称或 IP 地址。"safe"
如果您的服务器正常或"server extension "heartbeat" (id=15)"
不正常,将返回。这不依赖于版本号,而是列出导致问题的服务器扩展,因此它应该不受库版本恶作剧的影响。
您运行的机器
openssl s_client
必须使用OpenSSL 1.0.1 或更高版本才能正常工作。对于 Ubuntu,您可以使用:
并与http://www.ubuntu.com/usn/usn-2165-1/进行比较。重新启动后(!!!)您可以使用
http://possible.lv/tools/hb
.您最好升级到最新的 OpenSSL OpenSSL 1.0.1j。
http://blog.vincosolution.com/2014/10/upgrade-openssl-1-0-1j-debianubuntu.html