我正试图围绕“崩溃”展开我的头脑,但首先要理解它,我一直在尝试理解内存访问。
据我了解,CPU 尝试在转换后备缓冲区中查找虚拟地址,该地址指示 CPU 缓存中的数据。如果它在那里,我们立即获取它。如果没有,我们然后在页表中查找地址。
现在从我的阅读来看,每个进程都有自己的页表。但是,每个进程也将内核映射到它的页表中。
大概页表也有访问位,显然我们不能在 CPU 处于用户模式时允许直接读取内核空间(我认为这称为“ring-3”)。
根据我对页表的了解,这些访问位存储在地址的低位中。由于我们的页面条目是 4k,因此还有很多位用于存储访问位。
从我读到的关于漏洞利用的内容来看,问题是在检索数据后检查访问权限。这样做的原因是出于效率原因,我们希望快速将数据发送到 CPU,并且我们可以在进行任何永久性更改之前捕获权限错误。但不幸的是,我们通过使用定时攻击可以检测到的间接内存获取影响了 CPU 缓存。
如果页面查找成本低但访问检查成本高,则此方案可能有意义。但根据我的理解,情况似乎并非如此。
我读过 64 位机器上的页表至少有三层,这意味着至少有三个内存查找。希望这些在缓存中,但如果不是,则意味着递归搜索页表以查找它自己的页面。
在我们做完这一切工作,终于找到了页表项之后,当我们从页表中加载物理地址的时候,我们也加载了访问位。为什么不在那里检查呢?检查我们已经加载的访问位似乎比使用电路来处理它要简单得多。
我显然错过了关于 CPU 工作方式的一些信息,但我无法弄清楚是什么。我们必须进行页表查找才能确定要获取的内容,一旦我们遇到了麻烦,为什么不检查访问位呢?