当前位置:首页 > 百科

一点漏洞

2017年,点漏洞WannaCry勒索病毒横扫全球,点漏洞瘫痪了英国国家医疗服务体系、点漏洞雷诺汽车工厂、点漏洞联邦快递。点漏洞事后复盘,点漏洞攻击入口不是点漏洞什么高深的后门——是Windows系统里一个已经被微软发布补丁修复了两个月的老漏洞。补丁发了,点漏洞没人装。点漏洞就这么简单。点漏洞

这事让我一直记着。点漏洞不是点漏洞因为它多轰动,而是点漏洞因为它太典型了:真正搞垮系统的,往往不是点漏洞什么惊天动地的新问题,就是点漏洞一个被忽略的小口子。

我后来做产品,对这件事体会更深。团队里有个习惯,每次上线前大家盯着核心功能反复测,流程图画得密密麻麻,边界条件列了几十项。结果上线第三天,用户反馈炸了——不是主流程出错,是注册页面一个手机号输入框,没做前后空格过滤。用户复制粘贴号码时带了空格,提交报错,然后就没有然后了,直接关掉走人。这个空格,在测试用例里从来没出现过。

你说这算什么漏洞?技术上连bug都算不上,加一行trim就解决的事。但它造成的流失率,比任何一个后端接口超时都高。因为用户不会给你第二次机会。

安全圈有个说法叫“攻击面”。你的系统越复杂,暴露的面就越大。但大多数人理解攻击面的时候,想的都是那些显眼的入口——登录接口、支付通道、API网关。真正被打的,经常是角落里一个忘了关的调试端口,或者测试环境遗留下来的一条硬编码密钥。2021年,一个安全研究员在GitHub上扫公开仓库,找到了一家大公司工程师误提交的AWS密钥。那个密钥权限高得离谱,能直接访问生产数据库。从发现到利用,前后不到二十分钟。

我认识一个做了十几年运维的老哥,他有个习惯让我印象很深。每次系统上线,他不看功能清单,他看“谁忘了关什么”。他说,新功能出问题顶多是不好用,老东西没关干净,那是要命的。他举了个例子:某次排查线上故障,查了六个小时,最后发现是一台早就该下线的旧服务器还在跑定时任务,往生产库里写脏数据。这台服务器在两年前的架构迁移文档里标注了“待下线”,然后就没有然后了。

“待办事项”是漏洞的温床。不是技术漏洞,是人的漏洞。我们总觉得大事要紧,小事可以放一放。但系统不这么想。系统没有“重要”和“次要”的概念,任何一行没处理干净的代码,在它眼里都是同等优先级的执行指令。

写代码的人有个毛病,喜欢追新。新框架、新工具、新玩法,学起来带劲,用起来有成就感。但维护一个老系统,把那些陈年旧账一点点清掉,这事没人愿意干。枯燥,没产出,KPI上体现不出来。可恰恰是这些没人愿意干的事,决定了系统能不能扛住下一次意外。

说白了,漏洞这东西,大部分时候不是被人攻破的,是自己漏的。你留了一个小口子,觉得没事,风一吹就过去了。但风一直吹,口子就会变大。等到有一天你发现的时候,已经来不及补了。

那个空格,那个旧端口,那个“待下线”的服务器。它们不会喊疼,不会报警,安安静静待在那里。直到某个普通得不能再普通的下午,一切突然崩掉。你回头看日志,第一行写的就是它们。

分享到: