【发布时间】:2018-12-26 16:15:53
【问题描述】:
当某些内核代码(环 0)对用户代码(环 3)例程进行“调用”时,我找不到任何有关标准 CPU(即:x86)真正发生的具体信息。
1) 执行该例程时,CPU 模式状态变为用户模式?
2) 在用户级例程执行最后的“ret”指令后,由于试图返回内核空间代码而引发异常?
【问题讨论】:
标签: x86 cpu-architecture osdev kernel-mode
当某些内核代码(环 0)对用户代码(环 3)例程进行“调用”时,我找不到任何有关标准 CPU(即:x86)真正发生的具体信息。
1) 执行该例程时,CPU 模式状态变为用户模式?
2) 在用户级例程执行最后的“ret”指令后,由于试图返回内核空间代码而引发异常?
【问题讨论】:
标签: x86 cpu-architecture osdev kernel-mode
calls 只能提升权限,rets 只能降低权限。
英特尔手册 3A 的第 5 章将提供完整的详细信息。
如果内核对用户模式段执行远调用,则会引发#GP,它可能会导致系统崩溃/错误检查。
如果呼叫接近特权,则保持不变;假设一个平面模型和一个映射目标,这是a common attack vector for privilege escalation。
如果应用程序尝试对更高特权的段执行ret,则会引发#GP。
【讨论】:
您使用内核中的iret 返回用户空间。
系统调用和中断运行内核代码;在普通操作系统中,内核不会call far 降低特权级别。
是的,我认为ret far 将无法将权限级别从环 1..3 提升回环 0。
【讨论】: