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

在BEAST攻击和Heartbleed bug之后 ,现在我已经听说过一个名为POODLE的 SSL / TLS漏洞。 我如何保护自己免受被剥削?

  • 是仅影响服务器还是客户端?
  • 这个OpenSSL / GnuTLS具体吗?
  • 什么样的服务受到影响? 只有HTTPS还是IMAPS,SMTPS,OpenVPN等?

请告诉我如何避免此漏洞的示例。

背景信息

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

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

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

Ubuntu是否提供任何更新?

是的,通过usn-2385-1增加了SCSVfunction, 但它并没有完全缓解这个问题,因为它没有禁用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与服务器通信,而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(在握手function中看到TLSv1 +),但浏览器希望非常向后兼容,并且它们可以。 与控制明文和构建HTTP标头的特定方式的组合使其可被利用。

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

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

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

攻击者最有可能只能窃取明文标题,如会话cookie,以执行会话劫持 。 另一个限制是需要完整(主动) MitM攻击 。

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

作为用户,除了在浏览器中禁用SSLv3之外,不是真的。 好吧,只需要安装最新的安全更新。

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

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

好吧,有一个补丁可以绕过支持TLSv1的客户端的降级攻击,称为SSLv3后备保护。 顺便提一下,它也会提高TLSv1 +的安全性(降级攻击更难/不可能)。 它是作为Ubuntu Security咨询公司usn-2385-1中最近的OpenSSL版本的后端口提供的 。

大问题:客户端和服务器都需要此补丁才能工作。 因此,在我看来,当您更新客户端和服务器时,您应该只升级到TLSv1 +。

但是,请,请暂时退出您网络中的SSLv3。 努力提升安全标准,放弃SSLv3。

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

只有你真的需要SSLv3有一些奇怪的原因,但它也提高了TLSv1 +的安全性,所以是的,我建议你安装它。 Ubuntu在usn-2385-1中提供了此function的更新。 您将通过包管理器中的常规安全更新收到它。

测试私有托管站点的漏洞(例如,Intranet / offline)。

只要服务器支持SSLv3,您的服务器就容易受到攻击。 这里有几个选项:

  • 使用OpenSSL s_client:

     openssl s_client -connect : -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 

    它不应该在’protocols’列下列出任何SSLv3。


Firefox浏览器

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

从版本34开始的Firefox将默认禁用SSLv3,因此不需要任何操作( 源 )。 然而,在撰写本文时,33日刚刚发布,34日将在11月25日发布。


谷歌浏览器(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之外的所有协议。

在您使用它时,您可能需要考虑改进网络服务器的密码套件配置,如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; 

在您使用它时,您可能需要考虑改进网络服务器的密码套件配置,如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。 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.conf以在ssl.engine = "enable"指令后添加以下行

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

然后,您应该使用sudo service lighttpd restart重新启动lighttpd服务,并执行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 

发邮件

(匿名用户未经validation的编辑,我对Sendmail不满意,请validation。)

这些选项在sendmail.mcLOCAL_CONFIG部分中配置

 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/local.conf的新文件):

 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="" 

HAProxy服务器

HAProxy> = 1.5支持SSL。

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

 bind :443 ssl crt  ciphers  no-sslv3 

参考: HAProxy文档


OpenVPN的

似乎不受影响( 来源 )。

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


木偶

Puppet在HTTPS上使用SSL,但“浏览器”客户端不使用它,只是Puppet代理不会受到显示的攻击媒介的攻击。 但是,最好只禁用SSLv3。

我的建议是使用stephenrjohnson / puppetmodule Puppet模块来设置你的Puppet master, 我之前杀死了SSLv3 。

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

有关其他信息,请参阅https://gist.github.com/3rd-Eden/715522f6950044da45d8

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

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

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