我正在寻找一种可靠且便携的方法来检查 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,我无法在其他任何系统上测试这一点。
其他人也报告了这种行为。以下是一些示例:
- 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
。
答案1
根据您使用的 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 中的 bug(或者他们如何打包 OpenSSL)在于,openssl version -a
无论 OpenSSL 是否已升级到任何较新版本,它都会继续返回 2012 年 3 月 14 日的原始 1.0.1 版本。而且,就像大多数事情一样,祸不单行。
Ubuntu 并不是唯一一个习惯将更新反向移植到 OpenSSL(或其他软件包)的主要发行版,而不是依赖每个人都认可的上游更新和版本编号。就 OpenSSL 而言,字母版本号仅代表错误修复和安全更新,这似乎几乎令人难以理解,但我被告知,这可能是因为经 FIPS 验证插件主要 Linux 发行版随附 OpenSSL。由于任何更改(甚至是堵塞安全漏洞的更改)都会触发重新验证的要求,因此它是版本锁定的。
例如,在 Debian 上,固定版本显示版本号,1.0.1e-2+deb7u5
而不是上游版本1.0.1g
。
因此,在这个时候,目前还没有可靠、可移植的方法来检查 Linux 发行版中的 SSL 版本因为它们都使用自己的反向移植补丁和更新,且版本编号方案不同。您必须查找所运行的每个不同 Linux 发行版的固定版本号,并根据该发行版的特定版本号检查已安装的 OpenSSL 版本,以确定您的服务器是否正在运行易受攻击的版本。
答案2
如果你想要真正跨平台的东西,检查漏洞本身而不是依赖版本号。
您的代码可能会报告已知存在漏洞的版本号,但实际代码并不容易受到攻击. 而相反的情况——悄无声息的易受攻击的代码——可能会更糟!
许多捆绑 OpenSSL 和 OpenSSH 等开源产品的供应商会选择性地对旧版本的代码进行紧急修复,以保持 API 的稳定性和可预测性。对于“长期发布”和设备平台尤其如此。
但是,如果供应商默默地这样做(不添加自己的版本字符串后缀),则可能会触发漏洞扫描程序的误报(并使用户感到困惑)。因此,为了使这一过程透明且可验证,一些供应商会将自己的字符串附加到主要软件包版本中。Debian(OpenSSL)和 FreeBSD(在 OpenSSH 中,通过VersionAddendum
sshd_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
... 虽然已经修复:
$ 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
面对这样的情况,你最好不要相信版本号。
答案3
不幸的是,我不确定是一种跨平台的方法。正如我在一篇博客文章中讨论的那样,升级到修复版本后,Ubuntu 12.04上显示的OpenSSL版本仍为1.0.1。
仅适用于 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 提供的补充信息。
答案4
这些脚本是否测试所有服务,还是仅测试HTTPS?AFAIK,PostgreSQL是脆弱的,但在出现野外攻击之前,这只是谣言。
有一个metasploit脚本可供使用。
https://github.com/rapid7/metasploit-framework/commit/dd69a9e5dd321915e07d8e3dc8fe60d3c54f551a
您可以输入此内容(已测试操作系统OpenSSL 二进制版本 1.0.1.6,日期为 2014-01-14),或者直接使用下面注释中的脚本。它更准确,更简单!
s_client -connect a23-75-248-141.deploy.static.akamaitechnologies.com:443 -debug -state
一旦连接,输入 B 你就会看到一个易受攻击的主机,并且你不会断开连接:
B
HEARTBEATING
write to 0x801c17160 [0x801cbc003] (66 bytes => 66 (0x42))
0000 - 18 03 03 00 3d 8f 6f 3c-52 11 83 20 9c a2 c0 49 ....=.o 5 (0x5))
0000 - 18 03 03 00 3d ....=
read from 0x801c17160 [0x801cb7008] (61 bytes => 61 (0x3D))
0000 - 05 4d f5 c0 db 96 d1 f5-c7 07 e5 17 1f 3b 48 34 .M...........;H4
0010 - 6e 11 9d ba 10 0c 3a 34-eb 7b a5 7c c4 b6 c0 c0 n.....:4.{.|....
0020 - b0 75 0e fe b7 fa 9e 04-e9 4e 4a 7d 51 d3 11 1f .u.......NJ}Q...
0030 - e2 23 16 77 cb a6 e1 8e-77 84 2b f8 7f .#.w....w.+..
read R BLOCK
您将会收到与此类似的心跳响应。
在修补后的主机上,您将看到类似以下的响应,并且连接将断开:
输入 B
HEARTBEATING
write to 0x801818160 [0x8019d5803] (101 bytes => 101 (0x65))
0000 - 18 03 03 00 60 9c a3 1e-fc 3b 3f 1f 0e 3a fe 4c ....`....;?..:.L
0010 - a9 33 08 cc 3d 43 54 75-44 7d 2c 7b f3 47 b9 56 .3..=CTuD},{.G.V
0020 - 89 37 c1 43 1c 80 7b 87-66 ff cb 55 5f 8d 1a 95 .7.C..{.f..U_...
0030 - 1b 4c 65 14 21 a1 95 ac-7a 70 79 fc cc a0 cf 51 .Le.!...zpy....Q
0040 - 0f 7e c5 56 14 c8 37 c1-40 0b b8 cb 43 96 8a e6 [email protected]...
0050 - 21 42 64 58 62 15 fb 51-82 e6 7f ef 21 1b 6f 87 !BdXb..Q....!.o.
0060 - b9 c2 04 c8 47 ....G
来源:
还有这些工具: