如何修补/解决 SSLv3 POODLE 漏洞 (CVE-2014-3566)?

如何修补/解决 SSLv3 POODLE 漏洞 (CVE-2014-3566)?

之后野兽攻击Heartbleed 漏洞,现在我听说了 SSL/TLS 中的一个新漏洞,叫做贵宾犬. 我该如何保护自己免受剥削?

  • 是否仅服务器受到影响,还是客户端也受到影响?
  • 这是 OpenSSL/GnuTLS 特有的吗?
  • 哪些服务会受到影响?仅 HTTPS 还是 IMAPS、SMTPS、OpenVPN 等也会受到影响?

请向我展示如何避免此漏洞的示例。

答案1

背景信息

SSL 旨在保护互联网上的传输层。对于“网络”(即 HTTP),您会将其称为 HTTPS,但它也用于其他应用程序协议。SSLv2 是第一个广泛使用的传输安全协议,但不久后被发现不安全。后继的 SSLv3 和 TLSv1 现在受到广泛支持。TLSv1.1 和 TLSv1.2 较新,也获得了很多支持。2014 年发布的大多数(如果不是全部)网络浏览器都支持它。

Google 工程师最近的发现指出,不应再使用 SSLv3(就像 SSLv2 很久以前就被弃用一样)。无法连接到您的网站/服务的客户端可能非常有限。CloudFlare宣布不到 0.09% 的访问者仍然依赖 SSLv3。

简单的解决方案:禁用 SSLv3。

Ubuntu 提供任何更新吗?

是的,通过usn-2385-1添加了 SCSV 功能后,但它并不能完全缓解问题因为它不会禁用 SSLv3,并且只有当连接的两端都已修补时,修补程序才会起作用。您将通过包管理器中的常规安全更新收到它。

所以,仍然必须自行采取措施禁用 SSLv3(可配置)。未来版本的客户端/浏览器很可能会禁用 SSLv3。例如 Firefox 34 将会禁用 SSLv3。

在 Ubuntu 的实施层面上默认完全禁用 SSLv3 可能会破坏一些不太容易受到攻击的非 HTTPS SSL 使用,因此我认为维护人员不会这样做,只会应用这个 SCSV 补丁。

为什么通过 usn-2385-1 进行 OpenSSL 中的 SCSV 更新不能缓解该问题?

真的,别再问这样的问题了,直接跳过几段文字并禁用 SSLv3 就行了。但是,如果你不相信,下面就是答案:

POODLE 显示使用 CBC 密码的 SSLv3 已被破解,实施 SCSV 不会改变这一点。SCSV 仅确保您不会根据需要从某些 TLS 协议降级到任何较低的 TLS/SSL 协议,并且通常情况下需要中间人攻击。

如果您必须访问某个根本不提供 TLS 而只提供 SSLv3 的服务器,那么您的浏览器实际上别无选择,只能使用 SSLv3 与服务器通信,而这在没有任何降级攻击的情况下很容易受到攻击。

如果你必须访问某些同时提供 TLSv1+ 和 SSLv3 的服务器(不建议这样做),并且希望确保你的连接不会被攻击者降级到 SSLv3,那么两个都服务器和客户端都需要这个 SCSV 补丁。

为了完全缓解此问题,禁用 SSLv3 就足够了,您可以确保不会降级。而且您将无法与仅支持 SSLv3 的服务器通信。

好的,那么我如何禁用 SSLv3?

请参阅下面特定应用程序的部分:目前涵盖 Firefox、Chrome、Apache、Nginx 和 Postfix。

是否仅服务器受到影响,还是客户端也受到影响?

如果服务器和客户端都接受 SSLv3(即使由于降级攻击两者都能够使用 TLSv1/TLSv1.1/TLS1.2),则存在漏洞。

作为服务器管理员,您应该禁用 SSLv3现在为了您的用户的安全。

作为用户,您应该在浏览器中禁用 SSLv3现在在访问仍然支持 SSLv3 的网站时确保自己的安全。

这是 OpenSSL/GnuTLS/浏览器特有的吗?

不是。这是一个协议(设计)错误,而不是实现错误。这意味着您无法真正修补它(除非您更改旧 SSLv3 的设计)。

是的,还有一个新的OpenSSL 安全版本,但请阅读下文(但我真的真的需要 SSLv3 支持...原因 X、Y、Z!) 为什么您最好集中精力完全禁用 SSLv3。

我可以在网络(防火墙)级别终止 SSLv3 吗?

嗯,是的,可能吧。我把这个放在了另一篇博文中,以便进一步思考和研究。我们可能有一些iptables你可以使用的神奇规则!

我的博客文章:如何使用 POODLE 的 iptables 关闭网络中的 SSLv3?

它仅与 HTTPS 相关还是也与 IMAP/SMTP/OpenVPN 和其他支持 SSL 的协议相关?

研究人员展示的当前攻击向量是使用在受害者机器上运行的 Javascript 控制发送到服务器的明文。此向量不适用于不使用浏览器的非 HTTPS 场景。

此外,通常 SSL 客户端不允许将会话降级到 SSLv3(在握手功能中可以看到 TLSv1+),但浏览器希望向后兼容,并且确实做到了。控制纯文本和 HTTP 标头的特定构建方式相结合使其可以被利用。

结论:禁用 HTTPS 的 SSLv3现在,在下一个服务窗口中禁用其他服务的 SSLv3。

这有什么影响?我需要撤销并重新生成服务器证书吗?(与 Heartbleed 一样)

不,您不需要为此轮换证书。该漏洞暴露了从会话数据中恢复明文的漏洞,它不提供对任何机密的访问权限(无论是会话密钥还是证书密钥)。

攻击者很可能只能窃取会话 cookie 等明文标头来执行会话劫持. 另一个限制是需要完全(主动)中间人攻击

我还能做些什么来总体改善我的 SSL 配置吗?

作为用户,除了在浏览器中禁用 SSLv3 之外,其实不需要。只需始终安装最新的安全更新即可。

对于服务器,请遵循Mozilla 的 TLS 服务器指南. 并测试Qualys SSL Labs 测试。让您的网站获得 A+ 评级其实并不难。只需更新您的软件包并实施 Mozilla 指南中的建议即可。

但我确实非常需要 SSLv3 支持... 原因 X、Y、Z!现在怎么办?

嗯,有一个补丁可以绕过支持 TLSv1 的客户端的降级攻击,称为 SSLv3 回退保护。顺便说一句,它也会提高 TLSv1+ 的安全性(降级攻击更难/不可能)。它是 Ubuntu 安全公告中较新 OpenSSL 版本的反向移植版本usn-2385-1

重要提示:客户端和服务器都需要此补丁才能正常工作。因此,在我看来,在更新客户端和服务器时,您应该升级到 TLSv1+。

但是,请您暂时在您的网络中淘汰 SSLv3。努力升级安全标准,然后抛弃 SSLv3。

我听说 SCSV 支持可以消除协议降级攻击。我需要它吗?

只有当你出于某些奇怪的原因确实需要 SSLv3 时,它才会出现,但它也提高了 TLSv1+ 的安全性,所以是的,我建议你安装它。Ubuntu 在usn-2385-1。您将通过包管理器中的常规安全更新收到它。

测试私人托管网站(例如内联网/离线)的漏洞。

如果您的服务器支持 SSLv3,则很容易受到攻击。这里有几种选择:

  • 使用 OpenSSL s_client:

    openssl s_client -connect <server>:<port> -ssl3
    

    如果连接成功,则 sslv3 已启用。如果失败,则禁用。失败时,您应该会看到类似以下内容:

    error:14094410:SSL routines:SSL3_READ_BYTES:sslv3 alert handshake failure
    
  • 使用nmap

    nmap --script ssl-enum-ciphers -p 443 myhostname.tld
    

    它应该输出“ SSLv3: No supported ciphers found”。调整您的主机名/端口。

  • 使用密码扫描. 克隆/下载二进制文件并执行:

    ./cipherscan myhostname.tld
    

    它应该不是在‘协议’栏下列出任何与 SSLv3 相关的内容。


Firefox 浏览器

打开about:config,找到security.tls.version.min并将值设置为1。然后重新启动浏览器以删除所有打开的 SSL 连接。

Firefox 从版本 34 开始将默认禁用 SSLv3,因此无需采取任何措施(来源)。然而,在撰写本文时,33 刚刚发布,34 定于 11 月 25 日发布。


Google Chrome(Linux)

编辑/usr/share/applications/google-chrome.desktop文件,例如

sudo nano /usr/share/applications/google-chrome.desktop

编辑所有线路从 开始Exec=包括--ssl-version-min=tls1

例如

Exec=/usr/bin/google-chrome-stable %U

变成

Exec=/usr/bin/google-chrome-stable --ssl-version-min=tls1 %U

然后确保完全关闭浏览器(Chrome 应用可能会让您的浏览器在后台保持活动状态!)。

注意:每次更新 google-chrome 软件包时,您可能需要重复此操作,以覆盖此.desktop启动器文件。截至撰写本文时,尚未发布默认禁用 SSLv3 的 Google Chrome 或 Chromium 浏览器。


Apache HTTPD 服务器

如果您正在运行当前允许 SSLv3 的 Apache Web 服务器,则需要编辑 Apache 配置。在 Debian 和 Ubuntu 系统上,该文件为/etc/apache2/mods-available/ssl.conf在 CentOS 和 Fedora 上,该文件是/etc/httpd/conf.d/ssl.conf。您需要将以下行与其他 SSL 指令一起添加到 Apache 配置中。

SSLProtocol All -SSLv2 -SSLv3

这将允许除 SSLv2 和 SSLv3 之外的所有协议。

在此过程中,您可能需要考虑改进 Web 服务器的密码套件配置,如Mozilla 的 TLS 服务器指南.例如添加:

SSLCipherSuite          ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA
SSLHonorCipherOrder     on
SSLCompression          off
# Read up on HSTS before you enable it (recommended)
# Header add Strict-Transport-Security "max-age=15768000"

然后检查新配置是否正确(没有拼写错误等):

sudo apache2ctl configtest

并重新启动服务器,例如

sudo service apache2 restart

在 CentOS 和 Fedora 上:

systemctl restart httpd

更多信息:Apache 文档

现在测试一下:如果您的网站是公开的,请使用以下方式进行测试Qualys 的 SSL Labs 工具


Nginx 服务器

如果您正在运行 Nginx,只需在配置中的其他 SSL 指令中包含以下行:

ssl_protocols TLSv1 TLSv1.1 TLSv1.2;

在此过程中,您可能需要考虑改进 Web 服务器的密码套件配置,如Mozilla 的 TLS 服务器指南.例如添加:

ssl_ciphers 'ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA';
ssl_prefer_server_ciphers on;
# Read up on HSTS before you enable it (recommended)
# add_header Strict-Transport-Security max-age=15768000;

并重新启动服务器,例如

sudo service nginx restart

参考:Nginx 文档

现在测试一下:如果您的网站是公开的、可用的,请使用以下方式进行测试Qualys 的 SSL Labs 工具


Lighttpd 网络服务器

Lighttpd 1.4.28 以上版本支持配置选项以禁用 SSLv2 和 v3。Lighttpd 1.4.28 之前的版本仅允许您禁用 SSLv2。 请注意,Ubuntu 12.04 LTS 及更早版本最好安装 lighttpd v1.4.28,因此这些发行版无法提供简单的修复。 因此,此修复程序仅适用于 Ubuntu 12.04 以上的版本。

对于 Ubuntu 12.04 或 Debian 6,可以从 openSUSE 存储库获取更新的 lighttpd 包: http://download.opensuse.org/repositories/server:/http/Debian_6.0

该软件包适用于 Debian 6(squeeze),但也适用于 12.04(precise)

编辑您的指令/etc/lighttpd/lighttpd.conf后添加以下几行ssl.engine = "enable"

ssl.use-sslv2          = "disable"
ssl.use-sslv3          = "disable"

然后,您应该使用 重新启动 lig​​httpd 服务,sudo service lighttpd restart并执行前面章节中描述的 ssl3 握手测试,以确保更改已成功实施。

取自http://redmine.lighttpd.net/projects/lighttpd/wiki/Docs_SSL


Postfix SMTP

对于“机会性 SSL”(不强制执行加密策略,也可以接受纯文本),您无需更改任何内容。即使 SSLv2 也比纯文本更好,因此如果您需要保护服务器,无论如何您都应该使用“强制 SSL”模式。

对于已经配置的“强制 SSL”模式,只需添加/更改smtpd_tls_mandatory_protocols入站连接设置和smtp_tls_mandatory_protocols对于出站连接:

smtpd_tls_mandatory_protocols=!SSLv2,!SSLv3
smtp_tls_mandatory_protocols=!SSLv2,!SSLv3

或者,如果您还想禁用 SSLv3 的机会加密(尽管如上所述这是不必要的),请按如下方式操作:

smtpd_tls_protocols=!SSLv2,!SSLv3
smtp_tls_protocols=!SSLv2,!SSLv3

并重新启动 Postfix:

sudo service postfix restart

发送邮件

(匿名用户进行的未经验证的编辑,我对 Sendmail 不太熟悉,请验证。)

这些选项在LOCAL_CONFIG您的sendmail.mc

LOCAL_CONFIG
O CipherList=HIGH
O ServerSSLOptions=+SSL_OP_NO_SSLv2 +SSL_OP_NO_SSLv3 +SSL_OP_CIPHER_SERVER_PREFERENCE
O ClientSSLOptions=+SSL_OP_NO_SSLv2 +SSL_OP_NO_SSLv3

多夫科特

在 Dovecot v2.1+ 中,将以下内容添加到您的/etc/dovecot/local.conf(或 中的新文件/etc/dovecot/conf.d):

ssl_protocols = !SSLv2 !SSLv3

并重新启动 Dovecot:

sudo service dovecot restart

对于旧版本,你必须修补源代码


Courier-imap (imapd-ssl)

Courier-imap 在 Ubuntu 12.04 和其他版本上默认允许 SSLv3。您应该禁用它并使用 STARTTLS 来强制使用 TLS。编辑您的/etc/courier/imapd-ssl配置文件以反映以下更改

IMAPDSSLSTART=NO
IMAPDSTARTTLS=YES
IMAP_TLS_REQUIRED=1
TLS_PROTOCOL=TLS1
TLS_STARTTLS_PROTOCOL=TLS1
TLS_CIPHER_LIST="<take those from the Mozilla TLS Server guide!>"

HAProxy 服务器

HAProxy >= 1.5 支持 SSL。

编辑/etc/haproxy.cfg文件并找到您的bind行。附加no-sslv3。例如:

bind :443 ssl crt <crt> ciphers <ciphers> no-sslv3

参考:HAProxy 文档


OpenVPN

似乎不受影响(来源)。

OpenVPN 使用 TLSv1.0,或(>=2.3.3)可选使用 TLSv1.2,因此不受 POODLE 的影响。


木偶

Puppet 使用 HTTPS 上的 SSL,但“浏览器”客户端不会使用它,只有不易受到所示攻击媒介影响的 Puppet 代理才会使用它。不过,最佳做法是禁用 SSLv3。

我的建议是使用stephenrjohnson/puppetmodulePuppet 模块用于设置你的 Puppet Master,我杀死了 SSLv3前一段时间。

答案2

可能不是 ubuntu 特有的,但为了解决 Node.js 中的 Poodle 漏洞,您可以在创建 https 或 tls 服务器时将其设置secureOptions为。require('constants').SSL_OP_NO_SSLv3

https://gist.github.com/3rd-Eden/715522f6950044da45d8了解更多信息

答案3

针对 courier 的“修复”禁用了 tls 1.1 和 tls 1.2。似乎没有办法使用 tls 1.1 或更高版本运行 courier。服务器上的 PCI 扫描可能会返回以下建议:

将 SSL/TLS 服务器配置为仅使用 TLS 1.1 或 TLS 1.2(如果支持)。将 SSL/TLS 服务器配置为仅支持不使用分组密码的密码套件。

答案4

由于 POODLE 漏洞是协议本身的设计缺陷,而不是实现错误,因此不会有补丁。缓解此问题的唯一方法是禁用 apache 服务器中的 SSLv3。将以下行添加到 ssl.conf 中并正常重启 apache。

SSLProtocol all -SSLv2 -SSLv3
SSLHonorCipherOrder on
SSLCipherSuite "EECDH+ECDSA+AESGCM EECDH+aRSA+AESGCM EECDH+ECDSA+SHA384 EECDH+ECDSA+SHA256 EECDH+aRSA+SHA384 EECDH+aRSA+SHA256 EECDH+aRSA+RC4 EECDH EDH+aRSA RC4 !aNULL !eNULL !LOW !3DES !MD5 !EXP !PSK !SRP !DSS"

相关内容