![如何修补/解决 SSLv3 POODLE 漏洞 (CVE-2014-3566)?](https://linux22.com/image/976155/%E5%A6%82%E4%BD%95%E4%BF%AE%E8%A1%A5%2F%E8%A7%A3%E5%86%B3%20SSLv3%20POODLE%20%E6%BC%8F%E6%B4%9E%20(CVE-2014-3566)%EF%BC%9F.png)
之后野兽攻击和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"
然后,您应该使用 重新启动 lighttpd 服务,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"