当前位置:首页 > 休闲

4 什么是 心脏流血 漏洞

4 什么是什心心脏流血漏洞

2014年4月7日,安全研究员Neel Mehta在检查OpenSSL代码时,脏流发现了一个存在两年的血漏内存泄漏漏洞。这个漏洞被命名为Heartbleed——心脏流血。什心名字很形象:它攻击的脏流是OpenSSL的TLS心跳扩展(Heartbeat),而攻击者能像抽血一样,血漏从服务器内存中不断“抽”出敏感数据。什心

要理解这个漏洞,脏流得先知道心跳扩展是血漏干嘛的。TLS连接建立后,什心双方需要确认对方还活着。脏流心跳包就是血漏用来干这个的——客户端发一个“你还活着吗?”的请求,附带一段数据,什心服务器收到后要把这段数据原样返回。脏流问题出在OpenSSL的血漏实现上:服务器返回数据时,只根据客户端声明的数据长度来读取内存,却没有验证这个长度是否与实际发送的数据匹配。

攻击者可以发送一个只有1字节数据、但声称长度是65535字节的心跳包。服务器会老老实实地从内存中读取65535字节并返回。多出来的那65534字节是什么?是服务器内存中紧挨着这段数据的其他内容——可能是其他用户的会话密钥、密码明文、甚至服务器的私钥。这就像你去银行柜台取钱,填单子说取10万,柜员不核对你的存款余额,直接从金库里抓了10万给你。

最可怕的是,这个漏洞不留下任何痕迹。攻击者可以反复发送这种伪造的心跳包,每次都能拿到不同位置的内存数据。而且整个过程看起来就像正常的TLS心跳通信,防火墙和入侵检测系统根本不会报警。有的攻击者甚至能拼凑出完整的服务器私钥——有了私钥,就能冒充服务器,解密所有历史通信记录。

心脏流血的影响范围有多大?当时互联网上有超过50万个网站使用OpenSSL,包括雅虎、谷歌、脸书、亚马逊这些巨头。更麻烦的是,OpenSSL还被用在很多非浏览器场景里——VPN设备、邮件服务器、路由器固件、甚至一些工业控制系统。有些设备厂商直到今天都没发布补丁,这意味着某些老设备上,这个洞可能还敞着。

我印象最深的是一个细节:漏洞公布后,加拿大税务局有900个纳税人的社保号被窃取,但官方花了将近两个月才确认。因为攻击者拿到的数据是碎片化的,他们需要从大量内存垃圾中筛选有用的信息。这就像有人在你家门外挖了一条地道,每天偷走一点家具,你却要过很久才发现少了东西。

心脏流血给安全行业上了残酷的一课:最基础的加密库,可能因为一个没检查长度的小失误,就让整个加密体系形同虚设。而修复这个漏洞,只需要加一个简单的长度校验——两行代码的事。但这两行代码的缺失,让全球互联网裸奔了两年。

更让人后背发凉的是,这类问题不止存在于OpenSSL。心脏流血之后,安全社区开始系统性地审计其他开源加密库,结果又发现了一堆类似的问题。这说明什么?说明我们每天依赖的加密基础设施,其实比想象中脆弱得多。它可能建立在一个晚上没睡好、写代码时漏了个判断条件的程序员身上。

现在OpenSSL已经修复了这个漏洞,但心脏流血留下的阴影还在。每次有人问我“用HTTPS就安全了吧”,我都会想起这个漏洞——加密协议本身没错,但实现它的代码,终究是人类写的。而人类写的代码,总会流血。

分享到: