AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 587324
Accepted
Martijn
Martijn
Asked: 2014-04-08 15:51:37 +0800 CST2014-04-08 15:51:37 +0800 CST 2014-04-08 15:51:37 +0800 CST

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

  • 772

我正在寻找一种可靠且可移植的方法来检查 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。

linux
  • 8 8 个回答
  • 45902 Views

8 个回答

  • Voted
  1. Best Answer
    HopelessN00b
    2014-04-08T16:05:52+08:002014-04-08T16:05:52+08:00

    根据您的 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 版本,以确定您的服务器是否运行易受攻击的版本。

    • 66
  2. Royce Williams
    2014-04-09T12:52:11+08:002014-04-09T12:52:11+08:00

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

    您的代码可能会报告已知易受攻击的版本号,但实际代码并非易受攻击。反之——无声的易受攻击的代码——可能会更糟!

    许多捆绑 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
    

    ...即使它已被修补:

    $ 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
    

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

    • 18
  3. Schof
    2014-04-08T19:15:11+08:002014-04-08T19:15:11+08:00

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

    仅适用于 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 提供更多信息。

    • 14
  4. waTeim
    2014-04-09T06:45:43+08:002014-04-09T06:45:43+08:00

    试试下面的。它将从 ssh 链接的加密库中提取所有字符串。它产生多于一行的输出,但如有必要可以转换为 1 行。

    ldd `which ssh` | awk '/\// { print $3 }' | grep crypto | xargs strings  | grep OpenSSL
    

    生产

    OpenSSLDie
    DSA_OpenSSL
    ...
    MD4 part of OpenSSL 1.0.1f 6 Jan 2014 
    MD5 part of OpenSSL 1.0.1f 6 Jan 2014
    ... 
    etc
    

    例如在出现之前在 Gentoo 上

    [ebuild     U  ] dev-libs/openssl-1.0.1f [1.0.1c] USE="bindist (sse2) tls-heartbeat%* zlib -gmp -kerberos -rfc3779 -static-libs {-test} -vanilla" 4,404 kB
    

    上面的命令导致

    ...
    OpenSSL 1.0.1c 10 May 2012
    

    后

    ...
    OpenSSL 1.0.1f 6 Jan 2014
    

    哎呀,还是没有g。

    • 4
  5. Justin Goldberg
    2014-04-10T03:43:19+08:002014-04-10T03:43:19+08:00

    这些脚本中的任何一个都测试所有服务,还是只测试HTTPS?AFAIK,PostgreSQL很容易受到攻击,但这只是一个谣言,直到出现野外攻击。

    有一个可供使用的metasploit脚本。

    https://github.com/rapid7/metasploit-framework/commit/dd69a9e5dd321915e07d8e3dc8fe60d3c54f551a
    

    您可以输入这个(使用 GnuWin32 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
    

    资源:

    • 博客文章如何测试您的 OpenSSL 是否令人心血来潮

    还有这些工具:

    • https://github.com/titanous/heartbleeder

    • http://filippo.io/Heartbleed/

    • https://github.com/musalbas/heartbleed-masstest

    • 2
  6. egarcia
    2014-04-09T01:12:07+08:002014-04-09T01:12:07+08:00

    我在 devcentral 中找到了这个脚本:

    openssl s_client -connect example.com:443 -tlsextdebug 2>&1| grep 'server extension "heartbeat" (id=15)' || echo safe
    

    替换example.com为您要检查的服务器的名称或 IP 地址。

    "safe"如果您的服务器正常或"server extension "heartbeat" (id=15)"不正常,将返回。

    这不依赖于版本号,而是列出导致问题的服务器扩展,因此它应该不受库版本恶作剧的影响。

    您运行的机器openssl s_client必须使用OpenSSL 1.0.1 或更高版本才能正常工作。

    • 0
  7. Rufinus
    2014-04-09T03:14:23+08:002014-04-09T03:14:23+08:00

    对于 Ubuntu,您可以使用:

    aptitude show libssl1.0.0 | grep Version
    

    并与http://www.ubuntu.com/usn/usn-2165-1/进行比较。重新启动后(!!!)您可以使用http://possible.lv/tools/hb.

    • 0
  8. Kevin Nguyen
    2014-10-19T17:57:12+08:002014-10-19T17:57:12+08:00

    您最好升级到最新的 OpenSSL OpenSSL 1.0.1j。

    http://blog.vincosolution.com/2014/10/upgrade-openssl-1-0-1j-debianubuntu.html

    • 0

相关问题

  • Linux 主机到主机迁移

  • 如何在 Linux 机器上找到有关硬件的详细信息?

  • 如何在 Linux 下监控每个进程的网络 I/O 使用情况?

  • 在 RHEL4 上修改 CUPS 中的现有打印机设置

  • 为本地网络中的名称解析添加自定义 dns 条目

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    新安装后 postgres 的默认超级用户用户名/密码是什么?

    • 5 个回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve