2024 年 7 月 19 日,星期五,协调世界时 04:09,CrowdStrike 给 Windows 版 Falcon 安全软件推送了一次例行更新。这不是新版程序,只是一个小小的配置文件,用来帮软件留意新的攻击手法。按公司自己的说法,它「不是代码,也不是内核驱动」。
收到它的电脑,直接蓝屏。05:27,也就是 78 分钟后,CrowdStrike 撤回了这个文件。在那之后才上线的机器安然无恙。可已经收到文件的机器里,有一些反复崩溃,连下载修复版的机会都没有。
微软后来估计,受影响的 Windows 设备有 850 万台,不到全部 Windows 机器的百分之一。问题在于是哪百分之一。微软指出,用 CrowdStrike 的是运行着大量关键服务的企业。欧洲和美国都有航班停飞。在英国,一位部长在议会说,当地医疗系统很大一部分调不出化验结果和预约信息,受影响的主要是全科诊所。用《卫报》的话说,本该保护关键系统的软件,「最后把它们弄垮了」。
CrowdStrike 几小时内给出的补救办法,是个手工活:把电脑启动进安全模式,钻进 Windows 深处的一个 CrowdStrike 文件夹,找到名字以 C-00000291 开头的文件,删掉,重启。硬盘加了密的,可能还得先输入恢复密钥。一开始,每台受影响的机器都得这样单独弄一遍。
CrowdStrike 的初步复盘解释了当时为什么敢放心发:这类新检测 3 月做过压力测试,同类更新此前在客户机器上跑过四次,都没出事,再加上对「内容校验器所做的检查」的信任。
毛病恰恰就藏在这份顺利的记录里。
早在当年 2 月,CrowdStrike 给传感器加了一种新的检测能力。按定义,它会收到 21 项信息,可传感器代码实际只递给它 20 项。这个缺口好几个月没人发现,因为测试,还有 3 月、4 月那四次线上更新,在第 21 格里填的都是通配符,也就是什么都匹配。传感器从来不用真的去看那一格。
7 月 19 日又推出两条新内容,其中一条第一次真要查第 21 格。内容校验器(内容发布前要过的那道检查)拿它去对照定义,定义写着 21,于是放行。到了客户的机器上,传感器伸手去拿第 21 个值,那里什么都没有。它读到了列表末尾之外的内存,Windows 跟着一起倒下。
而且这次没有分批上线。所谓分批,就是先推给一小批机器,看看情况,再往外扩。78 分钟,足够它铺到几百万台机器上。
18 天后,公司发布根因分析,列了六条发现。最后一条只有一句话:「每个模板实例都应分阶段部署。」