是啥阻止了用户应用程序能够“劫持”到内核模式?
Posted
技术标签:
【中文标题】是啥阻止了用户应用程序能够“劫持”到内核模式?【英文标题】:What prevents an user application from being able to "hijack" into kernel mode?是什么阻止了用户应用程序能够“劫持”到内核模式? 【发布时间】:2021-09-15 05:12:57 【问题描述】:据我了解。内核模式是一种硬件功能。前任。它可以通过寄存器设置(value1 -> 内核模式,value2 -> 用户模式)。
当内核加载并运行用户应用程序时,用户应用程序应通过系统调用与内核通信以执行特权操作,在此期间会发生中断,执行将切换到内核模式并执行特权操作。
我的问题是:
防止恶意用户应用程序设置“模式”寄存器并进入内核模式(例如 x86)的机制是什么? 只有内核才能设置这个寄存器是有道理的,我想知道更多关于这是如何执行的细节。
【问题讨论】:
“只有内核才能设置这个寄存器是有道理的”——正是如此。任何架构(具有用户/内核分离)都阻止非特权代码修改“模式”寄存器。 “我想知道更多关于如何执行的细节。” - 只需采用特定架构并阅读其寄存器模型和指令集的文档。 “只需采用特定架构并阅读其寄存器模型和指令集的文档”。谢谢,这就是我要找的。我读了一些教科书,但没有一个包含这样的信息 处理器/MMU 的用户手册和汇编手册。 【参考方案1】:我不知道这是如何在硬件本身中实施的。它还取决于架构。在 x86 的软件中,这取决于,因为有几个入口点。当 CPU 启动时,它处于内核模式。它可以执行每条指令,并在主存中随心所欲。
因此,内核将利用这一点在启动期间在启动任何用户模式进程之前设置页表和中断处理程序。
在 x86 上,内核模式与用户模式由页表强制执行。如果用户模式进程尝试访问设置为内核模式的页面,它将触发错误并在内核模式下调用中断处理程序。内核将因此终止该进程。
中断并不是内核的入口点。如果发生错误,它们仍然可以存在,但是用户模式进程将不知道,并且有时会终止该进程(如果内核决定应该这样做)。
在 x86 上,内核的真正入口点是 LSTAR MSR 寄存器。该寄存器只能从内核模式设置。它可以与汇编中的syscall
指令一起使用,以跳转到寄存器中指定的地址。除非使用 syscall 指令,否则用户模式进程不能跳转到内核中。因此,它允许内核为用户模式设置一些称为系统调用的服务。
【讨论】:
以上是关于是啥阻止了用户应用程序能够“劫持”到内核模式?的主要内容,如果未能解决你的问题,请参考以下文章