【问题标题】:Processor behavior when jumping between Rings在环之间跳转时的处理器行为
【发布时间】:2018-12-26 16:15:53
【问题描述】:

当某些内核代码(环 0)对用户代码(环 3)例程进行“调用”时,我找不到任何有关标准 CPU(即:x86)真正发生的具体信息。

1) 执行该例程时,CPU 模式状态变为用户模式?

2) 在用户级例程执行最后的“ret”指令后,由于试图返回内核空间代码而引发异常?

【问题讨论】:

    标签: x86 cpu-architecture osdev kernel-mode


    【解决方案1】:

    calls 只能提升权限,rets 只能降低权限。
    英特尔手册 3A 的第 5 章将提供完整的详细信息。


    如果内核对用户模式段执行远调用,则会引发#GP,它可能会导致系统崩溃/错误检查。
    如果呼叫接近特权,则保持不变;假设一个平面模型和一个映射目标,这是a common attack vector for privilege escalation

    如果应用程序尝试对更高特权的段执行ret,则会引发#GP。

    【讨论】:

    • 我为我的基本知识道歉,但我不明白你的第二个“如果”解释。如果可能,请稍微解释一下。
    • @fante 关于近距离通话的那个? Near 调用不会更改段,因此权限不能根据定义更改(因为权限是段的属性)。当执行内核例程时,通常不知道当前在内存中映射了哪个用户模式应用程序,但在少数情况下,这与调用内核例程的应用程序相对应是已知的。如果内核可以被欺骗对存在用户模式例程的地址进行 near 调用,则该例程将以内核权限执行。该链接只是一个曾经著名的例子。
    【解决方案2】:

    您使用内核中的iret 返回用户空间。

    系统调用和中断运行内核代码;在普通操作系统中,内核不会call far 降低特权级别。

    是的,我认为ret far 将无法将权限级别从环 1..3 提升回环 0。

    【讨论】:

      猜你喜欢
      • 2010-10-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多