【问题标题】:Ring level shift in Win NT based OS基于 Win NT 的操作系统中的环形电平转换
【发布时间】:2012-02-28 15:55:58
【问题描述】:

谁能告诉我 Windows 操作系统的权限变化。

我知道用户模式代码 (RL:3) 将参数传递给 API。

这些 API 调用内核代码 (RL:1)。

但现在我想知道,在安全性(RPL)检查期间,这些 RL3 API 和 RL1 Kernel API 之间是否有一些令牌交换。

如果我错了,请让我知道(通过一些链接或简要说明)它是如何工作的。

如果它离题、冒犯或重复,请随时关闭此线程。

RL= 振铃级别

RPL:请求的权限级别

【问题讨论】:

    标签: winapi x86


    【解决方案1】:

    中断处理程序和syscall 指令(这是一个优化的软件中断)自动修改特权级别(这是一个硬件功能,你提到的环 0 与环 3 的区别)以及替换其他处理器状态(指令指针,堆栈指针等)。之前的状态当然会被保存下来,以便在中断完成后恢复。

    内核代码必须非常小心,不要相信来自用户模式的输入。处理此问题的一种方法是不要让用户模式传递将在内核模式中取消引用的指针,而是在内核模式内存中的表中查找的 HANDLE,用户模式无法在全部。能力信息存储在 HANDLE 表和相关的内核数据结构中,这就是 WriteFile 在打开文件对象以进行只读访问时知道失败的方式。

    任务切换器维护有关当前正在运行的进程的信息,以便执行安全检查的系统调用(例如CreateFile)可以检查当前进程的用户帐户并根据文件 ACL 对其进行验证。此进程 ID 和用户令牌再次存储在只有内核可以访问的内存中。

    MMU页表用于防止用户态修改内核内存——一般根本没有页映射;还有页访问位(读、写、执行),由 MMU 在硬件中强制执行。内核代码使用不同的页表,交换作为syscall 指令和/或中断激活的一部分发生。

    【讨论】:

    • 太好了,有没有可能其他程序模仿高权限程序??????
    • @Kislay:我已经回答过:“这个进程 ID 和用户令牌再次存储在内存中,只有内核可以访问。”只有内核模式代码可以绕过权限检查。 “特权升级”攻击涉及找到一个内核模式组件(可能是编写不佳的设备驱动程序),该组件不恰当地使用来自用户模式的数据,并且可以被说服在内核模式下执行代码或更改只有内核才能访问的数据。
    • 非常感谢...帮助很大... :)
    • 这些处理程序自动提升特权级别并不完全正确 - 它们这样做是因为定义此类行为的 CPU 状态(保护模式的 描述符表 i>) 已由操作系统以这样的方式设置,例如在中断时,在将执行分派给中断处理程序之前完成特权切换,因为该中断向量的 中断门 已经设置,因此 目标代码段一个特权代码段。这听起来像是挑剔,但实际上很重要 - 操作系统编写者必须明确表达权限切换的意图。
    • 澄清一下:是的,可能定义例如在用户模式下运行的中断处理程序;所需要的只是能够将中断门存储到目标代码段在环 3 中的 IDT 中。这种事情并不经常做,同意。
    猜你喜欢
    • 2011-03-03
    • 1970-01-01
    • 2015-09-05
    • 2020-05-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多