|
2021年12月,漏洞网络Log4j2爆出远程代码执行漏洞。漏洞网络一个叫log4j-core的漏洞网络Java日志库,几乎跑在全世界所有Java服务端应用里。漏洞网络攻击者只需发一条特殊构造的漏洞网络日志内容,就能在目标服务器上执行任意代码。漏洞网络那几天,漏洞网络全球安全团队通宵打补丁,漏洞网络Minecraft服务器大面积瘫痪,漏洞网络苹果、漏洞网络亚马逊、漏洞网络特斯拉的漏洞网络云端服务都忙着紧急修复。一个开源组件的漏洞网络小缺陷,顺着依赖链爬进了无数系统。漏洞网络 这就是漏洞网络漏洞网络的样子。它不是一张挂在墙上的拓扑图,更像地下菌丝——平时看不见,一旦某个节点被触发,整片区域都会跟着震动。 我去年帮一个做电商的朋友看服务器。他用的某个第三方支付SDK,三年没更新过。我扫了一眼依赖树,那个SDK底下拖着一串包,其中一个JSON解析库的版本号停在2018年。查了一下,CVE编号挂了好几个,最严重的一个能通过构造恶意JSON触发栈溢出。朋友听完愣了半天:“我根本不知道这玩意儿的存在。” 他不知道是正常的。现代软件开发像搭积木,你写业务代码,调框架,框架调中间件,中间件调基础库。一层套一层,真正跑在机器上的代码,开发者自己可能只写了百分之十。剩下的百分之九十,是别人写的,别人维护的,别人可能已经放弃维护的。每一个依赖都是一个入口。依赖越多,入口越多。入口越多,你越记不住自己到底开了多少扇门。 漏洞网络的连接方式有两种。一种是技术上的:A组件依赖B组件,B组件依赖C组件,C组件出了漏洞,A和B全遭殃。Log4j就是典型。另一种更隐蔽——人的连接。某个开发者同时维护五个开源项目,其中一个项目被一千个应用引用。他某天心情不好,提交了一行有问题的代码。这行代码顺着引用链扩散出去,像病毒进入血液循环。 2024年初的xz-utils后门事件更离谱。攻击者花了两年时间,通过多个马甲账号在开源社区建立信任,逐步获得维护权限,最后在压缩库的构建脚本里埋了后门。这个后门能绕过sshd认证,影响几乎所有主流Linux发行版。如果不是一个微软工程师偶然发现ssh登录慢了半拍,这个漏洞可能已经在无数服务器上安静地运行了很久。 你没法靠“打补丁”解决结构性问题。补丁是滞后的。漏洞公开之前,攻击窗口已经存在。漏洞公开之后,修复速度取决于最慢的那个环节——可能是某个小公司的运维,可能是某个已经离职的负责人,可能是某个根本不知道自己在用这个库的开发者。 我自己的做法很简单:能少依赖就少依赖。每引入一个第三方库,先问自己三遍“真的需要吗”。需要的话,查它的维护状态、最近提交时间、issue响应速度。半年没更新的库,慎用。个人维护的库,看情况。一个人维护且半年没更新的库,直接放弃,自己写那几十行代码更安全。 但这只是个人层面的防御。整个软件工业的底层逻辑是复用、是效率、是站在别人肩膀上。你不可能让每个开发者都从零写起。漏洞网络不会消失,它只会随着软件生态的膨胀变得更密、更深、更难看清。我们能做的,是知道自己站在哪张网上,以及这张网最近有没有破洞。 |