问题描述
在BEAST attack和Heartbleed bug之后,现在我已经听说了SSL /TLS中一个名为POODLE的新漏洞。我如何保护自己免遭被剥削?
-
只有服务器或客户受到影响?
-
这个OpenSSL /GnuTLS是特定的吗?
-
什么样的服务受到影响?只有HTTPS或IMAPS,SMTPS,OpenVPN等?
请向我展示如何避免此漏洞的示例。
最佳解决思路
背景信息
SSL旨在确保互联网上的传输级别。对于’the web’又名HTTP,你会知道这是HTTPS,但它也用于其他应用程序协议。 SSLv2是第一个广泛使用的传输安全协议,但不久后发现它不安全。后继SSLv3和TLSv1现在得到广泛支持。 TLSv1.1和TLSv1.2更新,并获得了很多支持。大多数(如果不是所有)2014年发布的网络浏览器都支持它。
Google工程师最近的发现指出,SSLv3不应该再使用(比如很久以前就弃用了SSLv2)。无法连接到您的网站/服务的客户可能非常有限。 CloudFlare announced不到0.09%的访问者仍然依赖SSLv3。
简单的解决方案:禁用SSLv3。
Ubuntu提供任何更新吗?
是的,通过添加SCSV功能的usn-2385-1,但它不会完全缓解问题,因为它不会禁用SSLv3,并且修补程序只有在修补连接的两端时才有效。您将通过您的软件包管理器中的常规安全更新来收到它。
所以,你仍然必须采取行动来禁用SSLv3(它是可配置的)。未来版本的客户端/浏览器将最有可能禁用SSLv3。例如。 Firefox 34将会这样做。
默认情况下,在Ubuntu的实施级别禁用SSLv3可能会破坏一些东西,对于non-HTTPS SSL使用情况并不那么脆弱,所以我认为维护人员不会这样做,只会应用此SCSV补丁。
为什么通过usn-2385-1在OpenSSL中更新SCSV不会减轻问题?
真的,停止询问这些问题,只需跳过几段并禁用SSLv3即可。但是,嘿,如果你不相信,在这里你去:
POODLE显示带有CBC密码的SSLv3被破坏,实施SCSV不会改变这一点。根据需要,SCSV只会确保您不会从通常情况下所需的Man-in-the-中等攻击所需的某些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 security release,但在下面阅读(但我真的需要SSLv3支持…为了X,Y,Z原因!),为什么你最好集中精力禁用SSLv3。
我可以杀死网络(防火墙)级别的SSLv3吗?
好吧,可能。我把它放在一个单独的博客文章中,以便进一步思考和工作。我们可能会有一些神奇的iptables
规则可以使用!
我的博客文章:How to take down SSLv3 in your network using iptables for POODLE?
它仅适用于HTTPS还是适用于IMAP /SMTP /OpenVPN和其他支持SSL的协议?
研究人员表示,目前的攻击媒介与控制使用在受害者机器上运行的JavaScript的明文发送到服务器。此矢量不适用于不使用浏览器的non-HTTPS方案。
此外,通常SSL客户端不允许将会话降级到SSLv3(在握手功能中显示TLSv1 +),但浏览器希望与后向兼容,并且它们可以。控制明文的组合和HTTP头部的特定方式使得它可以被利用。
结论:现在禁用HTTPS的SSLv3,在下一个服务窗口中为其他服务禁用SSLv3。
有什么影响?我是否需要撤销并重新生成服务器证书? (和Heartbleed一样)
不,你不需要为此转动你的证书。该漏洞从会话数据中暴露明文恢复,但不提供对任何秘密的访问(会话密钥或证书密钥)。
攻击者很可能只能窃取明文头像会话cookie,以便执行session hijacking。另外一个限制是需要一个完整的(有效的)MitM attack。
还有什么可以改进我的SSL配置吗?
作为用户,除了在浏览器中禁用SSLv3之外,并不是真的。那么,只要始终安装最新的安全更新即可。
对于服务器,请遵循Mozilla’s TLS server guide。并用Qualys’ SSL Labs test进行测试。在您的网站上获得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
它不应该在’protocols’列中列出任何带有SSLv3的内容。
Firefox浏览器
打开about:config
,找到security.tls.version.min
并将值设置为1
。然后重新启动浏览器以删除所有打开的SSL连接。
从版本34开始,Firefox将默认禁用SSLv3,因此不需要任何操作(source)。然而,在写作的那一刻,刚刚释放了33个,并且在11月25日设置了34个。
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的谷歌浏览器或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’s TLS server guide中所述,改进您的Web服务器的密码组配置。添加例如:
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 documentation
现在测试它:如果您的网站是公开的,请使用Qualys’ SSL Labs tool进行测试。
Nginx服务器
如果您正在运行Nginx,请在您的配置中将其他SSL指令中包含以下行:
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
在您处理它时,您可能需要考虑如Mozilla’s TLS server guide中所述,改进您的Web服务器的密码组配置。添加例如:
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
现在测试它:如果您的网站是公开的,可用的,请使用Qualys’ SSL Labs tool进行测试。
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
对于’opportunistic SSL'(加密策略未强制执行,普通也可接受),则不需要更改任何内容。即使SSLv2比普通的更好,所以如果你需要保护你的服务器,你应该使用’mandatory SSL’模式。
对于已经配置的’mandatory 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
(匿名用户未经验证的编辑,我不熟悉Sendmail,请验证。)
这些选项在sendmail.mc
的LOCAL_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
在Dovecot v2.1 +中,将以下内容添加到/etc/dovecot/local.conf
(或/etc/dovecot/conf.d
中的新文件)中:
ssl_protocols = !SSLv2 !SSLv3
并重启Dovecot:
sudo service dovecot restart
对于旧版本,您将不得不使用patch the source code。
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服务器
SSL在HAProxy> = 1.5中受支持。
编辑/etc/haproxy.cfg
文件并找到您的bind
行。附加no-sslv3
。例如:
bind :443 ssl crt <crt> ciphers <ciphers> no-sslv3
OpenVPN
看起来不受影响(source)。
OpenVPN uses TLSv1.0, or (with >=2.3.3) optionally TLSv1.2 and is thus not impacted by POODLE.
Puppet
Puppet通过HTTPS使用SSL,但不会被’browser’客户端使用,只是Puppet代理不会受到所示攻击媒介的攻击。但是,最好禁用SSLv3。
我的建议是使用stephenrjohnson/puppetmodule Puppet模块设置您的Puppet主控器,其中的I killed SSLv3在前一段时间。
次佳解决思路
可能不是Ubuntu特有的,但为了解决Node.js中的Poodle漏洞,您可以在创建https或tls服务器时将secureOptions
设置为require('constants').SSL_OP_NO_SSLv3
。
有关更多信息,请参阅https://gist.github.com/3rd-Eden/715522f6950044da45d8