2017年9月,漏洞何Equifax公布了一起数据泄露事件。漏洞何1.43亿美国人的漏洞何姓名、社会安全号、漏洞何出生日期、漏洞何住址被拖走。漏洞何事后复盘,漏洞何问题出在一台跑着Apache Struts的漏洞何服务器上——一个早已发布补丁的漏洞,没人去打。漏洞何
这事有意思的漏洞何地方不在于漏洞本身。Struts那个远程代码执行漏洞(CVE-2017-5638),漏洞何补丁在泄露发生前两个月就放出来了。漏洞何真正的漏洞何问题出在运维流程里:一台服务器被遗漏了。就一台。漏洞何然后1.43亿人的漏洞何数据从这一个口子流出去。
漏洞这东西,大多数人理解成技术问题。代码写错了,逻辑有缺陷,边界没检查。对,但不全对。技术漏洞只是入口,真正让漏洞变成灾难的,往往是人的流程、组织的惯性、以及“应该没问题”这五个字。
2014年,OpenSSL爆出Heartbleed。这个漏洞在代码库里躺了两年多才被发现。两年。全球大量HTTPS流量依赖OpenSSL,而那段有问题的代码被无数人 review 过,没人看出来。
更早的例子是Windows的MS08-067。2008年微软发了补丁,但大量企业没打。结果2017年WannaCry勒索病毒用的就是这个漏洞——一个九年前的洞,横扫150个国家,英国NHS的医院系统直接瘫痪,手术取消,病人转院。
你看到规律了吗?漏洞被修复的时间和漏洞被利用的时间之间,存在一个巨大的灰色地带。这个地带里,攻击者比防御者跑得快。
说句可能不太中听的话:不是每个漏洞都需要立刻修。CVSS评分9.8的漏洞,如果跑在一台内网隔离的、没有敏感数据的测试机上,优先级可能低于一个评分6.5但暴露在公网、连着数据库的漏洞。
问题是,很多团队的漏洞管理逻辑是“按评分排序,从上往下修”。这听起来合理,实际上偷懒。真正的风险评估要看:这台机器能碰到什么?谁在访问它?被攻破之后的横向移动路径是什么?
我见过一个团队,花了三周去修一个内部Wiki的XSS漏洞,同期他们的VPN网关跑着一个已知的认证绕过漏洞没管。理由?“扫描器给Wiki标的分数更高。”这种判断方式,说难听点,就是把安全交给了工具的默认配置。
代码的逻辑是“我设计它做A”,攻击者的逻辑是“我让它做B”。漏洞就诞生在这个缝隙里。
缓冲区溢出是经典案例。程序员分配了一块内存,预期输入不会超过这个大小。攻击者偏要超。多出来的数据覆盖了相邻的内存区域,程序的控制流就被改了。这个原理从1988年的Morris蠕虫到现在,本质上没变过。
SQL注入也一样。开发者预期用户输入的是用户名,结果对方输入的是 ' OR 1=1 --。数据库把这段当指令执行了。预期和现实之间的落差,就是漏洞。
所以修漏洞不只是打补丁。打补丁修的是已知的、具体的那个点。但如果你不理解“为什么会产生这个漏洞”,下一个变种还会绕过你。
回到Equifax。事后调查发现,除了那台没打补丁的服务器,他们的证书过期了——导致加密流量无法被检测。入侵检测系统因为证书问题,没看到异常流量。数据在系统里待了76天才被发现。
三个环节,每一个单独看都是“小问题”。证书过期?续一下就好。一台服务器漏了?补上就行。但三个小问题叠在一起,构成了完整的攻击链。
漏洞管理最难的部分从来不是技术。是让一个几百人甚至几万人的组织,在每一天、每一台机器上,都保持一致性。人会疲劳,流程会僵化,优先级会打架。攻击者只需要找到一个缝隙。
你防不住所有漏洞。但你可以让攻击者的成本高到不值得。这不是一个技术目标,是一个组织目标。