2024年7月19日中午,一台台Windows终端悄然染成蓝色。随即,如「蓝色焰海」一般的IT故障在各个国家蔓延开来,迅速席卷全球。无数航班晚点,银行、医疗、金融等行业的IT系统相继出现异常,受到影响的用户们纷纷在X、脸书、微博等社交媒体上报告求助。
(一位小红书博主在旅途中遇到航司系统宕机,被迫领取了手写登机牌)
起初人们迅速向微软发出问询,但很快就有了进一步进展:事件并非出自系统本身的故障,而是由部分企业安装的一款安全软件功能故障引发。为啥日常电脑上使用的一款软件,竟然有如此的能量和威力去造成这场引起全球关注的IT故障呢?让我们从安全软件的底层工作原理出发,挖掘这次事件背后的「主角」,搞清楚它为什么会有如此广泛的破坏力,以及背后的症结到底是什么。
二、猫鼠游戏诞生记
1971 年,研究员鲍勃·托马斯 (Bob Thomas) 开发出了第一个病毒,称为 Creeper。该病毒通过 ARPANET(第一个计算机网络)传播,感染设备后会显示一条消息:「我是 Creeper,有本事来抓我呀」。随后,电子邮件的发明者雷·汤姆林森 (Ray Tomlinson) 开发了一个名为 Reaper 的程序,试图追踪并消灭 Creeper,这个程序则被视为杀毒软件的起源。
从这个杀软诞生的故事中不难看出,杀毒软件的工作模式本质是一场猫鼠游戏,恶意程序就好比要偷吃的老鼠,而杀毒软件就是看守的猫,双方你追我赶,老鼠为了逃避猫的追捕,会不断演变自身的伪装和隐匿手段,而猫则需要不断提升自己的火眼金睛,透过层层伪装,抓住躲藏的老鼠。
双方从定位上来说是敌人,从进化角度来说却亦师亦友,从对抗中相互促进学习成长,仿佛宿命中的相互纠缠的螺旋不断前进。
三、安全软件的难言之隐
1. 来自系统内核层的监视之眼
伴随着攻守双方的不断进化,安全软件发展到今天,早已与操作系统紧密结合。只有掌握操作系统最高权限的尚方宝剑,安全软件才能与手段层出不穷的恶意程序斗争。操作系统一般会对运行权限做层次划分:内核代码一般工作在内核层(Ring0),而我们常说的应用程序工作在应用层(Ring3)。内核层享有最高的执行权限,能够访问操作系统上所有的设备和信息,同时一旦内核层发生异常崩溃,整个系统就无法继续运转,进而会出现经典的蓝屏提示。而应用层则只能访问应用本身的一些常规权限资源,即使出现崩溃也只会影响自身软件进程,对操作系统不会产生影响。
现代的安全软件往往都会在内核层安装自己的安全模块(也有部分低级别的安全软件没有内核模块),从而基于内核层的最高权限,实现「上帝之眼」的效果,监视整个操作系统上每时每刻发生的不同类型的事件。安全软件24小时不间断地分析和比对这些事件,进而过滤出潜在威胁,将事件及时的阻断和扼杀,通过审核模式的工作原理,来实现保卫操作系统的安全。
(操作系统不同层次的运行权限)
2. 安全软件的终端架构
一个完整安全软件的终端架构,从核心功能角度来划分,大部分都具备以下一些安全模块:首先,工作在系统最高权限层的内核模块,一般负责与系统内核接口打交道,获取系统第一手的实时日志信息,类似于情报收集部门的职能。
同时,由于该模块在内核层有最高权限,可以在系统执行层面第一时间阻断恶意攻击,因而也会承担一部分阻断恶意攻击的职能,实现恶意攻击的事前阻断能力。
其次,应用层的策略审核模块,类似安全指挥部门,负责审核内核模块采集到的实时日志,将日志上报到云端后台,同时对于一些审核有威胁的日志,按策略配置进行响应处置。
(内核模块与策略审核模块的职能划分)
3. 如履薄冰的系统审核员
从上述安全软件的终端架构中,不难看出,安全软件已经演变为操作系统上的一切行为审核员,拥有行为的最终解释权。
但所谓权力越大责任也就越大,安全软件拥有操作系统的核心审核权,一旦权力使用不当就会带来难以预期的后果。例如审核错误阻止了合法的行为,可能导致系统软件异常失败;审核速度过慢,可能导致系统和软件运行卡顿;审核过程中错误修改或影响了合法行为的属性,也可能导致系统异常或软件错误。在此之上,即使审核员的操作完全合规正确,但动作本身如果出现编程错误,还是会造成系统蓝屏的严重风险。如果故障发生在内核启动阶段,还会造成重启后继续蓝屏,也就是我们常说的无限循环蓝屏的更严重问题。
可以说,安全软件借助系统的最高权限来防范攻击,但也因为最高权限的便利性带来了重大的责任风险。安全软件扮演的系统审核员,必须对每一步都要做到战战兢兢,如临深渊,如履薄冰。
4. 难以平衡的攻守矛盾
正因为这份如履薄冰的责任,安全软件与恶意程序的对抗才会如此周而复始持续这么多年。安全软件需要恪守不影响系统稳定性的底线,导致在与恶意程序的对抗中畏首畏尾。这也是安全软件无法创造出一个大杀器来彻底结束这场攻防对抗「猫鼠游戏」的核心原因。
其背后的本质,是安全软件既要保证系统上的合法行为不受到影响,又要避免不法威胁行为潜藏在合法行为中偷偷潜入,这是一场解不开的天然矛盾。任何对伪装者的检查和判定,都必然导致对合法行为进行相同的盘问,从而产生额外的执行开销。要求安全软件既做到铁面无私(对待恶意攻击),又做到柔情似水(对待合法行为),恰恰是安全软件当前面临最大的难点和矛盾,也是安全软件安身立命的根本。
四、腾讯iOA-EDR实践之路(压缩版)
发展到今天,安全类的产品百家争鸣,争奇斗艳,但万变不离其宗,延续上面的攻守矛盾来说,整体的发展犹如一个三岔口。第一条路是以攻为守,崇尚安全软件以对抗恶意程序的本职为第一目标。第二条路是全面防守,稳字当头的思路,整体架构完全不进入内核层,只使用系统本身的安全接口来与恶意程序对抗。第三条路,则是选择一种攻守兼顾的架构,既要保证拥有内核层的核心能力,又尽可能降低对核心层的依赖,让内核层功能尽可能纯净简单,把大部分功能逻辑放在应用层模块上。
(三种不同的防御策略)
安全软件的稳定性保障一直是腾讯安全的重中之重。因此,腾讯安全EDR采取攻守兼顾的架构原则。整体架构的设计原则,是在满足恶意程序对抗的前提下,最小化使用系统底层权限,最大化保证系统的稳定性和兼容性。
整体架构依旧分内核和应用层两层,在内核层中的模块以最小化原则来设计,只做系统底层接口能力的扩展封装,不做逻辑和策略的执行。这样的架构在内核层面极致简洁,不需要因为功能迭代经常变更,更容易打磨稳定后持续提供能力,能够最大限度保障稳定性的要求。而与安全对抗的变更部分都在应用层的策略模块,这样产生故障的时候,不容易出现蓝屏或者系统层面的故障,以及和软件产生兼容性问题。
内核模块层面也尽可能极致降低权限依赖,采取纯异步采集模式(旁路模式),即接收到系统通知的第一时间就发送旁路日志消息到工作队列中,后续功能流程即可避免对系统和软件产生影响。
腾讯EDR在进程注入采集上也是执行的最小化原则,首先范围层面最小化,只注入可疑的入侵进程,不影响系统和常用软件进程。第二采集层面纯异步化,采集数据后第一时间旁路,尽可能降低对原进程的影响。
(腾讯安全EDR和在系统中的设计原则)
架构只是稳定性和兼容性影响的一环,如何采集和执行策略逻辑也会对结果产生关键影响。逻辑的错误或者不适当也会造成一些系统性能层面的影响,比如CPU持续高起,导致系统使用上的不流畅等问题。
腾讯安全EDR在采集策略层面,使用的是基于行为可疑度过滤方案,即在终端架构中内置了腾讯自研的行为链关联引擎,能够将终端上发生的多个同源行为串成一个执行链。通过对完整的同源执行链进行可疑度判定,依据执行链的来源渠道、文件的云鉴定信息、文件的签名信息,以及是否关联脚本、压缩包信息等等加强判断的准确度。
(腾讯安全EDR的智能采集路径与决策)
五、安全行业警钟长鸣
水能载舟亦能覆舟,这场影响全球的IT故障,也给安全行业敲响了警钟:安全软件的基石是与恶意程序对抗。当安全厂商肩负着安全这一至高责任的时候,每一位用户的使用体验才是基石下的土壤。如果盲目追求技术的极致而忽略了体验,那么下一次IT事故的倒计时就会再度开始。