这是现在全网最引人注目的一份简历。10 年前,杀毒软件 McAfee 的一次更新,意外删除了 Windows 的服务主机文件,导致几十万台 Windows XP 电脑蓝屏死机,这位简历的主人 George Kurtz 当时正是 McAfee 的 CTO,首席技术官。上周五,800 多万台 Windows 电脑蓝屏死机,让全世界的银行、机场、甚至 911 系统陷入混乱。这一次的罪魁祸首是一家叫 CrowdStrike 的网络安全公司,而它的创始人和 CEO 就是 10 年前的那位 George Kurtz。
为什么会发生这样的事情呢?真的是因为全世界都是一个草台班子吗?我查了一些英文的资料,跟大家讲讲我的理解,包括 CrowdStrike 程序是干嘛的、为什么会导致系统崩溃、蓝屏死机、以及为什么没用容错机制等。
电脑代码的运行分为两种模式:一种是用于运行操作系统的内核模式,也称为 Ring 0,因为在分级保护域里它是最里面、最核心的一环,另一种是运行应用程序的用户模式。
内核模式执行的是操作系统最核心的功能,比如与硬件和设备通信、管理内存、调度线程等任务。内核模式拥有最高级的权限,可以查看整个系统的所有内容,而用户模式只能看到内核模式允许你看到的内容。
通常来说,应用程序代码,永远不会在内核模式下运行,而内核代码,也永远不会在用户模式下运行。一个应用程序,如果需要某个在内核模式下才能提供的服务,它并不会获得进入内核运行的权限,而是只能向内核发出请求,自己在内核外等待,而内核的一个线程会查看指定的参数,验证内容,运行所需的内核代码,然后将结果发给在内核外等待的应用程序,让它继续愉快地运行。
这两者的绝缘也意味着,如果应用程序有 bug,应用程序会崩溃,但不会影响到内核,因此系统不会崩溃。只有在内核程序出现 bug、无法运行时,整个系统才会崩溃。现在的电脑操作系统都是这么设计的,不只是 Windows,Linux 和苹果的操作系统也是这样。
由于内核模式非常重要,所以只有极少数程序允许进入内核,包括操作系统本身,以及必须要访问硬件的功能,比如设备驱动程序。这次出事故的程序,是 CrowdStrike 公司的产品,Falcon Sensor,它是一个野心勃勃的安全产品,它不只是简单地查找文件,还试图通过分析应用程序的行为,来主动检测未知的病毒和潜在的攻击。在 Windows 平台上,CrowdStrike 的一些安全功能需要与操作系统深度集成,而这目前只能在内核端实现 —— 这可以让它从上帝的视角看到所有应用程序的行为。
讽刺的是,微软当然知道这么做的风险,并且曾经有防止此类灾难的解决方案。它专门为像 CrowdStrike 这样的安全应用,开发了一个 API 接口,让获得批准的安全应用,通过 API 接口与 Windows 操作系统沟通,而无需直接在内核运行。但是,当微软尝试推广这个 API 时,却遭到了欧盟监管机构的否决,因为他们担心,这个强大的工具,实际上会扼杀那些无法获得相同访问权限的小型安全公司,创造不公平的竞争、产生对微软生态系统的依赖。2009 年,微软被迫与欧盟达成协议,同意给安全软件提供与自身产品、Windows 操作系统同样的权限。因此,这个锅至少有一部分应该是由欧盟的监管机构来背。一些关键的服务,应该拥有一个不需要运行第三方内核代码的系统,但前提是监管机构允许微软这么做。
当然,大家都知道,在内核模式下运行代码可能会有让系统崩溃的风险,因此,必须先通过微软的 WHQL 硬件质量认证,意思就是说,微软的硬件实验室在在各种平台和配置上测试了这个程序,确认没有问题,并提供数字签名,证明它与 Windows 操作系统兼容。只要驱动程序本身不变,这个认证就会一直有效,它也就一直会有在内核运行的权限。
但是,野心勃勃的 CrowdStrike 对此并不满足。CrowdStrike 发现新的威胁之后,如果要更新驱动程序,意味着要重新通过微软的硬件质量认证。我们都知道,大公司的流程有时候是很慢的。在等待认证期间,客户的电脑就会面临威胁、没有保障啊!这怎么能行呢?
于是,CrowdStrike 的做法是,将它的防护软件分成两个部分:驱动程序在内核运行,尽量不更新,以免需要重新认证;另一个部分则是在用户模式里运行的通道文件。每次启动驱动程序时,它会枚举机器上的一个文件夹,寻找这些动态定义文件,然后对它们进行必要的处理。
到这里,您可能已经看到了风险:CrowdStrike 可以只更新这些动态文件,而不更新驱动程序。由于驱动程序没有变动,因此微软的认证仍然有效,它可以继续在内核里运行。但是,如果动态文件里有 bug,驱动程序在处理它时就会产生故障。由于驱动程序在内核里运行,它的故障会导致整个操作系统进行 bug 检查,进入蓝屏恢复界面、重新启动。
更要命的是,为了避免用户在没有保护的情况下启动电脑,CrowdStrike 将它们的驱动程序设置为开机启动,你只要重启,CrowdStrike 就会运行,而它一运行,就会因为动态文件里的 bug 而产生故障,继而导致整个内核崩溃,陷入死循环。
幸运的是,你仍然可以通过进入安全模式来重启电脑,因为安全模式运行的驱动程序更少,而 CrowdStrike 并不在其中。然后,删除 CrowdStrike 本次更新的动态文件,电脑就可以正常启动了。事故发生后,CrowdStrike 在几小时内就部署了修复方案,但是,这只能防止更多机器死机,之前已经死机的电脑、没法接收 CrowdStrike 的修复。所以,目前的情况就是,全世界各地的电脑管理员,正在排队手动重启 800 多万台电脑、进入安全模式、删除之前有问题的更新文件。
当然,这次事故还有很多的疑问。在每一次重大事故的背后,可能都有几十次的潜在事故。程序员写出一段有 bug 的代码并不稀奇,真正不可思议的是一段有问题的代码,如何在没有经过质量控制、层层验证、分阶段推出等把关措施的情况下,从开发环境、测试环境,一跃到生产环境、部署到了微软操作系统的内核,而这绝对不是某一个码农的责任。这些问题,我们恐怕只有等到 CrowdStrike 被国会质询的那一天才能知道更多细节了。
这次事故发生之后,社交媒体上很快出现了各种阴谋论,比如说这其实是一次网络攻击事件,是第三次世界大战的开端,以及它是世界经济论坛、或者是政治人物策划的,目的是影响地缘政治关系。不过,我们没有看到任何可靠的证据来支持这些说法。而且,这种事情也绝对不是第一次发生,也不只是发生在 Windows 系统上。今年 4 月,CrowdStrike 发布的一个更新,就让 Debian Linux 的系统崩溃、无法重启。CrowdStrike 花了几周时间才确定确切原因并修复。仅仅一个月后,类似的问题再次发生,影响了另一个版本的 Linux 系统,导致运行在这个系统上的服务器,在升级之后死机。
有趣的是,CrowdStrike 也为苹果电脑提供安全解决方案,但是苹果电脑却没有因此出现大规模宕机事故,因为苹果并没有给安全公司核心权限,所以,如果苹果电脑上的 CrowdStrike 发生故障,只是在应用程序层面,并不会导致整个系统崩溃。至于为何苹果可以这么做,而微软却没有,前面我们说了,监管机构至少要背负部分责任。
Disclosure: We are an Amazon Associate. Some links on this website are affiliate links, which means we may earn a commission or receive a referral fee when you sign up or make a purchase through those links.
相关文章
Discover more from 美国攻略
Subscribe to get the latest posts sent to your email.