如何修补 OpenSSL 中的 Heartbleed 错误 (CVE-2014-0160)?

Luc*_*cio 153 security openssl

截至今天,已发现OpenSSL 中的一个错误1.0.1通过1.0.1f(包括)和1.0.2-beta.

从 Ubuntu 12.04 开始,我们都很容易受到这个错误的影响。为了修补这个漏洞,受影响的用户应该更新到 OpenSSL 1.0.1g

每个受影响的用户现在如何应用此更新?

Flo*_*sch 142

安全更新适用于12.04、12.10、13.10和 14.04,请参阅Ubuntu 安全通知 USN-2165-1

因此,首先您需要应用可用的安全更新,例如通过运行

sudo apt-get update
sudo apt-get upgrade
Run Code Online (Sandbox Code Playgroud)

从命令行。

不要忘记重新启动使用受影响 OpenSSL 版本的服务(HTTP、SMTP 等),否则您仍然容易受到攻击。另请参阅Heartbleed:它是什么以及缓解它的选项有哪些?在 Serverfault.com 上。

以下命令显示(升级后)所有需要重新启动的服务:

sudo find /proc -maxdepth 2 -name maps -exec grep -HE '/libssl\.so.* \(deleted\)' {} \; | cut -d/ -f3 | sort -u | xargs --no-run-if-empty ps uwwp
Run Code Online (Sandbox Code Playgroud)

之后,您需要重新生成所有服务器 SSL 密钥,然后评估您的密钥是否可能已泄露,在这种情况下,攻击者可能已从您的服务器中检索到机密信息。

  • 不确定这是否适用于 Ubuntu 12.04.4 LTS。完全更新后,`openssl version` 给出了 `OpenSSL 1.0.1 14 Mar 2012`。那不是补丁版本吧?还是我误读了? (23认同)
  • 在 Ubuntu 12.04 上,即使固定的 OpenSSL 显示版本“1.0.1 2012 年 3 月 14 日”。阅读 [crimi's answer](http://askubuntu.com/a/444829/264163) 以了解您的安装是否包含修复程序。 (20认同)
  • **打补丁和重启是不够的。您需要重新生成密钥并评估您的密钥是否已泄露以及其他机密材料。** 参见例如 [Heartbleed 是否意味着每个 SSL 服务器的新证书?](http://security.stackexchange.com/questions/55075 /does-heartbleed-mean-new-certificates-for-every-ssl-server/55087#55087) (20认同)
  • 如何处理 Ubuntu 13.04?没有可用的升级版 openssl :-( (7认同)
  • 谢谢,@丹!在这里重新总结@crimi 的回答:如果你运行 `dpkg -l | grep ' openssl '` 然后你得到 `1.0.1-4ubuntu5.12` 然后你就可以开始了。 (7认同)
  • 确保重新启动您的服务器进程!否则更新实际上不会生效。 (4认同)
  • 是否在 ubuntu 12.04 上测试过?我升级并重新声明,但 `apt-cache show libssl1.0.0` 给出了 `Version: 1.0.1-4ubuntu3`。而`openssl version` 给出了`OpenSSL 1.0.1 14 Mar 2012`。 (2认同)
  • @NewWorld 该错误可能允许攻击者检索密钥(请参阅我的回答以获取简短说明,如果需要更多,请参阅参考资料)。您可以确定的唯一方法是,自该漏洞公布以来,您以外的任何人是否与您的服务器建立了任何连接(假设该漏洞在公布之前未被利用)。 (2认同)

Gil*_*il' 71

该错误被称为Heartbleed

我脆弱吗?

通常,如果您运行某个服务器,并且您在某个时候为其生成了 SSL 密钥,那么您会受到影响。大多数最终用户不会(直接)受到影响;至少 Firefox 和 Chrome 不使用 OpenSSL。SSH 不受影响。Ubuntu 软件包的分发不受影响(它依赖于 GPG 签名)。

如果您运行使用 OpenSSL 版本 1.0-1.0.1f 的任何类型的服务器(当然自发现错误后修补的版本除外),那么您很容易受到攻击。受影响的 Ubuntu 版本是 11.10 oneiric 到 14.04 可信预发行版。这是一个实现错误,而不是协议中的缺陷,因此只有使用 OpenSSL 库的程序会受到影响。如果您的程序链接到旧的 0.9.x 版本的 OpenSSL,则不会受到影响。只有使用 OpenSSL 库来实现 SSL 协议的程序才会受到影响;将 OpenSSL 用于其他用途的程序不受影响。

如果您运行暴露于 Internet 的易受攻击的服务器,除非您的日志显示自 2014 年 4 月 7 日发布以来没有连接,否则应将其视为已受损。(这假设该漏洞在公布之前未被利用。)如果您的服务器仅在内部公开,则您是否需要更改密钥将取决于其他安全措施是否到位。

有什么影响?

该漏洞允许任何可以连接到您的 SSL 服务器的客户端从服务器检索大约 64kB 的内存。客户端不需要以任何方式进行身份验证。通过重复攻击,客户端可以在连续尝试中转储内存的不同部分。

攻击者可能能够检索的关键数据之一是服务器的 SSL 私钥。有了这些数据,攻击者就可以冒充您的服务器。

如何在服务器上恢复?

  1. 使所有受影响的服务器脱机。只要它们在运行,就有可能泄露关键数据。

  2. 升级libssl1.0.0,并确保所有受影响的服务器都重新启动。
    您可以使用“grep”libssl 检查受影响的进程是否仍在运行。(已删除)' /proc/ /maps`

  3. 生成新密钥。这是必要的,因为该漏洞可能允许攻击者获得旧私钥。按照您最初使用的相同程序进行操作。

    • 如果您使用由证书颁发机构签署的证书,请将您的新公钥提交给您的 CA。获得新证书后,将其安装在您的服务器上。
    • 如果您使用自签名证书,请将其安装在您的服务器上。
    • 无论哪种方式,将旧的密钥和证书移开(但不要删除它们,只需确保它们不再被使用)。
  4. 现在您有了新的未妥协的密钥,您可以让您的服务器重新联机

  5. 撤销旧证书。

  6. 损害评估:服务 SSL 连接的进程内存中的任何数据都可能被泄露。这可能包括用户密码和其他机密数据。您需要评估这些数据可能是什么。

    • 如果您正在运行允许密码身份验证的服务,那么自漏洞公布前不久就连接的用户的密码应被视为已泄露。(之前一点,因为密码可能在内存中一段时间​​未使用。)检查您的日志并更改任何受影响用户的密码。
    • 还要使所有会话 cookie 无效,因为它们可能已被泄露。
    • 客户端证书不会被泄露。
    • 在漏洞发生之前交换的任何数据都可能保留在服务器的内存中,因此可能已泄露给攻击者。
    • 如果有人记录了旧的 SSL 连接并检索了您服务器的密钥,他们现在可以解密他们的成绩单。(除非确保PFS - 如果您不知道,那就不是。)

如何在客户端上恢复?

客户端应用程序受到影响的情况很少。服务器端的问题是任何人都可以连接到服务器并利用该漏洞。为了利用客户端,必须满足三个条件:

  • 客户端程序使用错误版本的 OpenSSL 库来实现 SSL 协议。
  • 客户端连接到恶意服务器。(例如,如果您连接到电子邮件提供商,这不是问题。)这必须在服务器所有者意识到该漏洞之后发生,所以大概是在 2014 年 4 月 7 日之后。
  • 客户端进程在内存中具有未与服务器共享的机密数据。(因此,如果您只是跑去wget下载文件,则不会泄漏任何数据。)

如果您在 2014 年 4 月 7 日晚上 UTC 和升级 OpenSSL 库之间这样做,请考虑客户端进程内存中的任何数据都会受到损害。

参考

  • 我不相信“只有 SSL/TLS 连接的服务器端受到影响”是真的。https://www.openssl.org/news/secadv_20140407.txt 说它可以从客户端或服务器泄露机密。http://www.ubuntu.com/usn/usn-2165-1/ 同意。您在连接到恶意服务器时使用客户端证书的可能性很小,但存在这种可能性。 (4认同)

cri*_*imi 40

要查看 Ubuntu 上安装了哪个 OpenSSL 版本,请运行:

dpkg -l | grep openssl
Run Code Online (Sandbox Code Playgroud)

如果您看到以下版本输出,则应包含 CVE-2014-0160 的补丁。

ii  openssl      1.0.1-4ubuntu5.12      Secure Socket Layer (SSL)...
Run Code Online (Sandbox Code Playgroud)

查看https://launchpad.net/ubuntu/+source/openssl/1.0.1-4ubuntu5.12,它显示了修复了哪种错误:

...
 SECURITY UPDATE: memory disclosure in TLS heartbeat extension
    - debian/patches/CVE-2014-0160.patch: use correct lengths in
      ssl/d1_both.c, ssl/t1_lib.c.
    - CVE-2014-0160
 -- Marc Deslauriers <email address hidden>   Mon, 07 Apr 2014 15:45:14 -0400
...
Run Code Online (Sandbox Code Playgroud)

  • 我已经在这边测试了我们更新的服务器,它告诉我我没有受到影响。您是否重新启动了系统,或者至少您确定所有必要的进程都已重新启动? (3认同)
  • 更新 OPENSSL 后,我所要做的就是重新启动 apache 服务,但是 **graceful 没有帮助**。我不得不使用`sudo service apache2 restart`重新启动 (3认同)
  • 更新 `openssl` 不会修复 Apache、Nginx 或 postfix 等应用程序。你必须更新 `libssl1.0.0` 并按照其他帖子中的说明重新启动它们。 (3认同)
  • 我已经升级并获得了 5.12 版,但是这个工具仍然告诉我我很脆弱 http://filippo.io/Heartbleed/ 想法? (2认同)

小智 17

如果您的apt-get 存储库不包含任何预编译的1.0.1g OpenSSL版本,那么只需从官方网站下载源代码并编译它。

在单个命令行下方编译和安装最新的 openssl 版本。

curl https://www.openssl.org/source/openssl-1.0.1g.tar.gz | tar xz && cd openssl-1.0.1g && sudo ./config && sudo make && sudo make install

通过符号链接将旧的 openssl 二进制文件替换为新的二进制文件。

sudo ln -sf /usr/local/ssl/bin/openssl `which openssl`
Run Code Online (Sandbox Code Playgroud)

你们都很好!

# openssl version should return
openssl version
OpenSSL 1.0.1g 7 Apr 2014
Run Code Online (Sandbox Code Playgroud)

参见这篇博文

注意:如博客文章中所述,此解决方法不会修复“必须使用 1.0.1g openSSL 源重新编译的 Nginx 和 Apache 服务器”。

  • 嘿,现在我花时间阅读了这篇文章的_详细信息,我更加震惊了——从 Internet 上的某个随机地方下载一个 tarball,解压并以 root 身份执行其中的一部分只是鲁莽的行为。如果下载并检查 tarball 签名会稍微好一些,但确保您验证签名是由正确的密钥签名本身就是一个难题。发行版已经努力确保 tarball 和补丁的安全来源。谢谢。 (6认同)
  • 通常 Ubuntu 不提供新的上游版本,而是修补了所有受支持版本的版本以将更改保持在最低限度。 (2认同)
  • 现在从源代码编译可能是一个好主意,稍后从 apt 安装一个更新的,这样你比没有预期在旧版本的 ubuntu 上更安全,无论如何只是我的两美分 (2认同)
  • @sarnold https://www.openssl.org/ 似乎不是下载 openssl 源代码的随机位置。Canonical 应该使这成为不必要的,但 openssl.org _应该_ 是权威的上游工作。 (2认同)

小智 12

对于那些不想进行服务器范围包升级的人。我今天阅读了大量这些指南,并且apt-get upgrade openssl===apt-get upgrade这将应用您的机器所需的所有安全修复程序。太好了,除非你明确地依赖某个地方的旧包版本。

这是运行 Apache 2 的 Ubuntu 12.04 LTS 所需的最少操作:

  • 转到此地址并证明您有漏洞。您应该使用您的网络服务器的直接外部地址。如果您使用负载均衡器(例如 ELB),您可能不会直接联系您的 Web 服务器。

  • 运行以下 1 行以升级软件包并重新启动。是的,我看到所有指南都说您的时间戳应该晚于 2014 年 4 月 4 日,但对我而言似乎并非如此。

    apt-get update && apt-get install openssl libssl1.0.0 && /etc/init.d/apache2 restart

  • 确保您安装了适当的软件包版本并再次检查您的网络服务器是否存在漏洞。

关键包如下,我使用下面的命令确定了这些信息,然后编辑掉了 cruft(你不需要了解我机器的状态)。

$ dpkg -l | grep ssl

ii  libssl-dev                       1.0.1-4ubuntu5.12          SSL development libraries, header files and documentation
ii  libssl1.0.0                      1.0.1-4ubuntu5.12          SSL shared libraries
ii  openssl                          1.0.1-4ubuntu5.12          Secure Socket Layer (SSL)* binary and related cryptographic tools
Run Code Online (Sandbox Code Playgroud)

1.0.1-4ubuntu5.12不应包含漏洞。再次访问下面的网站并测试您的 Web 服务器,以确保是这种情况。

http://filippo.io/Heartbleed/

  • 使用外部站点来证明服务器中的漏洞对我来说似乎是错误的方法。 (2认同)

小智 11

我注意到这里有很多评论者急需帮助。他们正在按照说明进行升级和重新启动,但在使用某些测试网站时仍然容易受到攻击。

您必须检查以确保您没有保留包,例如 libssl。

:~$ sudo apt-get upgrade -V
Reading package lists... Done
Building dependency tree
Reading state information... Done
The following packages have been kept back:
  libssl-dev (1.0.1-4ubuntu5.10 => 1.0.1-4ubuntu5.12)
  libssl1.0.0 (1.0.1-4ubuntu5.10 => 1.0.1-4ubuntu5.12)
  linux-image-virtual (3.2.0.31.34 => 3.2.0.60.71)
  linux-virtual (3.2.0.31.34 => 3.2.0.60.71)
0 upgraded, 0 newly installed, 0 to remove and 4 not upgraded.
Run Code Online (Sandbox Code Playgroud)

升级那些apt-mark unhold libssl1.0.0(例如)。然后升级:apt-get upgrade -V。然后,重新启动受影响的服务。