【问题标题】:Privilege level checking when accessing code segment访问代码段时的权限级别检查
【发布时间】:2015-09-13 12:13:38
【问题描述】:

我正在尝试了解有关 intel x86 架构的一些细节。我还没有真正理解调用门机制,但是没有它, 对于访问不符合要求的代码段,它的 DPL 必须等于 CPL。

我明白这在 DPL CPL 的情况下是禁止的?我的意思是如果我们想保持相同的权限级别,CPL 可以在跳转后保持不变,如果我们想降低我们的权限,我们可以使用 RPL。

【问题讨论】:

    标签: x86 intel memory-segmentation privilege


    【解决方案1】:

    作为一般规则,当您直接访问代码段时,您只能对具有相同权限的段执行此操作。
    这就是不合格代码段 (NCCS) 的用途。
    Intel 也有利于引入一致性代码段 (CCS),它可以被 低权限 应用程序访问(以防内核需要在不提升调用者权限的情况下共享一些代码)。

    直接访问代码段永远不要改变当前权限,目标代码的CPL就是调用者的CPL。

    RPL 也没有任何作用。对于 CCS,它会被忽略,并且必须小于或等于 NCCS 的调用者 CPL(这可能是一个副作用)。

    规则是:

    NCCS
    1.调用者CPL必须等于描述符DPL(相同权限) 2. 目标代码将以等于调用者 CPL 的 CPL 运行,而不管选择器中使用的 RPL。 3. 选择器 RPL 必须小于或等于调用者 CPL。

    CCS
    1.调用者CPL必须大于或等于描述符DPL(较少特权) 2. 目标代码将以等于调用者 CPL 的 CPL 运行,而不管选择器中使用的 RPL。

    如您所见,直接访问代码段不会更改 CPL(也没有堆栈更改)。

    为了更改特权 (CPL),英特尔引入了 Call Gates。使用 CG 和使用数据段一样,RPL 可以让您模拟一个特权较少的程序。
    如果 CG 为 DPL=2(并且目标选择器也具有 DPL>=2)并且您的代码具有 CPL=0,则您可以选择以 CPL=3 的用户模式应用程序执行调用(因此无法获得访问权限)或作为 CPL=2 的内核组件(获得访问权限但无法调用其他更多特权代码段)。

    【讨论】:

      猜你喜欢
      • 2020-11-26
      • 1970-01-01
      • 2014-07-19
      • 2018-01-09
      • 1970-01-01
      • 2017-12-10
      • 1970-01-01
      • 2021-10-20
      • 1970-01-01
      相关资源
      最近更新 更多