操作系统/虚拟化安全KA:保护环和低端设备和物联网环(环0)是最特权的,外环是最不特权的[41]。因此,不受信任的用户进程在外环中执行,而直接与硬件交互的受信任和特权内核在环0中执行,而其他环可用于或多或少的特权系统进程。保护环通常在硬件中得到支持,这是当今大多数通用处理器都提供的功能,尽管保护环的数量可能会有所不同。例如,Honeywell6180最多支持八个环,Intel的x86四个,ARMv7三个(加上一个额外的用于TrustZone)和PowerPC两个。但是,正如我们将看到的,这个故事变得有点混乱,因为一些现代处理器还引入了更多不同的处理器模式。现在,我们只观察到大多数传统操作系统只使用两个环:一个用于操作系统,一个用于用户进程。每当特权较低的代码需要一个需要更多特权的函数时,它就会“调用”较低的循环以请求将该函数作为服务执行。因此,只有受信任的特权代码才能执行最敏感的指令或操作最敏感的数据。除非特权较低的进程诱使特权较高的代码做一些它不应该做的事情(作为混淆的助手),否则环会提供强大的保护。Multics最初的想法是,环之间的转换将通过执行严格控制和调解的特殊调用门来进行。例如,外循环中的代码不能只调用内循环中的任何指令,而只会审查对预定义入口点的第一次调用,以查看它及其参数是否违反任何安全策略。虽然像x86这样的处理器仍然支持调用门,但很少有操作系统使用它们,因为它们相对较慢。相反,用户进程通过执行由操作系统处理的软件中断(“陷阱”)或更常见的特殊高效操作来过渡到操作系统内核(“系统调用”)。系统调用指令(名称如SYSCALL、SYSENTER、SVC、SCALL等,具体取决于体系结构)。许多操作系统将系统调用的参数放在一组预定义的寄存器中。与调用门一样,陷阱和系统调用指令也确保在操作系统中的预定义地址处继续执行,代码在该地址检查参数,然后调用适当的系统调用函数。除了用户进程调用操作系统外,大多数操作系统还允许内核调用用户进程。例如,基于UNIX的系统支持操作系统用来通知用户程序“有趣的事情”的信号:错误、超时定时器、中断、来自另一工艺的消息等。如果用户进程为信号注册一个处理程序,则operation系统会停止当前进程的执行,将其所有的处理器状态存储在进程栈中,形成所谓的信号。帧,并在信号处理程序上继续执行。当信号处理程序返回时,进程执行sigreturn系统调用,导致操作系统接管,在堆栈上恢复处理器状态,并继续执行进程。安全域(例如操作系统内核和用户空间进程)之间的边界是检查是否违反系统调用本身及其安全参数的好地方。例如,在基于能力的操作系统中,内核将验证能力,而在像MINIX3这样的操作系统中,只允许来自特定进程的特定调用,因此任何不在预先批准列表上的调用尝试都会被标记为违规。同样,基于Windows和UNIX的操作系统必须检查许多系统调用的参数。例如,考虑常见的读写系统调用,用户通过这些调用分别请求将数据从文件或套接字读入缓冲区,或从缓冲区读入文件或套接字。在执行此操作之前,操作系统应检查要写入或读取的内存是否确实由进程拥有。执行系统调用后,操作系统将控制权交还给进程。在这里,操作系统也必须注意不要返回危及系统安全的结果。例如,如果一个进程使用mmap系统调用请求操作系统将更多内存映射到它的地址空间,操作系统应该确保它返回的内存页面不再包含来自另一个进程的敏感数据(例如,首先映射每个字节被零初始化)。零初始化问题可能非常微妙。例如,编译器经常在数据结构中引入填充字节以进行对齐。由于这些填充字节在编程语言级别根本不可见,因此编译器可能认为没有理由将它们初始化为零。但是,当操作系统响应系统调用返回此类数据结构并且单元格填充包含来自内核或其他进程的敏感数据时,就会发生安全违规。顺便说一句,即使是我们前面提到的UNIX系统中的信令子系统也是一个有趣的安全案例。回想一下,sigreturn获取堆栈上的任何处理器状态并恢复该状态。现在假设攻击者能够破坏进程的堆栈并在堆栈上存储虚假信号帧。如果攻击者也能够触发sigreturn,他们可以一举设置整个处理器状态(包括所有寄存器值)。这样做为熟练的攻击者提供了一个强大的原语,称为面向Sigreturn的编程(SROP)。如前所述,如今关于保护环的情况有点令人困惑,因为最近的CPU为管理程序提供了虚拟化指令,允许它们控制环0上的硬件访问。为此,他们在环0上添加了乍一看像是一个额外的环底部。由于在x86处理器上,术语“ring0”已成为“操作系统内核”(以及“ring”与“用户进程”)的同义词,因此这个新的管理程序环通常称为“ring-1”。它还指示各自VM中的操作系统,它们可以继续在本地执行ring0指令。然而,严格来说,它的用途与原来的戒指完全不同,虽然Ring-1这个名字沿用至今,但似乎有点用词不当。为了完整起见,我们应该提到事情会变得更复杂,因为一些现代处理器仍然有其他模式。例如,x86提供所谓的系统管理模式(SMM)。当系统启动时,固件控制硬件并准备系统以供操作系统接管。但是,启用SMM后,固件会在将特定中断发送到CPU时重新获得控制权。例如,固件可以指示它希望在按下电源按钮时接收中断。在这种情况下,常规执行停止,固件接管。例如,它可以保存处理器状态,做任何需要做的事情,然后恢复操作系统以便有序关机。在某种程度上,SMM有时被视为低于另一个环(ring-2)的级别。最后,英特尔甚至以英特尔管理引擎(ME)的形式添加了Ring-3。ME是一个完全自主的系统,现在几乎存在于英特尔的所有芯片组中;它在单独的微处理器上运行一个秘密且完全独立的固件,并且始终处于活动状态:在启动期间,机器运行时,甚至在电源关闭时处于睡眠状态时。只要计算机连接到电源,它就可以通过网络与ME通信,例如安装更新。虽然非常强大,但它的功能在很大程度上是未知的,除了它运行自己的小型操作系统11,研究人员发现该系统包含漏洞。附加到主CPU的附加处理器(无论是ME还是相关处理器,如Apple的T2和Google的Titan芯片)提出了一个有趣的观点:运行在主CPU上的操作系统是否能够满足当今的安全要求?至少,趋势似乎是通过专门的系统(硬件和软件)来增强其安全性。低端设备和物联网上面描述的许多功能都可以在大多数通用处理器架构中找到。然而,在物联网或一般嵌入式系统中不一定如此,通常使用自定义操作系统。简单的微控制器通常没有MMU,有时甚至没有MPU、保护环或我们在普通操作系统中依赖的任何高级功能。系统通常很小(减少攻击面),应用程序是可信的(并且可能经过身份验证)。然而,设备的嵌入式特性使得检查甚至测试它们的安全性变得困难,并且无论它们在安全敏感活动中发挥什么作用,安全隔离/遏制和调解的手段都应该由环境从外部强制执行。更广泛的物联网问题在网络物理系统安全CyBOK知识领域得到解决。
