系统漏洞的概念
2017年,系统Equifax的漏洞Apache Struts服务器上有一个已知漏洞,补丁发布已有两个月。系统他们没打。漏洞结果1.47亿人的系统社保号、生日、漏洞住址被拖了个干净。系统这件事说明一个很朴素的漏洞问题:漏洞本身不可怕,可怕的系统是你知道它在那儿,却没当回事。漏洞 系统漏洞,系统说白了就是漏洞系统在设计和实现时留下的缺陷。这个缺陷可能被利用,系统让系统做出它本来不该做的漏洞事——泄露数据、执行恶意代码、系统绕过权限验证。注意,漏洞不是bug的同义词。bug是"程序没按你期望的方式运行",漏洞是"有人能利用这个偏差干坏事"。一个显示错位的bug不是漏洞,一个能让攻击者越权读取数据库的bug才是。 代码是人写的。人就会犯错。缓冲区溢出、整数溢出、竞态条件、SQL注入——这些名字听起来专业,本质都是"没考虑到某种输入或某种时序"。比如SQL注入,就是把用户输入直接拼接到SQL语句里,攻击者输入一段精心构造的字符串,数据库就把不该给的东西全吐出来了。九十年代到两千年初,这类漏洞遍地都是。现在少了,但没绝迹。 还有一类漏洞不来自代码,来自设计。比如把敏感信息存在客户端、用可预测的token做会话标识、加密算法选错了模式。这些东西代码写得再规范也没用,因为方向就错了。修起来往往比代码漏洞更麻烦,得动架构。 第三类来自依赖。你用了一个第三方库,库里有洞,你的系统就有洞。Log4j那个事就是典型——一个Java日志库的漏洞,波及了全球无数系统。你甚至不知道自己用了它,因为它藏在某个框架的某个依赖链里。 有个概念叫攻击面。你的系统暴露的接口越多、开放的端口越多、接受的输入越复杂,攻击面就越大。漏洞是子弹,攻击面是靶子。没有靶子,子弹打不出去。很多内网系统有漏洞但没出事,不是因为它安全,是因为没人够得着。一旦那层网络隔离被突破,或者某个服务被暴露到公网,情况就完全不一样了。 另一个常被忽略的点:漏洞的价值取决于系统里有什么。一个只存天气预报的服务器有漏洞,攻击者可能懒得看一眼。一个存着几亿用户身份信息的数据库有同样的漏洞,那就是金矿。所以风险评估不能只看漏洞本身,得看它所在的资产值多少钱。 理论上,发现漏洞就打补丁,事情就结了。实际上没那么简单。打补丁意味着重启服务,重启意味着停机,停机意味着业务中断。大公司有变更窗口,小团队可能根本没有。有些老旧系统跑在特定硬件上,补丁不兼容,打了就崩。还有些系统是外包做的,源代码都拿不到,想修也修不了。 这就造成了一个尴尬局面:漏洞是已知的,补丁是现成的,但就是打不上去。Equifax不是不知道那个漏洞,他们内部扫描都扫出来了,只是没人在截止日期前完成修补。流程问题、沟通问题、优先级问题——技术问题最后往往卡在人的问题上。 漏洞管理这件事,技术只占三成,剩下七成是流程和意识。扫描工具能告诉你哪里有洞,但决定先修哪个、什么时候修、谁来修,是管理问题。很多团队买了一堆安全设备,却连资产清单都没理清楚——你都不知道自己有什么系统,怎么知道哪些有漏洞? 漏洞不会消失。只要系统还在迭代,新的缺陷就会不断出现。能做的是缩短"漏洞存在"到"漏洞修复"之间的时间窗口。这个窗口越小,被利用的概率越低。没有绝对安全的系统,只有把风险控制在可接受范围内的系统。漏洞从哪来
漏洞不等于被攻击
修补的困境
我的判断
-
上一篇
-
下一篇