据我所知,当我们要访问堆栈段时,描述符的 DPL 应该等于
最大(RPL,CPL)
其中 RPL 是 SS 段寄存器,CPL 表示当前特权级别。
那么我们可以通过使用 RPL 削弱 CPL 来访问弱势堆栈吗?例如,对于 SS 段寄存器,CPL=0、RPL=3。所以我们应该能够访问 PL 3 的堆栈。是真的吗?
不。
英特尔 SDM 的第 5.7 节很明确
当 SS 寄存器加载了堆栈段的段选择器时,也会发生特权级别检查。
这里所有与堆栈段相关的权限级别都必须与 CPL 匹配;即堆栈段选择符的 CPL、RPL 和堆栈段描述符的 DPL 必须相同。如果 RPL 和 DPL 不等于 CPL,则会生成一般保护异常 (#GP)。
基本原理是,出于安全原因,特权代码不能与非特权代码共享堆栈 - 每个特权都有自己的堆栈,如 TSS 中定义的那样。
您可以使用数据段寄存器(例如通过ds
)访问堆栈,在这种情况下,必须具有max(CPL, RPL) <= DPL(弱化的 CPL 仍然具有与段的 DPL 更多或同等的特权)。