近日,OpenSSL针对22日爆出的 CVE-2016-6304漏洞 发布了补丁,补丁又带来了 新的漏洞CVE-2016-6309 和CVE-2016-7052 ,官方 随即再次发布公告 给出更新补丁,1.1.0a版本升级到1.1.0b,正在使用1.0.2i版本升级到1.0.2j,绿盟科技也再次给出新漏洞的分析及防护方案……
OpenSSL最新漏洞信息
CVE-2016-6309
提交时间:2016年9月23日
漏洞描述:当系统收到超过大约16K大小的消息时,准备接受该消息的缓冲区会在其他地方重新分配。这时会产生一个指向原缓冲区的悬空指针,允许将新数据写入这片已经释放过的区域。这会导致潜在的任意代码执行问题。
严重程度:严重
CVE-2016-7052
提交时间:2016年9月22日
漏洞描述:在1.0.2i版本更新中,遗漏了对CRL的完整性检查,允许远程攻击者利用一个空指针解引用导致程序崩溃,造成拒绝服务。
严重程度:中
OpenSSL最新漏洞影响版本
影响的版本
- OpenSSL Project OpenSSL 1.1.0a
- OpenSSL Project OpenSSL 1.0.2i
不受影响的版本
- OpenSSL Project OpenSSL 1.1.0b
- OpenSSL Project OpenSSL 1.0.2j
OpenSSL最新漏洞详细分析
CVE-2016-6309分析
9月22日发布的1.1.0a版本更新中,针对CVE-2016-6307漏洞的修补代码引入了一个新漏洞——CVE-2016-6309。这是一个UAF漏洞,其成因是接收消息的缓冲区大小初始化为16KB,当接收到的消息大于16KB时,缓冲区将会重新分配,引起缓冲区位置的变化,原来缓冲区地址上的数据会被释放,攻击者可以重新写入数据到该地址,最终导致任意代码执行。
CVE-2016-6307的补丁代码为:
BUF_MEM_grow_clean()函数在释放缓冲区s->init_buf时,会产生一个悬空指针,可以允许攻击者对这片释放后的内存区域重新利用。CVE-2016-6309的补丁代码如下图所示:
grow_init_buf()是一个新增的函数,其实现如下:
CVE-2016-7052漏洞分析
该漏洞的成因是空指针异常,受影响的版本是1.0.2i。通过补丁前后两个版本代码的对比,发现一共做了两处修复。
第一处patch信息为:
从上图可以看到,新版本的代码将if (dstate->ac_data == NULL)条件修复为if (dstate->mac_data == NULL),当dstate->mac_data为空时,内存申请失败;而 patch前未对dstate->mac_data进行判断,这样有可能导致一个空指针引用。
第二处patch信息为:
首先,patch后的代码增加了对crl_score == 0判断,当其为空时,就可以跳过本次for循环,不会执行后面的证书更新了,避免了向crls列表中更新空证书。其次,增加了对best_crl != NULL的判断。在未patch前,当best_crl等于NULL时,后续代码的执行会出现问题:
调用ASN1_TIME_diff函数,更新crls列表,使得列表中包含了空证书,攻击者利用一个空指针解引用可以导致程序崩溃,造成拒绝服务。而patch后增加了对best_crl是否为空的判断,避免了该问题的发生。
OpenSSL最新漏洞修复建议
官方补丁:
- 官方已经发布针对这两个漏洞的版本更新,建议正在使用1.1.0a版本的用户尽快升级到1.1.0b版本,正在使用1.0.2i版本的用户尽快升级到1.0.2j版本,
- 新版本下载链接如下: https://www.openssl.org/source/
产品服务:在授权下,使用绿盟科技的远程评估系统RSAS进行漏洞检测。
工程服务:
- 短期服务:绿盟科技工程师现场处理。确保第一时间消除网络内相关风险点,控制事件影响范围,提供事件分析报告。
- 中期服务:提供 3-6个月的风险监控与巡检服务。根除风险,确保事件不复发。
- 长期服务:基于行业业务风险解决方案(威胁情报+攻击溯源+专业安全服务)。
相关文章请见
乌龙了,OpenSSL 9月22日的补丁搞出两个新漏洞 绿盟科技再次发布预警通道
绿盟科技发出OpenSSL高危威胁预警通告 将实施7*24小时内部跟踪24小时技术分析、产品升级及防护方案