2017年,漏洞都Equifax被黑,漏洞都1.43亿美国人的漏洞都社保号、出生日期、漏洞都住址全泄了。漏洞都事后调查发现,漏洞都问题出在一个叫Apache Struts的漏洞都开源组件上。这个组件有个远程代码执行漏洞,漏洞都补丁早在几个月前就发布了。漏洞都Equifax的漏洞都安全团队收到了通知,但没打。漏洞都
漏洞都是漏洞都补丁没打的后果。
听起来像废话。漏洞都但大部分人理解漏洞的漏洞都方式是错的。他们觉得漏洞是漏洞都某个天才黑客灵光一闪发现的秘密通道,是系统里藏着的暗门。实际上绝大多数漏洞,是已知问题在已知位置的已知修复方案被忽略了。CVE数据库里躺着的漏洞,超过九成都有现成的补丁。攻击者利用的,不是他们多聪明,而是防守方多懒。
我见过一个运维,服务器跑了三年没重启过。问他为什么不打补丁,他说怕重启影响业务。结果某天勒索软件进来,整个集群瘫了两天。停机损失远超那几次重启的几分钟。这种账算不过来,是因为人脑对“可能发生的坏事”天然低估,对“确定要做的麻烦事”天然抗拒。
漏洞的另一个真相是:它们大多数不在你写的代码里,而在你引用的代码里。一个Java项目,pom.xml里几十个依赖,每个依赖又拖着一堆传递依赖。你根本不知道最终打包进去的jar包里有多少行别人的代码。Log4j那个漏洞爆出来的时候,很多团队连夜排查,发现自己压根没直接用过Log4j,但某个框架的某个版本把它带进来了。供应链攻击,本质上就是利用这种“你不知道你用了什么”的盲区。
更麻烦的是,漏洞不光是技术问题。它是个管理问题。一个公司如果有五百个系统,每个系统平均一百个依赖,那就是五万个组件需要追踪。没有自动化工具,靠人盯,必漏。但买了工具就万事大吉?也不见得。工具会报出几千个漏洞,安全团队根本修不过来。于是他们开始打分,CVSS高于7的优先。可攻击者不看分数,他们看哪个好打。一个CVSS 5.0的漏洞,如果暴露在公网、利用代码公开、目标系统正好没做隔离,它比一个CVSS 9.0但需要物理接触的漏洞危险得多。
我认识一个做渗透测试的人,他说他进内网从来不用0day。0day太贵,也太少。他用的全是Nday——已经公开、已经有补丁、但目标没打的漏洞。一台机器没打补丁,可能是因为管理员忘了。十台机器没打,可能是因为补丁和业务系统冲突。一百台没打,那就是流程有问题。流程问题比技术问题难修多了。
还有个反直觉的事:有些漏洞是“修”出来的。一个系统本来跑得好好的,为了修一个低危漏洞,打了个补丁,结果引入了新的兼容性问题,导致服务崩溃。这种事在Windows更新里太常见了。于是有些团队干脆选择“不修”。他们在风险和稳定之间走钢丝,赌的是攻击者看不上他们。小公司赌赢了没事,赌输了可能直接关门。
漏洞都是人造成的。写代码的人留了缓冲区溢出,配环境的人开了不必要的端口,做决策的人批了“先上线再说”的排期。每一环都在制造漏洞。修补漏洞也是人做的。人会有疏忽,会有优先级误判,会有资源不够。所以漏洞永远不会消失。它只是从一种形式变成另一种形式,从内存破坏变成逻辑缺陷,从本地提权变成云配置错误。
你打开Shodan搜一下,现在还有几万台MongoDB裸奔在公网上,没密码。它们的漏洞是什么?没有漏洞。就是配置错了。但攻击者不需要漏洞,配置错误本身就是入口。漏洞的定义太窄了,我们该叫它“可被利用的缺陷”。缺陷是人的产物。只要人还在写软件,这事就没完。