在英特尔微处理器中通过使用 RPL 削弱 CPL 来访问低权限堆栈
Accessing underprivileged stack by weakening the CPL with RPL in intel microprocessor
据我所知,当我们要访问一个栈段时,描述符的DPL应该等于
max(RPL,CPL)
其中RPL是SS段寄存器的,CPL是当前特权级。
那么我们可以通过用 RPL 削弱我们的 CPL 来访问一个弱势堆栈吗?
例如,对于SS段寄存器,CPL=0,RPL=3。所以我们应该可以访问PL 3的堆栈。是真的吗?
没有
英特尔 SDM 的第 5.7 节很清楚
Privilege level checking also occurs when the SS register is loaded with the segment selector for a stack segment.
Here all privilege levels related to the stack segment must match the CPL; that is, the CPL, the RPL of the stack segment selector, and the DPL of the stack-segment descriptor must be the same. If the RPL and DPL are not equal
to the CPL, a general-protection exception (#GP) is generated.
理由是出于安全原因,特权代码无法与非特权代码共享堆栈 - 每个特权都有自己的堆栈,如 TSS 中所定义。
您可以使用数据段寄存器访问堆栈(例如通过ds
),在这种情况下必须有max(CPL, RPL) <= DPL (弱化的 CPL 仍然比该段的 DPL 具有更多或同等的特权)。
据我所知,当我们要访问一个栈段时,描述符的DPL应该等于
max(RPL,CPL)
其中RPL是SS段寄存器的,CPL是当前特权级。
那么我们可以通过用 RPL 削弱我们的 CPL 来访问一个弱势堆栈吗? 例如,对于SS段寄存器,CPL=0,RPL=3。所以我们应该可以访问PL 3的堆栈。是真的吗?
没有
英特尔 SDM 的第 5.7 节很清楚
Privilege level checking also occurs when the SS register is loaded with the segment selector for a stack segment.
Here all privilege levels related to the stack segment must match the CPL; that is, the CPL, the RPL of the stack segment selector, and the DPL of the stack-segment descriptor must be the same. If the RPL and DPL are not equal to the CPL, a general-protection exception (#GP) is generated.
理由是出于安全原因,特权代码无法与非特权代码共享堆栈 - 每个特权都有自己的堆栈,如 TSS 中所定义。
您可以使用数据段寄存器访问堆栈(例如通过ds
),在这种情况下必须有max(CPL, RPL) <= DPL (弱化的 CPL 仍然比该段的 DPL 具有更多或同等的特权)。