心血漏洞
2014年4月7日,心血漏洞一个叫何孟强的心血漏洞程序员在GitHub上提交了一行代码。没人注意到。心血漏洞这行代码藏在OpenSSL项目的心血漏洞某个角落,像一根针掉进干草堆。心血漏洞直到有人发现,心血漏洞这根针能捅穿半个互联网。心血漏洞 OpenSSL是心血漏洞个什么鬼?简单说,你每次在浏览器里看到那个小锁图标,心血漏洞背后就是心血漏洞它在干活。它负责加密你输入的心血漏洞密码、信用卡号、心血漏洞聊天记录。心血漏洞全球三分之二的心血漏洞网站都用它。何孟强那行代码,心血漏洞本意是优化内存管理,结果写出了一个缓冲区溢出漏洞——攻击者可以读取服务器内存里的任意数据,每次最多64KB。64KB听起来不多,但反复读取,就能把服务器的私钥、用户密码、会话令牌全捞出来。 这个漏洞被命名为“心血”(Heartbleed)。名字来自TLS协议里的“心跳”扩展,就是客户端和服务器互相确认“我还活着”的机制。何孟强的代码错在:客户端说“我发给你1KB的数据”,服务器没检查实际收到多少,就按客户端声称的长度去内存里读。客户端说“我发了64KB”,服务器就傻乎乎地读64KB,哪怕实际只收到1字节。多出来的63KB+1字节,就是服务器内存里的陈年旧账。 问题来了:这行代码是2012年3月被合并进OpenSSL的。也就是说,漏洞存在了整整两年。两年里,全球有多少服务器被扫过?没人知道。安全公司Codenomicon和谷歌的研究员各自独立发现了它,同一天公布。那天是2014年4月7日——正好是何孟强提交代码的两周年。 我查过何孟强的背景。德国人,写代码很认真,不是菜鸟。他后来接受采访说,当时提交代码时,有人review过,但没人看出问题。OpenSSL项目当时只有几个全职维护者,一年预算不到2000美元。你没看错,2000美元。这个支撑着半个互联网加密安全的项目,穷得连服务器都租不起,靠捐款活着。而它保护的数据,每天流转几万亿美元。 修复漏洞只用了几天。但善后花了几个月。各大网站发通知让用户改密码,可改密码有用吗?如果服务器私钥已经被偷,攻击者可以伪造任何网站,你改一百次密码也没用。更麻烦的是,有些嵌入式设备、路由器、打印机里的OpenSSL根本没法升级。它们就那么裸着,直到今天。 心血漏洞不是孤例。它暴露了一个荒诞的现实:互联网最底层的安全,靠的是一群志愿者的业余时间。Linux内核、Apache、OpenSSL,这些名字响当当的基础设施,长期缺人缺钱。2014年之后,Linux基金会搞了个“核心基础设施计划”,给OpenSSL每年拨了不到100万美元。听起来不少,但对比一下:一个普通互联网公司的安全团队,一年预算可能就几千万。 我写这些不是要骂何孟强。他犯的错,任何程序员都可能犯。真正该问的是:为什么一个这么关键的代码,只有一个人review?为什么两年没人发现?为什么发现之后,还有那么多设备没法修? 心血漏洞像一面镜子。照出来的不是某个人的失误,是整个行业的侥幸心理。我们习惯了用免费的开源软件,习惯了它不出问题,习惯了把它当成空气。直到空气里有毒,才想起来问:谁在管这空气? 何孟强后来离开了编程圈,去做了木匠。他说写代码太伤神。那行代码,他改过之后又提交了一次,这次加了长度检查。GitHub上的提交记录还在,时间戳是2014年4月7日。两年前的同一天,他埋下了一颗雷。两年后,他自己拆了它。
-
上一篇
-
下一篇