Heartbleed Bug:OpenSSL被曝严重安全漏洞

MITRE公布了OpenSSL的严重安全漏洞,编号 CVE-2014-0160,取名 Heartbleed(因为和heartbeat扩展相关)。由于该漏洞,被SSL/TLS加密传输的信息可以被窃取。

乌云上有关于该漏洞分析的翻译文章,或者查看heartbleed.com.

Test your server for Heartbleed:filippo.io/Heartbleed.

OpenSSL是互联网上最流行的开源密码库和TLS实现,不仅是诸多Linux和BSD版本操作系统的默认安全通信机制,也是Apache和nginx等Web服务器的加密引擎。这次发现的漏洞是2011年12月引入OpenSSL库中的,2012年3月14日1.0.1正式版发布后,含有漏洞版本的库被广泛使用,因此影响范围极大。如果有攻击者在此时间之内利用这一漏洞侦听获取了许多密钥等信息,可以用来发起进一步的其他攻击。所以,各设备和服务厂商最安全的做法,是假设自己的服务器、设备与服务已经被攻击,采取相应的措施如更新密钥,并通知用户。

这个漏洞是由安全公司Codenomicon的研究人员和Google安全小组的Neel Mehta相互独立地发现的。漏洞出在OpenSSL对TLS的心跳扩展(RFC6520)的实现代码中,由于漏了一处边界检查,而可能在每次心跳中暴露客户端与服务器通信中的64K内存,这并不是设计错误。

Hacker News网友drv在阅读了漏洞代码后指出,这是一个低级错误。他解释说:



TLS心跳由一个请求包组成,其中包括有效载荷(payload),通信的另一方将读取这个包并发送一个响应,其中包含同样的载荷。在处理心跳请求的代码中,载荷大小是从攻击者可能控制的包中读取的:



n2s(p, payload);

pl = p;

这里p是指向请求包的指针,payload是载荷的期望长度(16位短整数,也就是每次请求64K)。pl指针指向实际的载荷。



然后响应包是这样构造的:



/* Enter response type, length and copy payload */

*bp++ = TLS1_HB_RESPONSE;

s2n(payload, bp);

memcpy(bp, pl, payload);

载荷长度保存在目标包里,然后从源包pl将载荷复制到目标包bp。



bug出在载荷长度没有根据请求包的大小进行检查。因此,memcpy()发送任意载荷长度(最大64K)加上一个小载荷,就能读取请求存储位置之外的任意数据。



drv评述说:



很难相信OpenSSL的代码居然没有对字节流的处理做抽象,如果包用(指针,长度)对来表示,用简单的封装函数复制,就能避免这个漏洞。用C语言的时候,写这种问题代码太容易了,但API设计仔细一点,就会大大增加犯错的难度。

 

你可能感兴趣的:(OpenSSL)