0

我读到我们的系统中有一些特权指令可以在内核模式下执行。但我无法理解是谁让这些指令享有特权。是硬件制造商在模式位的帮助下将一些有害指令硬连接为特权,还是操作系统设计者使指令特权使它们仅在特权模式下工作。

4

1 回答 1

1

内核与用户模式,以及用户模式中不允许哪些指令,是 ISA 的一部分。这已经融入了硬件。

CPU 架构师通常非常清楚操作系统需要做什么,并希望阻止用户空间做这些事情,因此这些选择至少使特权级别成为可能,即使用户空间不可能简单地接管机器。


但这还不是全貌:在某些 ISA(例如 x86)上,后来的 ISA 扩展添加了控制寄存器标志位,让操作系统可以选择其他一些指令是否具有特权。在 x86 上,这些指令可能会泄漏有关内核 ASLR的信息,或者使时序侧通道更容易。

例如,rdpmc(读取性能监视器计数器)只有在内核特别启用时才能从用户空间使用。 rdtsc(Read TimeStamp Counter) 默认可以从用户空间读取,但是 CR4 中的 TSD (TimeStamp Disable) 标志可以将其使用限制为 priv 级别 0(内核模式)。阻止用户空间使用高分辨率时序是防御时序侧信道攻击的蛮力方法。

另一个 x86 扩展可防止内核地址泄露,使内核 ASLR 更加保密;CR4.UMIP(用户模式指令预防)禁用sgdt读取 GDT 虚拟地址的指令。 首先,这些指令对于用户空间基本上是无用的,而且不像rdtsc容易的那样总是可以被特权。

启用此扩展的 Linux 内核选项对其进行了描述

用户模式指令保护 (UMIP) 是较新的 Intel 处理器中的一项安全功能。如果启用,如果在用户模式下执行 SGDT、SLDT、SIDT、SMSW 或 STR 指令,则会发出一般保护故障。这些指令不必要地公开有关硬件状态的信息。

绝大多数应用程序不使用这些指令。对于极少数这样做的人,在受保护和虚拟 8086 模式下的特定情况下提供软件仿真。模拟结果是虚拟的。

为 IDT/GDT/LDT 设置新地址(例如lgdt/lidt)当然是特权指令;那些让你接管机器。但是在内核 ASLR 出现之前,没有任何理由阻止用户空间读取地址。它可能位于仅将其页表条目设置为内核的页面中,从而阻止用户空间对该地址执行任何操作。(......直到 Meltdown 使用户空间可以使用推测性侧通道从缓存中热的仅内核页面读取数据。)

于 2020-05-22T15:05:36.747 回答