漏洞概述:
OpenSSL OCSP 状态请求扩展存在严重漏洞,该漏洞令恶意客户端能耗尽服务器内存。利用该漏洞,能使默认配置的服务器在每次协议重商时分配一段 OCSP ids 内存, 不断重复协商可令服务器内存无限消耗,即使服务器并未配置 OCSP。理论上,一个 OCSP id 最多 65,535 字节,攻击者可以不断重商令服务器每次内存消耗近 64K。但从实现来说,在 OpenSSL 1.0.2 版本中对 ClientHello 长度做了 16,384 字节的限制,因此每次重商只能令服务器内存消耗约 16K。但在最新的 1.1.0 版本中,对 ClientHello 长度的限制增加到 131,396 字节,那么对使用 1.1.0 版本的服务器,每次重商会令内存消耗近 64K。
严重程度:高
影响版本:
OpenSSL 0.9.8h through 0.9.8v
OpenSSL 1.0.1 through 1.0.1t
OpenSSL 1.0.2 through 1.0.1h
OpenSSL 1.1.0
不受影响:
OpenSSL 1.0.1u
OpenSSL 1.0.2i
OpenSSL 1.1.0a
默认配置的 OpenSSL server 是受影响的(包括:OpenSSL 0.9.8h through 0.9.8v、OpenSSL 1.0.1 through 1.0.1t、OpenSSL 1.0.2 through 1.0.1h、OpenSSL 1.1.0)。 Nginx 0.8.23 以前的版本会受此影响,Apache 2.0以前及 SSLInsecureRenegotiation 配置项为 on 是都会受此影响。
漏洞危害:
攻击者可通过不断重商,发送大量 OCSP 状态请求扩展,导致服务器内存无限增长,最终导致服务器拒绝服务。默认OpenSSL配置的服务器会受影响,即使其并不支持 OCSP,除非在编译时使用了“no-ocsp”编译选项。
漏洞详情:
- 漏洞成因:客户端向服务器持续发送超大的OCSP状态请求扩展,在此过程中,利用TLS扩展 “TLSEXT_TYPE_status_request”填充OCSP ids内存,由于攻击者不断请求重商,从而耗尽服务器的内存导致拒绝服务。
- 分析官方公布的修复代码,发现所做的修改主要是添加了对上一次握手过程的PACKET_remaining(&responder_id_list)的判断:如果大于0,则将所有OCSP_RESPIDs置空,并保存SSL_AD_INTERNAL_ERROR的状态;否则直接将所有OCSP_RESPIDs置空。这样就避免了OCSP ids内存不断增加造成的拒绝服务。
修复建议:
升级到最新版本,官方发布版本更新链接:
https://www.openssl.org/source/
各个供应商获得软件更新链接:
Debian:https://security-tracker.debian.org/tracker/CVE-2016-6304
Ubuntu:http://www.ubuntu.com/usn/usn-3087-1/
FreeBSD:https://www.freebsd.org/security/advisories/FreeBSD-SA-16:26.openssl.asc
Redhat/CentOS:https://access.redhat.com/security/cve/CVE-2016-6304
参考文章: