操作系统/虚拟化安全知识域:用于内存保护的现代硬件扩展
发布时间:2023-02-22 13:28:54 所属栏目:安全 来源:
导读:另外,尽管部分分段已经几乎不存在了,但除了分段之外,还有许多其他形式的硬件支持用于内存保护。例如,许多机器都支持缓冲区边界检查,有些可以追溯到四分之一世纪或更长时间。但是,为了说明相应的基源,我们将看看
另外,尽管部分分段已经几乎不存在了,但除了分段之外,还有许多其他形式的硬件支持用于内存保护。例如,许多机器都支持缓冲区边界检查,有些可以追溯到四分之一世纪或更长时间。但是,为了说明相应的基源,我们将看看现代通用处理器中可用的内容,主要关注英特尔x86家族。这里的重点不是我们认为这个处理器更重要,甚至不是功能X或Y在未来会非常重要(这是有争议的和很难预测),而是说明这仍然是当今硬件开发的一个非常活跃的领域。 作为第一个示例,考虑一下有点命运多舛的英特尔内存保护扩展(MPX),它增强了英特尔的主力处理器,以确保阵列指针不会偏离阵列边界(阻止缓冲区溢出等漏洞被利用)。为此,一小组新寄存器可以存储少量数组的下限和上限,而在取消引用指针之前,新的MPX指令检查数组指针的值是否存在边界冲突。即使在仅在用户空间中使用MPX的系统中,操作系统也起着作用,例如,处理硬件在遇到缓冲区边界时引发的异常违反。MPX因这些边界寄存器太少而受到严厉批评,导致性能开销很大。此外,MPX不支持多线程,这可能会导致旧代码中的数据竞争。有人可能会说,MPX是硬件供应商尝试为CPU添加新内存安全功能的一个很好的例子,不幸的是,这并不总是成功的。 最近,英特尔在其处理器9中添加了内存保护密钥(MPK)。英特尔MPK允许将PTE(图2)中以前未使用的四个位设置为16个“键”值之一。此外,它还添加了一个新的32位寄存器,每个密钥包含2位,以指示是否允许使用该密钥标记的页面进行读写。MPK允许开发人员在少量(在本例中为16个)保护域中对内存进行分区,例如,仅允许特定的加密库访问加密钥匙。虽然非特权用户进程可能会更新寄存器的值,但只有使用了特权操作系统代码服务器才能不间断地使用不同密钥标记不同的内存页。 一些处理器设计支持更高级的内存保护,使用ARM术语,我们将称为内存标记扩展(MTE10)。这个想法简单而强大。处理器为每个对齐的内存块(其中块是16字节)分配一个硬件中的所谓“标签”。同样,每个指针也会获取一个标记。标签通常不是很大,比如4位,所以它们可以存储在64位指针值的最顶端字节中,反正我们并不真正使用(事实上,ARM支持顶字节忽略功能,使硬件显式屏蔽最上面的字节)。每当程序分配N个字节的内存时,分配器都会将分配四舍五入为16个字节的倍数,并为其分配一个随机标记。它还将相同的标记分配给指向内存的指针。从现在开始,仅当指针中的标记与其引用的内存的标记匹配时,才允许取消引用指针,从而有效地阻止大多数空间和时间内存错误。这样做的好处是,可以避免在不必要的地方浪费内存。例如,如果一个内存中有多个引用,那么只有一个引用可以被删除。 (编辑:银川站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
站长推荐