漏洞播报:OpenSSL “heartbleed” CVE-2014-016

  • A+
所属分类:Seay信息安全博客

显示不全请点击全屏阅读

测试脚本: http://pan.baidu.com/s/1hq41y9A 

OpenSSL官方网站4月7日发布公告,有研究人员发现OpenSSL 1.0.1和1.0.2-beta版本中存在安全漏洞(编号为CVE-2014-0160),可能暴露密钥和私密通信,应该尽快修补,方法是:

  • 升级到最新版本OpenSSL 1.0.1g
  • 无法立即升级的用户可以以-DOPENSSL_NO_HEARTBEATS开关重新编译OpenSSL
  • 1.0.2-beta版本的漏洞将在beta2版本修复

更老版本的OpenSSL(1.0.0和0.9.8等)反而不受影响。

这个漏洞是由安全公司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设计仔细一点,就会大大增加犯错的难度。

更多技术细节可以参考Heartbleed网站Hacker News上的讨论也极具价值。

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

原文:http://geek.csdn.net/news/detail/6710

Tags:

CVE漏洞, 漏洞播报,

如果您喜欢我的博客,欢迎点击图片定订阅到邮箱填写您的邮件地址,订阅我们的精彩内容: 也可以点击链接【订阅到鲜果】

如果我的想法或工具帮助到了你,也可微信扫下方二维码打赏本人一杯咖啡
漏洞播报:OpenSSL “heartbleed”  CVE-2014-016