漏洞编号
CVE-2017-3737
危害程度
中危(Moderate)
漏洞简介
在”error state”状态下立即调用SSL_read() 或 SSL_write() 函数,由于“error state”机制的bug,导致该机制并不能按照原本的意图进行下去(即执行握手失败逻辑)。使得原本需要通过OpenSSL解密/加密的数据并不能在SSL/TLS层得到应有的加解密处理。
详情
OpenSSL从1.0.2b开始,引入了一个“error state”机制。即,当握手过程中出现了”fatal error”,OpenSSL会进入”error state”状态,若此时试图继续进行握手,根据“error state”机制,OpenSSL会立即fail(执行握手失败逻辑)。对于那些明确的用来进行握手的函数SSL_do_handshake(), SSL_accept() 和 SSL_connect() ,这种机制都是有效的。
但是,如果在”error state”状态下立即调用SSL_read() 或 SSL_write() 函数,由于该处理机制的bug,导致该机制并不能按照原本的意图进行下去(即执行握手失败逻辑)。
在这种握手失败场景中,”fatal error”会被返回至初始调用它的函数中。若此时应用程序对同一个SSL对象再接着调用SSL_read()/SSL_write(),OpenSSL会succeed(执行握手成功逻辑),然后会导致原本需要通过OpenSSL解密/加密的数据并不能在SSL/TLS层得到应有的加密/解密处理。
漏洞触发场景
调用OpenSSL库的应用程序中有一个bug。这个bug就是,在握手过程中已经出现了”fatal error”, 但由于bug会导致调用SSL_read()/SSL_write()。
该漏洞在2017年11月10日由David Benjamin(Google)提交给OpenSSL团队。由OpenSSL的开发团队修复。
影响范围
OpenSSL 1.0.2b至1.0.2n以前所有版本
并不影响OpenSSL 1.1.0版本
建议
使用OpenSSL 1.0.2的用户赶紧升级至1.0.2n
附录
OpenSSL12月7日安全建议中发布了两个漏洞,其中一个是上述的CVE-2017-3737。
第二个漏洞(低危)
rsaz_1024_mul_avx2 overflow bug on x86_64 (CVE-2017-3738)
也建议使用OpenSSL 1.0.2的用户升级至1.0.2n