当前位置:首页 > 综合

心脏出血漏洞

2014年4月7日晚上,心脏我盯着一个叫Heartbleed的出血漏洞公告,第一反应是漏洞:这东西要是被利用了,整个互联网的心脏底裤都得被扒下来。第二天一早,出血安全圈炸了锅——OpenSSL这个几乎无处不在的漏洞加密库,居然在心跳扩展(Heartbeat Extension)里留了个天大的心脏口子。攻击者只要发一个畸形的出血“心跳”请求,就能让服务器把内存里最多64KB的漏洞数据吐回来。密码、心脏私钥、出血会话凭证,漏洞全在里面。心脏

OpenSSL的出血心跳机制本来很简单:客户端说“我发了一段数据,你原样回给我”,漏洞服务器照做。问题出在它不检查数据长度。你声称发了1字节,实际却告诉服务器“那1字节后面还有65535字节”,服务器也不核实,直接从内存里读65535字节返回。多出来的部分?就是内存里紧挨着那块数据的其他内容。可能是上一个用户的登录密码,可能是服务器的私钥,也可能是任何不该被外人看到的东西。

我试过用Python写个最小化的利用脚本,几行代码就能从一台存在漏洞的服务器上捞回一堆碎片。最吓人的是,整个过程不需要认证,不需要复杂条件,一个TCP连接就够了。当时全球大约有50万台服务器受影响的说法在圈内流传,实际数字可能更高。CloudFlare后来做过统计,说他们平台上大约有0.2%的请求在漏洞公开后几天内是攻击流量。别小看这个比例——CloudFlare每天处理的请求量是天文数字。

这个漏洞的发现过程也挺有意思。它其实是芬兰安全公司Codenomicon和Google Security团队几乎同时独立发现的。Codenomicon的人是在测试一个叫“心跳”的协议扩展时,发现服务器回传的数据比预期多得多。Google的Neel Mehta则是在分析OpenSSL代码时注意到了缺失的边界检查。两边一碰,确认这是个严重问题,然后协调披露。4月7日,他们同时发布了公告和修复补丁。

为什么影响这么大?因为OpenSSL太底层了。你访问的HTTPS网站,背后大概率是Apache或Nginx,它们都依赖OpenSSL处理加密。邮件服务器、VPN、即时通讯工具,全在用它。更麻烦的是,很多嵌入式设备和老旧的Linux发行版里的OpenSSL版本根本没打补丁,有些甚至到今天都没修。我去年扫过一批IP段,仍然能碰到零星几个还在往外吐内存的机器。

修复其实不复杂。OpenSSL在1.0.1g版本里加了一个长度检查:如果客户端声称的心跳数据长度和实际发送的不一致,直接丢弃请求。就这么简单。但问题在于,漏洞从2012年3月OpenSSL 1.0.1发布时就存在了,整整两年没人发现。这两年,如果有人恶意利用,根本不会留下明显痕迹——服务器日志里只会记录一个普通的心跳请求,返回的数据大小也没异常。

有个细节值得琢磨。漏洞公开后,加拿大税务局紧急关闭了在线报税系统,因为他们的服务器用的是受影响的OpenSSL版本。那会儿正好是报税季,一堆人骂娘。还有个更讽刺的事:某安全公司为了演示漏洞危害,架了一台蜜罐服务器,结果几天内就被各种扫描器盯上,捞回来的数据里居然有别的安全研究人员在测试时不小心泄露的私钥。

现在回头看,Heartbleed算是给整个行业上了一课。它暴露的不只是代码缺陷,更是开源基础设施的维护困境。OpenSSL当时只有两个全职开发者,却要维护支撑半个互联网的加密库。漏洞公开后,Linux基金会搞了个核心基础设施计划,给这类项目筹钱找人。但说实话,直到今天,很多关键开源项目的维护状况依然堪忧。

我自己养成了一个习惯:每次连公共Wi-Fi,先想想那台路由器背后的OpenSSL是不是还带着Heartbleed。虽然大多数现代系统都修了,但互联网的角落里,总有些东西在漏。

分享到: