OpenSSL多个漏洞技术分析与防护方案

2016年9月22日,OpenSSL官方发布了版本更新,修复了多个漏洞,这次更新所修复的漏洞中,有两个危害等级较高的为CVE-2016-6304和CVE-2016-6305。绿盟科技对此漏洞进行了技术分析并提出了防护方案。

 

影响的版本

  • OpenSSL Project OpenSSL < 1.1.0a
  • OpenSSL Project OpenSSL < 1.0.2i
  • OpenSSL Project OpenSSL < 1.0.1u

不受影响的版本

  • OpenSSL Project OpenSSL 1.1.0a
  • OpenSSL Project OpenSSL 1.0.2i
  • OpenSSL Project OpenSSL 1.0.1u

漏洞分析

这次更新所修复的漏洞中,有两个危害等级较高的为CVE-2016-6304和CVE-2016-6305。

  1. CVE-2016-6304

该漏洞的成因是,客户端向服务器持续发送超大的OCSP状态请求扩展,在此过程中,利用TLS扩展 “TLSEXT_TYPE_status_request”填充OCSP ids内存,由于攻击者不断请求重商,从而耗尽服务器的内存导致拒绝服务。

分析官方公布的修复代码,发现所做的修改主要是添加了对上一次握手过程的PACKET_remaining(&responder_id_list)的判断:如果大于0,则将所有OCSP_RESPIDs置空,并保存SSL_AD_INTERNAL_ERROR的状态;否则直接将所有OCSP_RESPIDs置空。代码修复情况如下图所示:

openssl1

这样就避免了OCSP ids内存不断增加造成的拒绝服务。

  1.  CVE-2016-6305

该漏洞的成因是,攻击者可以通过发送一个空记录,从而在调用SSL_peek()函数时引起拒绝服务。含有漏洞的代码如下:

if (!peek) {
    SSL3_RECORD_sub_length(rr, n);                        
    SSL3_RECORD_add_off(rr, n);

从上面的代码可以看到,如果peek为空,!peek则为真,然后进入代码段中,直接进行sub和add等运算,这样就会进入到一个死循环当中,程序不能继续执行。

漏洞修复之后的代码如下图所示:
openssl2

代码会对读取的记录rr进行长度计算,如果为0,则重新读取下一个记录,从而保证程序顺利进行。

修复建议

  • 官方已经发布版本更新,建议尽快升级到最新版,下载链接如下:

https://www.openssl.org/source/

  • 如果无法升级到最新版本,为了在一定程度上缓解该威胁,则需要重新编译OpenSSL源代码,在重新编译的时候,启用“no-ocsp”编译时选项。
  • 使用绿盟科技的防护类产品WAF进行防护。
  • 使用绿盟科技的远程评估系统RSAS进行安全评估。
  • 短期服务:绿盟科技工程师现场处理。确保第一时间消除网络内相关风险点,控制事件影响范围,提供事件分析报告。
  • 中期服务:提供 3-6个月的风险监控与巡检服务。根除风险,确保事件不复发。
  • 长期服务:基于行业业务风险解决方案(威胁情报+攻击溯源+专业安全服务)。

汇总

2016年9月22日,OpenSSL官方发布了版本更新,修复了多个漏洞:

1、CVE-2016-6304

提交时间:2016年8月29日

漏洞描述:OpenSSL服务器在默认配置下,一个恶意客户端可以向服务器持续发送超大的OCSP状态请求扩展,从而耗尽服务器的内存导致拒绝服务。

严重程度:高

2、CVE-2016-6305

提交时间:2016年9月10日

漏洞描述:攻击者可以通过发送一个空记录,从而在调用SSL_peek()函数时引起拒绝服务。

严重程度:中

3、CVE-2016-2183

提交时间:2016年8月16日

漏洞描述:该漏洞涉及SWEET32攻击,一种针对64位分组密码算法的生日攻击。

严重程度:低

4、CVE-2016-6303

提交时间:2016年8月11日

漏洞描述:该漏洞是存在于函数MDC2_Update()中的一个整数溢出,导致内存破坏,进而允许拒绝服务攻击。

严重程度:低

5、CVE-2016-6302

提交时间:2016年8月19日

漏洞描述:位于ssl/t1_lib.c中的函数tls_decrypt_ticket(),在确认ticket的长度时没有考虑HMAC的大小,导致内存越界读取,进而引起拒绝服务。

严重程度:低

6、CVE-2016-2182

提交时间:2016年8月2日

漏洞描述:位于crypto/bn/bn_print.c的函数BN_bn2dec()没有检验BN_div_word()函数的返回值,允许内存越界写入,从而引起拒绝服务。

严重程度:低

7、CVE-2016-2180

提交时间:2016年7月21日

漏洞描述:位于crypto/ts/ts_lib.c中的函数TS_OBJ_print_bio()存在越界写入问题,允许拒绝服务。

严重程度:低

8、CVE-2016-2177

提交时间:2016年5月4日

漏洞描述:在计算堆缓冲区的边界时出错,允许攻击者发起拒绝服务攻击。

严重程度:低

9、CVE-2016-2178

提交时间:2016年5月23日

漏洞描述:位于crypto/dsa/dsa_ossl.c中的函数dsa_sign_setup(),没有正确处理constant-time,允许攻击者通过边信道攻击获得DSA的私钥。

严重程度:低

10、CVE-2016-2179

提交时间:2016年6月22日

漏洞描述:在DTLS的实现中,没有正确处理未按序到达的握手消息缓存,允许攻击者同时维护多个精心构造的DTLS会话,导致拒绝服务。

严重程度:低

11、CVE-2016-2181

提交时间:2015年11月21日

漏洞描述:DTLS实现中的抗重放攻击部分存在缺陷,允许攻击者发起拒绝服务攻击。

严重程度:低

12、CVE-2016-6306

提交时间:2016年8月22日

漏洞描述:在OpenSSL的1.0.2及更早版本中,缺少对一些消息长度的校验,导致内存越界读取,在理论上允许拒绝服务攻击。

严重程度:低

13、CVE-2016-6307

提交时间:2016年9月18日

漏洞描述:tls_get_message_header()函数存在检查缺陷,导致攻击者可以通过精心构造的数据包,使内存过度分配,进而借此大量消耗服务器的内存导致拒绝服务。

严重程度:低

14、CVE-2016-6308

提交时间:2016年9月18日

漏洞描述:dtls1_preprocess_fragment()存在检查缺陷,导致服务器的内存可以过度分配,进而以前拒绝服务攻击。

严重程度:低

官方公告地址如下:https://www.openssl.org/news/secadv/20160922.txt

什么是OpenSSL?

SSL是Secure Sockets Layer(安全套接层协议)的缩写,可以在Internet上提供秘密性传输,能使用户/服务器之间的通讯数据不被攻击者窃听,并且始终对服务器进行认证和有条件的对用户进行认证。SSL协议要求建立在可靠的传输层协议(TCP)之上,实现对应用层数据的加密传输与完整性保护。

OpenSSL是一个强大的安全套接字层密码开源库,囊括主要的密码算法、常用的密钥和证书封装管理功能及SSL协议,并提供丰富的应用程序供测试或其它目的使用。

大多数通过SSL/TLS协议加密的网站都使用了OpenSSL的开源软件包。当OpenSSL被爆出安全漏洞,影响将会涉及到所有使用OpenSSL开源包的应用。

 

本安全公告仅用来描述可能存在的安全问题,绿盟科技不为此安全公告提供任何保证或承诺。由于传播、利用此安全公告所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,绿盟科技以及安全公告作者不为此承担任何责任。绿盟科技拥有对此安全公告的修改和解释权。如欲转载或传播此安全公告,必须保证此安全公告的完整性,包括版权声明等全部内容。未经绿盟科技允许,不得任意修改或者增减此安全公告内容,不得以任何方式将其用于商业目的。

关于绿盟科技

北京神州绿盟信息安全科技股份有限公司(简称绿盟科技)成立于2000年4月,总部位于北京。在国内外设有30多个分支机构,为政府、运营商、金融、能源、互联网以及教育、医疗等行业用户,提供具有核心竞争力的安全产品及解决方案,帮助客户实现业务的安全顺畅运行。

基于多年的安全攻防研究,绿盟科技在网络及终端安全、互联网基础安全、合规及安全管理等领域,为客户提供入侵检测/防护、抗拒绝服务攻击、远程安全评估以及Web安全防护等产品以及专业安全服务。

北京神州绿盟信息安全科技股份有限公司于2014年1月29日起在深圳证券交易所创业板上市交易,股票简称:绿盟科技,股票代码:300369。

如果您需要了解更多内容,可以
加入QQ群:486207500、570982169
直接询问:010-68438880-8669

Spread the word. Share this post!

Meet The Author

Leave Comment