心脏滴血漏洞
2014年4月7日,心脏安全研究员Neel Mehta在OpenSSL的滴血代码里发现了一个极其愚蠢的漏洞。这个漏洞有个血腥的漏洞名字——Heartbleed,心脏滴血。心脏它让全球三分之二的滴血网站服务器,在长达两年的漏洞时间里,如同敞开大门任人参观。心脏 这个漏洞的滴血原理其实不复杂。OpenSSL实现了一个心跳扩展(Heartbeat),漏洞用来维持加密连接。心脏服务器收到一个心跳请求时,滴血会返回相同的漏洞数据。问题出在,心脏请求方可以声明自己发送了100个字节,滴血但实际只发了1个字节。漏洞服务器傻乎乎地相信了,然后从内存里取出100个字节回传。多出来的99个字节是什么?是服务器内存里的其他数据——可能是用户的密码、私钥、会话令牌,甚至其他用户的请求内容。 就像一个银行柜员,你说要取100块,递进去1块钱,他居然真的从金库里数出100块给你。而且他还不知道自己在给。 最讽刺的是,这个漏洞的名字叫“心脏滴血”,听起来像某种浪漫的病症,实际上却是互联网史上最严重的出血事件之一。雅虎、Imgur、OKCupid、Steam,几乎所有主流网站都中招了。网飞和亚马逊因为用了旧版OpenSSL,反而躲过一劫——这大概是“落后”偶尔也有好处。 我印象最深的是Cloudflare的工程师做的实验。他们专门搭建了一个测试环境,模拟心脏滴血攻击,然后从服务器内存里抓取数据。结果他们真的抓到了另一个用户的Cookie——一个真实的、正在使用的会话凭证。这意味着攻击者不需要任何密码,只要不断发送心跳请求,就能像抽签一样,从服务器内存里随机抽走别人的登录状态。 那段时间,安全圈的人都疯了。因为没法确定自己是否被攻击过——攻击不留下任何痕迹。你只能假设自己已经被偷了,然后疯狂改密码、吊销证书、更新软件。一个漏洞,让整个行业从“可能安全”变成了“必须假设不安全”。 更让人无语的是,这个漏洞的修复补丁只有一行代码——加一个长度检查。就这行检查,本该在2007年实现心跳功能时就应该写上去。写代码的人当时大概只是图省事,觉得“谁会故意谎报长度呢”。 这让我想到一个现实:安全的本质,不是防御多么高明的攻击,而是不犯多么低级的错误。OpenSSL是全球基础设施级的软件,却长期靠几个兼职维护者在支撑。心脏滴血不是技术难题,是工程管理问题,是“大家都以为别人会检查”的责任真空。 七年过去了,我偶尔还会想起那个柜员的比喻。银行系统现在学乖了,会认真数你递进来的钱。但谁知道下一个柜员会不会又犯类似的懒?
-
上一篇
-
下一篇