21 - 特权级与内核安全示例

---- 整理自狄泰软件唐佐林老师课程

查看所有文章链接:(更新中)深入浅出操作系统 - 目录

1. 问题

  • 既然通常情况下选择子的RPL与对应描述符中的DPL相同,那么是否可以取缔RPL?
  • 答:RPL是保证内核数据安全的关键要素之一

用户程序想要访问获取操作系统内核中的私密数据:

在这里插入图片描述

  • 用户程序只要探测到内核函数所对应的选择子和偏移量,即可通过 调用门 进行调用,进而获取内核私密数据。

2. 编程实验:内核私密数据的获取

偷取内核数据:

【参看链接】:21 - 特权级与内核安全示例 / 21 / 00

在这里插入图片描述

在这里插入图片描述

3. 解决方案

3.1 初步解决方案

  • 获取段寄存器中RPL的值
  • 判断RPL的值是否为SA_RPL0
    • true:检查通过,可继续访问数据
    • false:特权级较低,触发异常

代码流程:

在这里插入图片描述

  • 小技巧:通过下标为0的描述符触发异常

在这里插入图片描述

编程实验:

【参看链接】:21 - 特权级与内核安全示例 / 21 / 01

在这里插入图片描述
在这里插入图片描述

3.2 上述的初步解决方案的问题

用户程序还是可以通过 “伪造” 选择子中的RPL值,从而绕开安全检查的机制(checkPRL)

3.3 最终解决方案

  • 解决思路:追踪真实的请求者
    1. 在栈中获取函数远调用前CS寄存器的值(请求者)
    2. 从之前CS寄存器的值中获取RPL_cr(请求者特权级)
    3. 用RPL_cr更新到数据缓冲区对应的段寄存器中
    4. 使用CheckRPL对段寄存器进行安全检查

在这里插入图片描述

编程实验:

【参看链接】:21 - 特权级与内核安全示例 / 21 / 02

在这里插入图片描述

3.4 小结

  • RPL是保证内核数据安全的关键要素之一
  • 内核代码可通过追踪真实请求者特权级判断操作合法性
  • 但凡进行函数远调用,真实请求者的选择子就会存储于栈中
  • 通过提取真实特权级(RPL)能够保证内核数据安全
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

uuxiang

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值