OpenSSL补丁引入新漏洞技术分析与防护方案

近日,OpenSSL官方发布了版本更新,修复了多个OpenSSL漏洞,这次更新所修复的漏洞中,有两个危害等级较高的为CVE-2016-6304和CVE-2016-6305。目前绿盟已发布相关检测和防护方案。

2016年9月22日,OpenSSL官方发布了三个分支产品的版本更新,修复了多个漏洞。9月22日更新后的版本号分别是:1.1.0a,1.0.2i和1.0.1u。其中两个版本的更新又引入了新的漏洞:1.1.0a版本引入了编号为CVE-2016-6309的漏洞,1.0.2i的更新引入了编号为CVE-2016-7052的漏洞。

1、CVE-2016-6309

提交时间:2016年9月23日

漏洞描述:当系统收到超过大约16K大小的消息时,准备接受该消息的缓冲区会在其他地方重新分配。这时会产生一个指向原缓冲区的悬空指针,允许将新数据写入这片已经释放过的区域。这会导致潜在的任意代码执行问题。

严重程度:严重

2、CVE-2016-7052

提交时间:2016年9月22日

漏洞描述:在1.0.2i版本更新中,遗漏了对CRL的完整性检查,允许远程攻击者利用一个空指针解引用导致程序崩溃,造成拒绝服务。

严重程度:中

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

基于NTI的OpenSSL漏洞全球影响面分析

据绿盟科技威胁情报中心(NTI)统计到的数据显示,全球受影响资产超过2000万。全球OpenSSL主机分布如下:

nti1

G20成员国受影响暴露面如下所示,受影响面最大的分别是美国、中国和德国。

nti2

全球受影响暴露面TOP20如下所示

nti3

自2014年4月心脏滴血漏洞爆发以来,绿盟科技对OpenSSL的CVE漏洞进行密切的监控,据绿盟科技威胁情报中心(NTI)统计到的数据显示,2年来OpenSSL漏洞变化不大总体持平,总计高危漏洞13个,其中今年9月份3个高危漏洞。绿盟科技漏洞库迄今为止收录了82个重要漏洞。

nti4

影响的版本

  • OpenSSL Project OpenSSL 1.1.0a
  • OpenSSL Project OpenSSL 1.0.2i

不受影响的版本

  • OpenSSL Project OpenSSL 1.1.0b
  • OpenSSL Project OpenSSL 1.0.2j

漏洞分析

  1. CVE-2016-6309

9月22日发布的1.1.0a版本更新中,针对CVE-2016-6307漏洞的修补代码引入了一个新漏洞——CVE-2016-6309。这是一个UAF漏洞,其成因是接收消息的缓冲区大小初始化为16KB,当接收到的消息大于16KB时,缓冲区将会重新分配,引起缓冲区位置的变化,原来缓冲区地址上的数据会被释放,攻击者可以重新写入数据到该地址,最终导致任意代码执行。

CVE-2016-6307的补丁代码为:

openssl%e8%a1%a5%e4%b8%811

BUF_MEM_grow_clean()函数在释放缓冲区s->init_buf时,会产生一个悬空指针,可以允许攻击者对这片释放后的内存区域重新利用。CVE-2016-6309的补丁代码如下图所示:

openssl%e8%a1%a5%e4%b8%812

grow_init_buf()是一个新增的函数,其实现如下:

openssl%e8%a1%a5%e4%b8%813

该函数封装了原来的BUF_MEM_grow_clean()函数,此外,它通过“size_t msg_offset=(char *)s->init_msg – s->init_buf->data”和“s->init_msg=s->init_buf->data + msg_offset”这两条语句,保证在接下来的缓冲区重新分配过程中,缓冲区的起始地址s->init_msg不变,这样,就变成了在原来缓冲区位置上的扩充,从而规避了内存释放后被恶意重用的机会。

  1. CVE-2016-7052

该漏洞的成因是空指针异常,受影响的版本是1.0.2i。通过补丁前后两个版本代码的对比,发现一共做了两处修复。

第一处patch信息为:

openssl%e8%a1%a5%e4%b8%814

从上图可以看到,新版本的代码将if (dstate->ac_data == NULL)条件修复为if (dstate->mac_data == NULL),当dstate->mac_data为空时,内存申请失败;而 patch前未对dstate->mac_data进行判断,这样有可能导致一个空指针引用。

第二处patch信息为:

openssl%e8%a1%a5%e4%b8%815

首先,patch后的代码增加了对crl_score == 0判断,当其为空时,就可以跳过本次for循环,不会执行后面的证书更新了,避免了向crls列表中更新空证书。其次,增加了对best_crl != NULL的判断。在未patch前,当best_crl等于NULL时,后续代码的执行会出现问题:调用ASN1_TIME_diff函数,更新crls列表,使得列表中包含了空证书,攻击者利用一个空指针解引用可以导致程序崩溃,造成拒绝服务。而patch后增加了对best_crl是否为空的判断,避免了该问题的发生。

修复建议

  • 官方已经发布针对这两个漏洞的版本更新,建议正在使用1.1.0a版本的用户尽快升级到1.1.0b版本,正在使用1.0.2i版本的用户尽快升级到1.0.2j版本,新版本下载链接如下:

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

  • 在授权下,使用绿盟科技的远程评估系统RSAS进行检测。
  • 短期服务:绿盟科技工程师现场处理。确保第一时间消除网络内相关风险点,控制事件影响范围,提供事件分析报告。
  • 中期服务:提供 3-6个月的风险监控与巡检服务。根除风险,确保事件不复发。
  • 长期服务:基于行业业务风险解决方案(威胁情报+攻击溯源+专业安全服务)。

什么是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