一:漏洞名称:
弱加密算法、脆弱的加密算法、脆弱的SSL加密算法、openssl的FREAK Attack漏洞
描述:
脆弱的SSL加密算法,是一种常见的漏洞,且至今仍有大量软件支持低强度的加密协议,包括部分版本的openssl。其实,该低强度加密算法在当年是非常安全的,但时过境迁,飞速发展的技术正在让其变得脆弱。黑客可利用SSL弱加密算法漏洞进行SSL中间人攻击,即强迫服务器和用户之间使用低强度的加密方式,然后再通过暴力破解,窃取传输内容。强度较弱的加密算法将不能较好的保证通信的安全性,有被攻击者破解的风险。对于linux中openssl的FREAK Attack漏洞,该漏洞是由于OpenSSL库里的s3_clnt.c文件中,ssl3_get_key_exchange函数,允许客户端使用一个弱RSA秘钥,向SSL服务端发起RSA-to-EXPORT_RSA的降级攻击,以此进行暴力破解,得到服务端秘钥。此问题存在于OpenSSL版本0.9.8zd之前, 或1.0.0p之前的1.0.0,或1.0.1k之前的1.0.1。
检测条件:
1.已知Web网站开放443端口(https)。
2.开启了SSL协议。
检测方法:
1.对于windows中的检测方法:通过加密算法检测工具,与网站系统进行加密算法枚举通信,探测系统存在的加密算法及位数情况。利用SSLciphercheck软件,通过CMD下运行,进行协议探测进行检测命令:“sslciphercheck.exe -h ip地址或者域名 -p 443”,或者是利用web扫描工具,如WVS,APPscan等进行扫描检测,相关检测截图:
2.对于linux下的openssl的FREAK Attack漏洞,检测如下:https远程检查方法(看一个网站是脆弱的RSA弱密钥攻击,你可以使用OpenSSL命令):openssl s_client -connect www.fbi.gov:443 -cipher EXPORT,如果你看到”alert handshake failure”这句话就说明该网站是安全的:
3.RedHat系列检查命令:rpm -qa|grep openssl
4.Debian\Ubuntu系列检查命令: dpkg -l|grep openssl
5、使用Nmap查看端口的服务版本,包括SSL服务版本
nmap -sV --reason -PN -n --top-ports 100 www.example.com
6、使用Nmap检测证书信息、弱加密、SSLv2
nmap --script ssl-cert,ssl-enum-ciphers -p
漏洞修复:
以下为针对脆弱的SSL加密算法漏洞的修复建议,其中包括IIS、apache、和windows本身的一些安全建议方法:
1.对于linux中openssl的FREAK Attack漏洞,如果因为生产环境无法直连外网或是变更配置管理等原因而不便更新补丁,可以采取以下临时修复方法:
- 禁用出口级弱加密算法在命令行使用:openssl ciphers MEDIUM。
- 禁止apache服务器使用出口级加密算法:vi /etc/httpd/conf.d/ssl.conf;增加如下配置:SSLCipherSuite HIGH:!aNULL:!MD5:!EXP;需要重启apache服务:/etc/init.d/httpd restart。
- 关于nginx加密算法:1.0.5及以后版本,默认SSL密码算法是HIGH:!aNULL:!MD5;0.7.65、0.8.20及以后版本,默认SSL密码算法是HIGH:!ADH:!MD5;0.8.19版本,默认SSL密码算法是:ALL:!ADH:RC4+RSA:+HIGH:+MEDIUM;0.7.64、0.8.18及以前版本,默认SSL密码算法是ALL:!ADH:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP;低版本的nginx或没注释的可以直接修改域名下ssl相关配置为ssl_ciphers HIGH:!aNULL:!MD5;需要nginx重新加载服务:/etc/init.d/nginx reload
2.对于IIS中SSL,修复方案为:
- 在 IIS 管理器中,双击本地计算机,然后右键单击所需的某个网站、目录或文件,然后单击“属性”。
- 在“目录安全性”或“文件安全性”选项卡的“安全通信”下面,单击“编辑”。
- 在“安全通信”框中,选中“需要安全通道 (SSL)”复选框。
- 如果需要使用 128 位加密,请选择“要求 128 位加密”复选框。
- 单击“确定”。
3.对于Apache的修复方案为:
1.禁用它只需几分钟的时间。例如,在Apache v2中,你只需要改变默认设置:
SSLProtocol all
To
SSLProtocol all -SSLv2
2.如何建立一个仅使用SSLv2的服务器:
可以这样建立一个仅使用SSLv2协议及其密码算法的服务器:
httpd.conf
SSLProtocol -all +SSLv2
SSLCipherSuite SSLv2:+HIGH:+MEDIUM:+LOW:+EXP
3.如何建立一个仅接受强加密请求的SSL服务器:
如下设置为仅使用最强的七种密码算法:
httpd.conf
SSLProtocol all
SSLCipherSuite HIGH:MEDIUM
4.如何建立一个仅接受强加密请求的SSL服务器,而又允许对外浏览器使用更强的加密:这个功能被称为以服务器为网关的加密(Server Gated Cryptography [SGC]), 在README.GlobalID文档中有详细说明。 简单地说就是:服务器拥有一个由来自Verisign的一个特殊的CA证书签发的服务器身份证, 从而在对外浏览器上实现强加密。 其过程如下:浏览器使用对外密码进行连接,服务器返回其全局ID身份证, 浏览器校验后在后继HTTP通讯产生之前提升其密码组。 现在的问题是:如何允许这样的提升,而又强制性地使用强加密。 换句话说就是:浏览器必须在开始连接时就使用强加密,或者提升到强加密, 但是维持对外密码是不允许的。以下巧妙地解决了这个问题:
httpd.conf
# 允许在初始握手阶段使用所有的密码,
# 以允许对外服务器通过SGC功能提升密码组
SSLCipherSuite ALL:!ADH:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP:+eNULL
<Directory /usr/local/apache2/htdocs>
# 但是最终会拒绝所有没有提升密码组的浏览器
SSLRequire %{SSL_CIPHER_USEKEYSIZE} >= 128
</Directory>
5.如何建立接受所有类型密码的SSL服务器,但对特定的URL实施强加密:显然,不能使用服务器全局设置SSLCipherSuite,它会限制密码为强类型。 但是,mod_ssl允许重配置针对目录的密码组,并自动进行一个带有服从新配置的SSL参数的重协商。 因此,其解决方案成了:
httpd.conf
# 在一般情况下的处理是宽松的
SSLCipherSuite ALL:!ADH:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP:+eNULL
<Location /strong/area>
# 但对于https://hostname/strong/area/ 及其以下的内容
# 要求强密码
SSLCipherSuite HIGH:MEDIUM
</Location>
具体详细方案,可参考:http://www.winet.cn/apache/sitemap.php
4.对于windos系统中,禁用SSL弱加密算法修复方案:
1.windows server 2003注册表可能与以下的不同。解决方案:Windows Server 2008 支持下列协议:•SSL 2.0 •SSL 3.0•TLS 1.0。Windows Server 2008 R2 和 Windows 7 支持下列协议:•SSL 2.0 •SSL 3.0•TLS 1.0•TLS 1.1•TLS 1.2,对于服务器或客户端体系结构,可以禁用这些协议。这意味着可以省略该协议,或将其禁用。如果要禁用SSL-V2.0,采用如下方案:
SSL 2.0 的服务器计算机上的注册表位置如下所示:HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\SSL 2.0\Server
(1)若要启用 SSL 2.0,请执行以下步骤:
1.在客户端计算机上,将 DisabledByDefault DWORD 值设置为 00000000。
2.在服务器计算机上,将启用的 DWORD 值设置为 0xffffffff。
3.重新启动计算机。
(2)若要禁用 SSL 2.0,请执行以下步骤:
1.在客户端计算机上,将 DisabledByDefault DWORD 值设置为 00000001。
2.在服务器计算机上,将启用 DWORD 值设置为 00000000。
3.重新启动计算机。
2.SCHANNEL 键部分、 方法或任务包含一些介绍如何修改注册表的步骤。但是,如果不正确地修改了注册表,可能会出现严重的问题。因此,请确保仔细按照下列步骤操作。为增加保护,对其进行修改之前备份注册表。然后,您可以在出现问题时还原注册表。:
SCHANNEL 键位置:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL
以下为常见的SCHANNEL键子项,包含弱加密算法的一些禁用方法:
(1)56/128 SCHANNEL\Ciphers\RC4 子项:RC4 64/128,若要允许此密码算法,更改到已启用值的 DWORD 值数据 0xffffffff.否则,更改到的 DWORD 值数据 0x0.如果您不配置启用值,默认情况下启用。
(2)56/128 SCHANNEL\Ciphers\RC2 子项:RC4 56/128,56 位 RC4 引用此注册表项。若要允许此密码算法,更改到已启用值的 DWORD 值数据 0xffffffff.否则,更改到的 DWORD 值数据 0x0.如果您不配置启用值,默认情况下启用。
(3)SCHANNEL\Ciphers\RC2 56/56 子项:RC2 56/128,56 位 RC2 引用此注册表项。若要允许此密码算法,更改到已启用值的 DWORD 值数据 0xffffffff.否则,更改到的 DWORD 值数据 0x0.如果您不配置启用值,默认情况下启用。
(4)SCHANNEL\Ciphers\RC4 40/128 子项:DES 56,56 位 DES 作为指定 FIPS 46-2 中引用此注册表项。FIPS 140-1 加密模块验证计划下,它的 Rsabase.dll 和 Rsaenh.dll 文件中的实现进行验证。若要允许此密码算法,更改到已启用值的 DWORD 值数据 0xffffffff.否则,更改到的 DWORD 值数据 0x0.如果您不配置启用值,默认情况下启用。
(5)SCHANNEL\Ciphers\RC2 40/128 子项:RC4 40/128,这指的是 40 位 RC4。若要允许此密码算法,更改到已启用值的 DWORD 值数据 0xffffffff.否则,更改到的 DWORD 值数据 0x0.如果您不配置启用值,默认情况下启用。
(6)SCHANNEL\Ciphers\NULL 子项:RC2 40/128,40 位 RC2 引用此注册表项。若要允许此密码算法,更改到已启用值的 DWORD 值数据 0xffffffff.否则,更改到的 DWORD 值数据 0x0.如果您不配置启用值,默认情况下启用。
(7)SCHANNEL\Hashes\SHA 子项:MD5,若要允许此哈希算法,将启用值的 DWORD 值数据更改为默认值 0xffffffff.否则,更改到的 DWORD 值数据 0x0.有效地禁用此算法时,不允许以下:•SSL_RSA_EXPORT_WITH_RC4_40_MD5,•SSL_RSA_WITH_RC4_128_MD5,•SSL_RSA_EXPORT_WITH_RC2_CBC_40_MD5,•TLS_RSA_EXPORT_WITH_RC4_40_MD5,•TLS_RSA_WITH_RC4_128_MD5,•TLS_RSA_EXPORT_WITH_RC2_CBC_40_MD5。
(8)SCHANNEL/KeyExchangeAlgorithms 子项:SHA,此注册表项是指安全哈希算法 (sha-1),指定 FIPS 180-1 中。FIPS 140-1 加密模块验证计划下,它的 Rsabase.dll 和 Rsaenh.dll 文件中的实现进行验证。若要允许此哈希算法,将启用值的 DWORD 值数据更改为默认值 0xffffffff.否则,更改到的 DWORD 值数据 0x0.有效地禁用此算法时,不允许以下: •SSL_RSA_WITH_RC4_128_SHA,•SSL_RSA_WITH_DES_CBC_SHA,•SSL_RSA_WITH_3DES_EDE_CBC_SHA,•SSL_RSA_EXPORT1024_WITH_DES_CBC_SHA,•SSL_RSA_EXPORT1024_WITH_RC4_56_SHA,•TLS_RSA_WITH_RC4_128_SHA,•TLS_RSA_WITH_DES_CBC_SHA,•TLS_RSA_WITH_3DES_EDE_CBC_SHA,•TLS_RSA_EXPORT1024_WITH_DES_CBC_SHA,•TLS_RSA_EXPORT1024_WITH_RC4_56_SHA。
其他补充:
可以结合这篇文章一起来学习:浅谈“POODLE信息泄露漏洞”