【问题标题】:Can RPL be different from DPL on x86 machines?RPL 可以不同于 x86 机器上的 DPL 吗?
【发布时间】:2013-01-05 01:58:25
【问题描述】:

我正在阅读关于 x86 分段保护的blog post。 RPL 可以与 DPL 不同吗?如果可以,它的用例是什么?

【问题讨论】:

    标签: x86 memory-segmentation


    【解决方案1】:

    它们可以不同,这是故意的。

    这个想法是,当操作系统/内核代表用户代码执行某些操作时,它可以使用用户代码的权限访问内存(RPL 将反映,Requestor Privilege Level,用户代码的级别)。如果它们不足,则异常使操作失败。如果这种(或类似的)机制不存在,用户代码可能会通过以某种方式请求代表其执行的操作来破坏操作系统/内核,并且该操作将由内核以其内核权限执行。这就是你得到EOP的地方。

    有关分段的更多信息,请访问源代码,即英特尔的 CPU 手册。都在那里。

    【讨论】:

    • 您能否通过在 ring 0 中使用内核代码和 ring 3 中的用户代码指定 CPL、RPL 和 DPL 值来使您的示例更具体。
    • DPL 是内核正在访问的段的描述符中的任何内容(例如,可能是内核(通常为 0)或用户(3))。内核的 CPL 为 0(几乎总是)。用于访问段的段选择器中的 RPL 是请求者的级别。如果请求者是用户,则为 3。如果请求者是内核,则通常为 0。
    • 所以在你的例子中 max(CPL, RPL) = 0 并且 DPL 可以是 0 或 3。所以,内核可以访问它想要的任何数据段。但是您是说内核在代表另一个用户执行代码时使用 3 的 RPL,以避免意外更改其他用户代码中的某些内容。但是,如果我设置 RPL = 3,我就不能数据属于内核的段(它将具有 DPL 0)。我很困惑
    • 在我的示例中,max(CPL, RPL) 为 0(当请求者也是内核代码时)或 3(当请求者是用户代码时)。这就是重点,用户代码不应该直接或间接地读取或写入内核数据。保护!
    • 谢谢 alexey !!..你描述的方式比英特尔手册中写的更好,更容易理解。
    猜你喜欢
    • 2016-08-05
    • 2019-08-25
    • 2019-01-28
    • 1970-01-01
    • 2015-12-07
    • 2016-01-14
    • 1970-01-01
    • 2015-05-24
    • 1970-01-01
    相关资源
    最近更新 更多