OpenSSL CVE-2016-0800和CVE-2016-0703漏洞修复细节拾趣

发表于:2016-03-03 09:40:00 来源:  360安全播报 阅读数(0人)



by 360信息安全部- au2o3t@360 CloudSec Team


1. 引子


本来最近和360 Nirvan Team的DQ430愉快的参加某加密厂商的年度大会,结果openssl也出来碰热闹,也许真是为了DH兄弟送大礼,苦了我们这些安全运维的。


2. 细节


360在内部信息安全实践历程中,“360信息安全部”逐步秉承最佳安全实践,在https等ssl领域逐渐做出了明显的变化。


比如重要系统中禁止不安全的加密套件使用,来减少ssl的攻击面。


我们在今天的内部运维修复中发现了个有趣的现象或者说尝试,我们想去确定禁止不安全的加密套件会对今天的两个高危漏洞有什么影响。


CVE-2016-0800


CVE-2016-0703


0800漏洞官方已经描述了如果是cipher none的话,能保证是不受影响的,或者说这是一个缓解措施。


但是0703就不一样了,我们花了几个小时尝试去证明如果cipher none的话确实也是不受影响的。


0703过程大略如下:


client:


send hello msg ( 包括 ciphers,和一个随机数 cr )


server:


send hello msg ( 包括 ciphers,和一个随机数 sr )


client:


send masterkey msg ( 指定一个 cipher,且包含 masterkey 的一部分明文 mkc 和一部分密文 mks,mkc长度可为0 )


server:


send verify msg


client:


send finish msg


server:


send finish msg


这个过程由于client可以指定不安全的算法(RC4-MD5 SSLv2 Kx=RSA(512) Au=RSA Enc=RC4(40) Mac=MD5 export)导致密文部分只有40bit


client 根据 cr, mk = mkc||mks, 和收到的 verify msg,可计算出 server key


server_key = MD5(mk||”0″||cr||sr)


所以我们认为攻击的条件依然需要类似RC4_128_WITH_MD5 的套件。


a、关键是 client 指定了 export cipher,导致 mks 只有5个字节


b、不止 RC4_128_WITH_MD5 一个 export,默认情况,openssl 编译出来共有两个 export cipher:


EXP-RC2-CBC-MD5 SSLv2 Kx=RSA(512) Au=RSA Enc=RC2(40) Mac=MD5 export


EXP-RC4-MD5 SSLv2 Kx=RSA(512) Au=RSA Enc=RC4(40) Mac=MD5 export


c、计算出的 server_key 是 session key,双方可以互相计算


server_key = MD5(mk||”0″||cr||sr)


client_key = MD5(mk||”1″||cr||sr)


(“||”见 RSA PKCS1#v1.5)


d、server 回应的 verify msg 中大有玄机,是最终利用的关键,与sslv2标准有关,且听下回分解吧。


3. 结尾


虽然能表明“360信息安全部”的安全实践能有效抵挡 CVE-2016-0703 的攻击,但在此依然希望大家按照官方的建议去升级对应的补丁。gl!


以下是我们的基本修复建议:


———————————————————————————————————————


漏洞编号: CVE-2016-0703


漏洞说明:


使用OpenSSL并支持SSLv2协议的服务器可接受指向长度非零非导出密钥组件的SSLv2连接握手,攻击者可利用这个缺陷解密已经建立的加密会话。


漏洞等级: 高


漏洞编号: CVE-2016-0800


漏洞说明:


SSLv2协议中存在一个填充内容缺陷,攻击者可以利用这个缺陷解密使用新版SSL/TLS协议会话中由RSA算法加密的内容。通过这种利用方式,可造成DROWN攻击(Decrypting RSA using Obsolete and Weakened eNcryption)


漏洞等级: 高


漏洞详情: https://www.openssl.org/news/secadv/20160301.txt


受影响的服务版本:


Apache: 非2.4.x版本


Nginx: 0.7.64、0.8.18及更早版本


Postfix: 早于2.9.14、2.10.8、2.11.6、3.0.2的版本 (在2015.07.20之前发布)


Openssl: 1.0.2a、1.0.1m、1.0.0r、0.9.8zf及更早版本


检测方式:


OpenSSL版本检测:


openssl version


若版本低于修复版本请更新openssl


针对web server:


openssl s_client -connect 待测域名或IP:443 -ssl2


针对SMTP server:


openssl s_client -connect 待测域名或IP:25 -starttls smtp -ssl2


如果出现如下错误信息,则SSLv2已禁用:


419:error:1407F0E5:SSL routines:SSL2_WRITE:ssl handshake failure:s2_pkt.c:428:


修复步骤:


(1). 升级OpenSSL软件包


CentOS、Redhat 可以通过以下命令来升级


#yum clean


#yum update openssl


对应的RPM包:


CentOS 5: openssl-0.9.8e-39.el5_11、 openssl-devel-0.9.8e-39.el5_11、 openssl-perl-0.9.8e-39.el5_11


CentOS 6: openssl-1.0.1e-42.el6_7.4、 openssl-devel-1.0.1e-42.el6_7.4、 openssl-perl-1.0.1e-42.el6_7.4、 openssl-static-1.0.1e-42.el6_7.4


CentOS 7: openssl-1.0.1e-51.el7_2.4、 openssl-devel-1.0.1e-51.el7_2.4、 openssl-libs-1.0.1e-51.el7_2.4、 openssl-perl-1.0.1e-51.el7_2.4、 openssl-static-1.0.1e-51.el7_2.4


(2). ubuntu 版本可以通过以下命令来升级


#apt-get upgrade openssl


2. 禁用 Apache、Nginx、Postfix 中的SSLv2


在Apache 的 SSL 配置文件中禁用SSLv2


SSLProtocol all -SSLv2


重启apache服务


在 Nginx 的 SSL 配置文件中设置只允许使用 TLS 协议:


ssl_protocols TLSv1 TLSv1.1 TLSv1.2;


重启nginx服务


在Postfix配置中禁用SSLv2


# Minimal recommended settings. Whenever the built-in defaults are


# sufficient, let the built-in defaults stand by deleting any explicit


# overrides. The default mandatory TLS protocols have never included


# SSLv2, check to make sure you have not inadvertently enabled it.


smtpd_tls_protocols = !SSLv2, !SSLv3


smtpd_tls_mandatory_protocols = !SSLv2, !SSLv3


tlsproxy_tls_protocols = $smtpd_tls_protocols


tlsproxy_tls_mandatory_protocols = $smtpd_tls_mandatory_protocols


smtp_tls_protocols = !SSLv2, !SSLv3


smtp_tls_mandatory_protocols = !SSLv2, !SSLv3


lmtp_tls_protocols = !SSLv2, !SSLv3


lmtp_tls_mandatory_protocols = !SSLv2, !SSLv3


smtpd_tls_ciphers = medium


smtp_tls_ciphers = medium


# Other best practices


# Strongly recommended:


# http://www.postfix.org/FORWARD_SECRECY_README.html#server_fs


smtpd_tls_dh1024_param_file=${config_directory}/dh2048.pem


smtpd_tls_eecdh_grade = strong


# Suggested, not strictly needed:


smtpd_tls_exclude_ciphers =


EXPORT, LOW, MD5, SEED, IDEA, RC2


smtp_tls_exclude_ciphers =


EXPORT, LOW, MD5, aDSS, kECDHe, kECDHr, kDHd, kDHr, SEED, IDEA, RC2


相关新闻

大家都在学

课程详情

经典网安事件

课程详情

网络安全事件

课程详情

网络安全漫谈