负的CPU保护环
什么是CPU保护环?
在计算机科学中, 分级保护域(英语:hierarchical protection domains),经常被叫作保护环(Protection Rings),又称环型保护(Rings Protection)、CPU环(CPU Rings),简称Rings。这是一种用来在发生故障时保护数据和功能,提升容错度,避免恶意操作 ,提升计算机安全的设计方式。工作在不同Ring中的对象对资源有不同的访问级别。Rings是从最高特权级(通常对应最小的数字)到最低特权级(最大的数字)排列的。在大多数操作系统中,Ring 0拥有最高特权,并且可以和最多的硬件直接交互(比如CPU,内存),同时内层Ring可以随便使用外层Ring的资源。
(来自维基百科)
Rings的概念最早出现于x86保护模式的设计中。现在,这些Rings通常存储于段选择子和段描述符的特权级位置上。
Ring0-2为“管理员”层级,可以做大部分事情,但是Ring1-2不能使用特权指令——例如加载描述符表的LGDT
、LLDT
和加载任务寄存器的指令ltr
以及停机指令hlt
等等(Intel的初衷是让驱动存在于此Ring1-2,但现代操作系统通常将驱动也放在Ring0上)。
Ring3代表“用户模式”。如果你的当前特权级(CFL)或者请求特权级(RFL)在这个环上,那么你需要通过系统调用请求内核帮你完成一些资源利用操作,例如I/O读写。
综上,Rings的设计将用户程序和服务程序对资源的利用进行隔离。正确使用Rings可以提升资源使用的安全性。例如,某个间谍软件作为一个在Ring 3运行的用户程序,它在不通知用户的时候打开摄像头应该会被阻止,因为访问硬件需要使用被驱动程序保留的Ring 1的方法。
为什么会有负的保护环?
在现在的处理器中,大多有对虚拟化的硬件支持,例如Intel VT-x 和 AMD-V。在进行虚拟化之前,需要一些“高级管理员程序”初始化虚拟控制结构(这被称为VMCS),随后定义虚拟机并调用 vmenter
和处理 vmexit
进行虚拟化。而这些代码就工作在“Ring-1”层级。事实上,CPU并没有定义这种层级,但是考虑到每一个被虚拟化的内核都认为它们对系统有完全的控制权(Ring0),而它们又是被虚拟层所控制(对它们不可见),所以称其为“Ring-1”也是有道理的。
系统管理模式(SMM)是另一种执行特殊指令的操作模式。电脑主板上会有一些固件(例如BIOS)建立起SMM来处理系统管理中断,例如为了实现高级电源管理。当这些事件/中断发生后,操作系统(甚至是上面提到的虚拟层)都会被挂起,随后CPU进入一个特殊的地址空间处理中断。由于SMM对于操作系统和虚拟层都不可见,所以通常称其工作在“Ring-2”下。
有人可能记得去年有一个新闻:MINIX悄然成最流行系统:暗藏核弹级漏洞 。
Intel现代处理器都支持ME管理引擎,用来管理协调内部的诸多模块,尤其是传统芯片组整合进入之后,处理器已经差不多成了SoC(System on Chip)单芯片系统,更需要一个“协同总管CPU”,而MINIX就是这个微型CPU的操作系统。 AMD也有自己的协同处理器,称为PSP。这个CPU可以对芯片组做任何事情,即使是在系统通电但还没有启动的时候(甚至系统的启动也是它的管理范畴)。所以我们也称其工作在“Ring-3”下。
从安全的角度考虑,程序工作的Ring值越低,其行为的可见性也就越低。例如用户程序不会意识到自己是工作在一个“虚拟地址”中,而OS不会意识到自己只是多个被虚拟化出来的一个,而虚拟层不会意识到自己在工作过程中SMM已经完成了对一些中断的处理,而协同处理器对以上所有对象都是不可见的。可以想象,如果能够在Ring值更低的层级植入恶意程序,其被查杀的难度也会越高。
另外,以上说明基于x86架构,其他的架构CPU也有类似设计方式,例如ARM的user (3), supervisor (0), VMM (-1) 和TrustZone (-2)。
参考: