当前位置:首页 > 娱乐

防治漏洞

2021年冬天,防治漏洞Log4j2 被曝出一个远程代码执行漏洞。防治漏洞全球数百万台服务器在几天之内变成待宰的防治漏洞羔羊。一个叫“日志记录”的防治漏洞基础组件,几乎没人主动关注过它,防治漏洞但出问题的防治漏洞时候,整个互联网都在抖。防治漏洞这事让我意识到一个很朴素的防治漏洞事实:漏洞从来不是“会不会有”的问题,而是防治漏洞“什么时候被发现”的问题。

很多人对漏洞的防治漏洞理解停留在“系统有bug”。这个说法太轻了。防治漏洞bug 是防治漏洞程序跑错了结果,漏洞是防治漏洞有人能利用这个错误做你意想不到的事。差一个字,防治漏洞性质完全不同。防治漏洞你写了个除法没判断分母为零,程序崩了,这是 bug。但如果你写了个接口没做权限校验,别人能直接读到所有用户数据,这就是漏洞。前者烦人,后者要命。

防治漏洞的第一件事,不是买扫描器,不是上WAF,而是承认自己会写错。我见过太多团队的代码评审流于形式,大家互相点个“同意”就合并了。问起来就说“赶进度”。可漏洞不会因为你赶进度就放过你。微软的安全响应中心有个数据,他们每年修的大量漏洞里,相当一部分是逻辑缺陷,不是内存溢出那种底层问题。逻辑缺陷靠工具很难扫出来,只能靠人盯着看。

说到工具,静态扫描和动态扫描当然有用。但它们只能覆盖已知模式。真正的麻烦在于业务逻辑漏洞——比如你设计了一个优惠券系统,满100减50,但没限制叠加使用。有人发现了,买200块的东西拆成两单,每单减50,最后只付100。这不是代码写错了,是设计时没想到。工具查不出来,因为代码本身“没毛病”。

还有一类漏洞更隐蔽:依赖链。你写的代码可能只有两百行,但引了三十个第三方库,每个库又引了更多。Log4j 就是典型。你根本没写过那行有问题的代码,但它就在你的系统里跑着。SBOM(软件物料清单)这几年被反复提,就是因为没人能凭记忆说清楚自己的系统里到底装了些什么。我见过一个项目,团队信誓旦旦说没用过有问题的组件,结果一拉依赖树,第四层就躺着那个版本。

防治漏洞的节奏也很重要。不是等到渗透测试报告出来才动手。开发阶段做威胁建模,代码合并前做安全评审,上线后保持依赖更新——这三件事听着老套,但能做到的团队不到一半。大部分人的状态是:出事之前觉得安全是成本,出事之后觉得安全是救命稻草。可那时候往往已经晚了。

我个人有个习惯:每次看到“紧急修复”“热补丁”这类词,都会去翻一下漏洞公告。十次里有七次,问题出在最基础的输入校验上。用户传了个超长字符串,程序没截断,内存爆了;或者传了个特殊字符,拼进SQL里,库被拖了。这些手法二十年前就有,现在依然管用。不是攻击者多高明,是防守方太健忘。

漏洞不会消失。代码是人写的,人就会犯错。但你可以决定犯错之后多久发现、多久修好、影响多大。这个决策链条,才是防治漏洞真正的内容。

分享到: