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


157

BEAST攻击Heartbleed错误之后,现在我听说SSL / TLS中的一个名为POODLE的新漏洞。如何保护自己免受剥削?

  • 仅影响服务器还是影响客户端?
  • 这是OpenSSL / GnuTLS专用的吗?
  • 哪些服务受到影响?仅HTTPS还是IMAPS,SMTPS,OpenVPN等?

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


2
可在此处找到更多信息SSL3“贵宾犬”漏洞
Braiam

1
@Braiam是的,我知道,再一次是聪明的托马斯!但是,这是非常面向密码的问答。本关于AU的问答旨在提供实用和面向Ubuntu的信息。:-)
gertvdijk 2014年

10
??您如何期望比“如果不安装修补程序,那么Níðhöggr会吞噬您的脾脏”更实用的解决方案。
Braiam

2
@Braiam首先:没有补丁(请阅读我的回答)。我认为Thomas是指设备而不是DIY-Ubuntu Web服务器托管。诸如负载平衡器之类的设备通常会提供固件更新以更改默认设置,或者会提供能够对其进行配置的功能。但是,在Ubuntu中,这完全取决于用户/管理员。
gertvdijk 2014年

实际上有:供应商可以禁用/删除所有与SSLv3相关的代码,因此您根本不需要触摸任何东西。
Braiam 2014年

Answers:


209

背景资料

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

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

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

Ubuntu是否提供任何更新?

是的,通过具有SCSV功能的usn -2385-1但它不能完全缓解该问题,因为它没有禁用SSLv3,并且只有在对连接的两面都进行了修补的情况下,该修补程序才起作用。您将通过程序包管理器中的常规安全更新来接收它。

因此,仍然必须自己采取行动来禁用SSLv3(它是可配置的)。客户端/浏览器的未来版本很可能会禁用SSLv3。例如Firefox 34会这样做。

在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规则可以使用!

我的博客文章:如何使用iptables for POODLE删除网络中的SSLv3?

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

研究人员显示,当前的攻击媒介可通过使用在受害者计算机上运行的Javascript控制发送到服务器的纯文本。如果不使用浏览器,此向量不适用于非HTTPS方案。

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

结论:禁用SSLv3的用于HTTPS 现在,禁用SSLv3的为你的下一个服务窗口等服务。

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

不,您不需要为此旋转证书。该漏洞公开了从会话数据进行的纯文本恢复,它不提供对任何机密(会话密钥或证书密钥)的访问。

攻击者很可能只能窃取会话cookie之类的纯文本标头,以执行会话劫持。另一个限制是需要全面(主动)的MitM攻击

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

作为用户,除了在您的浏览器中禁用SSLv3之外,实际上不是。好吧,始终安装最新的安全更新。

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

但是我真的很需要SSLv3支持...原因X,Y,Z!怎么办?

好吧,有一个补丁可以防御具有TLSv1功能的客户端的降级攻击,称为SSLv3后备保护。顺便说一下,它也将提高TLSv1 +的安全性(降级攻击更难/不可能)。它是Ubuntu安全通报usn-2385-1中较新的OpenSSL版本的反向移植

大收获:客户端和服务器都需要此补丁才能正常工作。因此,我认为在更新客户端和服务器时,无论如何都应该升级到TLSv1 +。

但是,请暂时将您网络中的SSLv3淘汰。努力升级安全标准,而放弃SSLv3。

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

仅当您出于某些奇怪的原因确实需要SSLv3时,但是它也可以提高TLSv1 +中的安全性,因此,我建议您安装它。Ubuntu在usn-2385-1中提供了此功能的更新。您将通过程序包管理器中的常规安全更新来接收它。

测试专用站点(例如Intranet /离线)的漏洞。

仅当服务器支持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。克隆/下载二进制文件并执行它:

    ./cipherscan myhostname.tld
    

    这应该不是列表中的“协议”栏下有任何的SSLv3。


火狐浏览器

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

从版本34开始的Firefox将默认禁用SSLv3,因此无需任何操作(source)。但是,在撰写本文时,仅发布了33个,而将11月25日设置为34。


谷歌浏览器(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 Web服务器

Lighttpd版本> 1.4.28支持禁用SSLv2和v3的配置选项。1.4.28之前的Lighttpd版本仅允许您禁用SSLv2。 请注意,Ubuntu 12.04 LTS和更早版本的安装最好是lighttpd v1.4.28,因此这些发行版没有简单的修复程序。 因此,此修复程序仅应用于大于12.04的Ubuntu版本。

对于Ubuntu 12.04或Debian 6,可从openSUSE信息库获得更新的lighttpd软件包:http : //download.opensuse.org/repositories/server : /http/Debian_6.0

该软件包适用于Debian 6(压缩),但也适用于12.04(精确)

编辑您/etc/lighttpd/lighttpd.confssl.engine = "enable"指令,以在指令后添加以下行

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

然后,您应该使用来重新启动lighttpd服务,sudo service lighttpd restart并按照前面各节中的说明执行ssl3握手测试,以确保成功实现了更改。

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


后缀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文档


开放VPN

似乎不受影响(来源)。

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


木偶

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

我的建议是使用stephenrjohnson / puppetmodule Puppet模块来设置您的Puppet主服务器,前一段时间在其中杀死了SSLv3


7
在公开发布此漏洞后,很快就创建了这个答案。那里仍然可能有错误-与往常一样,随时进行编辑/改进。
gertvdijk 2014年

1
Nginx配置在ssl_protocols指令后不应该带有冒号
Michelle

1
好吧,对于Firefox,我相信是正在发生的事情。
fuglede 2014年

4
此Mozilla Security博客文章建议安装此加载项,而不是手动调整首选项。
legoscia 2014年

1
@muru这是在防火墙级别杀死SSLv3的开始。blog.g3rt.nl/take-down-sslv3-using-iptables.html
gertvdijk 2014年

4

可能不是Ubuntu的具体的,但为了解决在Node.js的贵宾犬vulnerablity可以设置secureOptionsrequire('constants').SSL_OP_NO_SSLv3当你创建一个HTTPS或TLS服务器。

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


1
IMO,您不应该直接使用Node / Python / Ruby或类似的东西公开HTTP(S)。在它前面放一个像Apache / Nginx / ...这样的HTTPd
gertvdijk 2014年

是的,您不应该直接曝光。tcp层HTTP的语言不是很好,但是它们在执行套接字时会摇摆不定。让nginx从套接字读取它。:-)
jrg

4
这不应该被否决。在许多情况下,除了托管http服务器外,还会使用tls。
psanford 2014年

@gertvdijk&jrg Node.js不是一种语言。这是用于构建可扩展网络应用程序的框架。正如您指出的那样,应该将Node.js放在Apache服务器之后(甚至称其为“体面的”)已经清楚地表明您完全不知道自己在说什么。声明他们对tpc / http不好,这显然是个人偏见。请只关注话题,而不要像您不了解的那样简单地拒绝投票。
2014年

@ 3rdEden好吧,也许我的评论有点笼统,但是这里有一些我想做的笔记。1)我没有投票,2)我的评论是一个温和的“ IMO”,3)也许这只是我的安全背景,但是我了解到不应将应用程序框架直接面向80/443公开给世界。生产。(除非出于演示目的)。4)我看不到您的帖子如何成为一般Ask Ubuntu访问者对该问题的“答案”;它只是非常特定于Node.js部署的特定情况。
gertvdijk 2014年

0

快递的“修复”禁用tls 1.1和tls 1.2。似乎没有办法使用tls 1.1或更高版本运行courier。建议您对服务器进行PCI扫描:

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


-1

由于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"

1
-1表示RC4和非功能性ECDSA,因为大多数人都具有RSA证书。请仔细阅读如何正确配置服务器。wiki.mozilla.org/Security/Server_Side_TLS
gertvdijk 2014年

2
@gertvdijk对于RC4,我同意你的看法,但是包含ECDSA套件也没有什么坏处。如果您只有RSA证书,那么这是无害的,并且如果以后再获得ECDSA证书,则可以省去修复配置的麻烦。
马特·诺德霍夫

@MattNordhoff足够公平,但是我的意思是对于基于RSA证书的常规配置只剩下了很少的密码。它可以在大多数浏览器中使用,但是可能会遇到兼容性问题。
gertvdijk 2014年

绝对从该列表中删除RC4,这是不安全的。如果可以的话,剩下的留着。3DES较弱,但出于兼容性考虑,我已在一个特定位置将其启用。我讨厌这样做,因为它很弱,但至少它实际上并没有损坏……
Brian Knoblauch 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.