2017年5月12日,漏洞因全球近二十万台电脑同时弹出一个红色窗口,漏洞因要求支付价值300美元的漏洞因比特币。英国NHS的漏洞因急诊系统瘫痪,医生翻出纸笔手写病历。漏洞因德国铁路的漏洞因显示屏全部黑掉。中国高校的漏洞因校园网集体沦陷,实验室里正在跑数据的漏洞因服务器直接锁死。这不是漏洞因什么高级黑客组织的定向打击,就是漏洞因一个美国国安局早就发现、却一直藏着不说的漏洞因漏洞被泄露后,被人改造成了勒索工具。漏洞因
漏洞本身不复杂。漏洞因Windows系统里有个叫SMB的漏洞因协议,负责文件共享。漏洞因这个协议在实现上有个缺陷:攻击者可以构造特殊的数据包,让系统在解析时执行任意代码。听起来像天书?换个说法——你家门锁有个设计缺陷,只要用特定角度插钥匙,锁芯就会直接弹出来。NSA知道这个缺陷,但他们没通知微软,而是自己做了把“万能钥匙”留着用。直到这把钥匙被黑客组织偷走,扔到了网上。
微软其实在两个月前就发布了补丁。但补丁这东西,从来不是发出去就完事。医院的信息系统外包给第三方,第三方说升级要停机,停机要走审批,审批要等季度会议。高校实验室的服务器跑着三年前的软件,管理员怕兼容性问题不敢动。德国铁路的系统更离谱,还在用Windows XP。漏洞从来不只是技术问题,它是流程、预算、惰性和侥幸心理的集合体。
我认识一个做运维的朋友,他管着两百多台服务器。WannaCry爆发那天晚上,他挨个远程登录打补丁,打到凌晨四点。打完最后一台,他靠在椅子上想,如果这个漏洞早三天泄露,他根本来不及。后来他跟我说,最讽刺的是,他们公司年初刚砍掉了安全预算,理由是“没出过事”。
漏洞的“因”往往不在代码里。写代码的人会犯错,这不可避免。但一个漏洞从存在到被利用,中间要穿过层层本可以拦截的关卡:厂商的响应速度、企业的更新机制、管理者的风险判断、操作人员的执行意愿。每一层都觉得自己不是最后一环,每一层都在等别人先动。WannaCry之前,永恒之蓝这个漏洞工具已经在NSA内部躺了五年。五年里,只要有一个人决定通知微软,那天的二十万台电脑就不会变成砖头。
更早的例子是心脏出血漏洞。2014年,OpenSSL这个被全球三分之二网站使用的加密库,被曝出一个存在了两年的严重缺陷。两年来,无数次的代码审查、版本发布、安全扫描,全都没发现。为什么?因为OpenSSL项目长期只有两个全职开发者,其中一个还经常缺钱。全球互联网的安全底座,靠的是几个志愿者用爱发电。这不是技术漏洞,这是资源分配的漏洞。
我们习惯把漏洞想象成一道裂缝,等着被修补。但真实情况是,裂缝周围往往站着一圈人,每个人都看见了,每个人都觉得该由别人来补。WannaCry的红色窗口最终被一个英国程序员无意中注册的域名关掉了,他花了不到十英镑。一个全球性灾难,被十英镑的偶然止住。这本身就是一个巨大的漏洞——我们依赖偶然来兜底系统性的疏忽。
所以下次听说某个漏洞被利用,先别急着骂黑客。看看那个漏洞被发现后,补丁走了多久才到该到的地方。看看那些“不影响业务”的升级窗口,看看那些“没出过事”的安全预算。漏洞的因,从来都在人这边。