2017年,解密安全研究员阿德里安·拉莫在推特上发了一条消息,软件说优步的漏洞数据库里有5700万用户和司机的个人信息泄露了。优步没报警,解密而是软件付了10万美元封口费给黑客。这事瞒了一年才曝光。漏洞漏洞从来不是解密技术问题,是软件人的问题。
软件漏洞的漏洞本质,是解密程序员和现实世界之间的认知鸿沟。写代码的软件人脑子里有一套模型,现实世界有另一套。漏洞两套模型对接不上,解密裂缝就出来了。软件比如经典的漏洞“整数溢出”——程序员觉得数字不会超过21亿,但用户偏偏输入了21亿零1。结果呢?数字变成负数,银行转账系统直接把钱从你账户里扣走了。
我见过最讽刺的漏洞案例,是一家安全公司自己研发的加密软件。他们用了一个随机数生成器,种子是当前时间戳。攻击者只要知道用户大概什么时间加密的文件,就能推算出密钥。这哪是加密?这是把密码写在便利贴上贴在显示器边框上。写这段代码的工程师肯定是个聪明人,但他忘了——攻击者也有钟表。
漏洞还有个特点:它像蟑螂,你发现一只,暗处可能藏着一百只。2014年爆出的Heartbleed漏洞,让攻击者能读取服务器内存里的任意数据。修复补丁发布后,安全团队以为完事了。但几个月后,有人发现OpenSSL里还有个类似的漏洞,只是触发条件更苛刻。你看,补丁修的是症状,不是病根。病根是那套代码写了十年,没人敢重构。
说句得罪人的话:很多漏洞根本不该怪程序员水平差。现代软件是个巨兽,一个App动辄几十万行代码,里面还嵌着几百个开源库。你没法检查每一行依赖的代码。就像你住在一栋楼里,不可能检查每根钢筋的出厂报告。但开发商可以——他们没做,这就是问题。
还有个反直觉的事实:漏洞的价值是波动的。十年前一个远程代码执行漏洞在黑市能卖几十万美元,现在可能只值几千。为啥?因为防御技术也在涨,能打的漏洞变少了,但能打的漏洞更值钱了。市场就是这么现实。
我认识一个白帽子黑客,他专门找物联网设备的漏洞。他说这行跟考古似的——很多设备用的芯片是十年前的老设计,固件里还留着调试后门。厂商早就不管了,但设备还在用户家里跑着。智能门锁、摄像头、儿童手表,全是洞。最离谱的一次,他黑进一台智能冰箱,用它发了垃圾邮件。冰箱没报警,用户没察觉,只有电费单上多了几块钱。
漏洞这东西,你没法消灭它。你能做的,是承认它的存在,然后用流程去兜底。代码评审、模糊测试、渗透测试、应急响应——这些手段看着枯燥,但真能救命。优步要是当时老老实实上报,罚个几十万美元了事。结果他们选择隐瞒,最后赔了1.48亿美元。贪小便宜吃大亏,这话放哪都适用。
最后说个观察:越年轻的程序员越容易写出漏洞,因为他们自信;越老的程序员也容易写漏洞,因为他们疲惫。真正安全的代码,往往出自那些既保持怀疑又保留敬畏的人之手。他们知道,自己写的每一行代码,都是在跟一个看不见的对手下棋。这对手不睡觉,不领工资,只等着你犯一个微小的错误。