---- 整理自狄泰软件唐佐林老师课程
查看所有文章链接:(更新中)深入浅出操作系统 - 目录
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 最终解决方案
- 解决思路:追踪真实的请求者
- 在栈中获取函数远调用前CS寄存器的值(请求者)
- 从之前CS寄存器的值中获取RPL_cr(请求者特权级)
- 用RPL_cr更新到数据缓冲区对应的段寄存器中
- 使用CheckRPL对段寄存器进行安全检查
编程实验:
【参看链接】:21 - 特权级与内核安全示例 / 21 / 02
3.4 小结
- RPL是保证内核数据安全的关键要素之一
- 内核代码可通过追踪真实请求者特权级判断操作合法性
- 但凡进行函数远调用,真实请求者的选择子就会存储于栈中
- 通过提取真实特权级(RPL)能够保证内核数据安全