SSL Renegotiation中的Secure Renegotiation与Client-initiated Renegotiation问题

SSL Renegotiation是SSL的一个机制,主要用于对使用的加密算法、密钥进行重协商,SSL Renegotiation主要用于三个场景。

场景一:双向认证时要求客户证书。在理想情况下,服务器在第一次和客户端握手时将会要求客户端提供证书,但实际情况下,由于种种原因,客户证书仅在必要时(如重要操作等)才会被请求,所以没有在第一次握手时请求客户端证书但在后续需要提供证书时,服务器将会发起Renegotiation。

场景二:服务器使用了不同的加密算法。在某些情况下,服务器可能对不同的资源采取不同的加密算法,当客户端请求的资源被不同的算法加密保护时,服务器将会发起Renegotiation。

场景三:客户端主动发起Renegotiation。

总得来说,SSL Renegotiation是一个使用不太频繁但却在某些场景发生重大作用的一个机制,同时这个机制由于历史原因和客观原因,成为一个经常被发现存在漏洞的机制。CVE-2011-1473   SSL Renegotiation DoS和 CVE-2009-3555   SSL Renegotiation vulnerability就是SSL Renegotiation中的两个漏洞,如工作上的一个case,同事的反馈将这两个弄混了,导致在后期处理时出现了诸多不畅

CVE-2009-3555是SSL协议设计考虑不周导致的一个漏洞,利用这个漏洞能够在受保护的TLS/SSL连接上引入信息,从而发送流量来欺骗经验证的客户端,造成中间人攻击。openssl对于CVE-2009-3555的修复方式是推出了基于RFC5746的修复方式,即Secure Renegotiation的方式。

CVE-2009-3555需要升级openssl来进行修复,openssl-0.98m之后的版本就已经修复了该漏洞,使用了Secure Renegotiation。

可以通过 openssl s_client –connect IP:port的方式来进行检查,在输出中如果存在 Secure Renegotiation IS supported则可以确认该漏洞已经修复。

CVE-2011-1473 是由于SSL协议的客观因素引起的。因为服务器在进行密钥的计算时,其消耗的计算资源是客户端的数十倍,所以如果可以允许客户端主动发起Renegotiation,那么将可以造成DoS攻击。

当然,由于计算资源对比的这一特性,即便不开启Renegotiation,客户端不断发起大量的SSL连接也会造成服务器大量的计算,同样也可以造成DoS攻击。

CVE-2011-1473的修复方式就是禁用SSL Renegotiation的Client-initiated Renegotiation。在这个漏洞的修复上,对于Apache而言,基本上所有的说法都是升级到Apache 2.2.15 及其以后集成openssl的版本,并且配置 SSLInsecureRenegotiation off选项。如某厂扫描器的报告所言:

但是在实际测试中,发现了奇怪的问题。

SSLInsecureRenegotiaton 为 on 或者 off 都不影响Client-initiated Renegotiation被关闭的结果。使用thc-ssl-dos进行测试,一直都提示 Target has disabled renegotiations。

通过查看Apache给到的官方文档(http://httpd.apache.org/docs/2.2/mod/mod_ssl.html#sslinsecurerenegotiation), SSLInsecureRenegotiation只是用来打开或者关闭SecureRenegotiation,并没有说明其可以用来打开或者关闭Client-initiated Renegotiation。

同时,在stackoverflow中一个歪果仁也提出过这个问题,在回复中看到有如下回复“I looked through the source code of Apache (ssl_engine_kernel.c) and found that from Apache 2.2.15 up to Apache 2.4.7 (latest), every client-initiated renegotiation in an ssl session is rejected and cause the ssl session to be aborted. You can find that from ssl_callback_Info() in ssl_engine_kernel.c”,可见事实应该是这样,和IIS6.0之后的版本一样,在Apache 2.2.15之后的版本中,默认已经关闭了Client-initiated Renegotiation,并且没有内置接口打开Client-initiated Renegotiation。由于不懂C语言,就不去查看这段代码了。

至于某厂扫描器的结论,我想也许是个巧合的出现,让其认定了SecureRenegotiation是Client-initiated Renegotiation的配置。

参考文献:

Apache Module mod_ssl

From URL: http://httpd.apache.org/docs/2.2/mod/mod_ssl.html

简单分析TLS & SSLv3 renegotiation vulnerability

From URL: http://blog.csdn.net/progliker/article/details/5348618

Apache SSLInsecureRenegotiation directive not working

From URL: http://stackoverflow.com/questions/21310601/apache-sslinsecurerenegotiation-directive-not-working

 

1 0

Leave a Reply

Your email address will not be published. Required fields are marked *