今天我第一次遇到LDTR ARMv8指令。
我在ARMv8 DB手册的第C3.2.5节“加载/存储无特权”中阅读了它的说明,据我了解,它基本上允许EL1进行具有EL0限制的内存访问。
此功能的应用程序是什么?
这是否使我们更难于使用内核错误创建使内核将数据写入错误地址的攻击?
考虑到通常同时运行多个进程,LDTR如何知道要使用的页表转换?还是这些限制引用了与页表上指定的权限无关的其他类型的权限?
答案 0 :(得分:2)
此链接为您提供了一个用例示例:https://developer.arm.com/documentation/102376/0100/Permissions-attributes
<块引用>[...] 管理程序可以查看分配给虚拟机的所有资源。这是因为在更高的异常级别执行意味着权限级别也更高。
然而,这并不总是可取的。恶意应用程序可能会试图欺骗操作系统代表应用程序访问数据,而应用程序不应该看到这些数据。这需要操作系统检查系统调用中的指针。
Arm 架构提供了多个控件来简化此操作。首先,有 PSTATE.PAN(从不特权访问)位。当该位被设置时,从 EL1(或当 E2H==1 时的 EL2)到非特权区域的加载和存储将产生一个异常(权限错误)[...]
有时操作系统确实需要访问非特权区域,例如,写入应用程序拥有的缓冲区。为了支持这一点,指令集提供了 LDTR 和 STTR 指令。
LDTR 和 STTR 是非特权加载和存储。即使由 EL1 或 EL2 的操作系统执行,它们也会根据 EL0 权限检查进行检查。因为这些是明确的非特权访问,所以它们不会被 PAN [...]
这允许操作系统区分旨在访问特权数据的访问和预期访问非特权数据的访问。这也允许硬件使用该信息来检查访问。