Memory Tagging Extension (MTE)
Last updated
Last updated
学习与实践 AWS 黑客技术:HackTricks Training AWS Red Team Expert (ARTE) 学习与实践 GCP 黑客技术:HackTricks Training GCP Red Team Expert (GRTE)
内存标记扩展 (MTE) 旨在通过 检测和防止与内存相关的错误 来增强软件的可靠性和安全性,例如缓冲区溢出和使用后释放漏洞。MTE 作为 ARM 架构的一部分,提供了一种机制,将 小标签附加到每个内存分配 上,并为引用该内存的 每个指针分配一个相应的标签。这种方法允许在运行时检测非法内存访问,显著降低利用此类漏洞执行任意代码的风险。
MTE 通过 将内存划分为小的固定大小块,每个块分配一个标签 来操作,通常标签大小为几位。
当创建一个指针指向该内存时,它会获得相同的标签。该标签存储在 内存指针的未使用位中,有效地将指针与其对应的内存块链接起来。
当程序通过指针访问内存时,MTE 硬件检查 指针的标签是否与内存块的标签匹配。如果标签 不匹配,则表示 非法内存访问。
指针中的标签存储在顶部字节的 4 位中:
因此,这允许最多 16 种不同的标签值。
每 16B 的物理内存 都有一个相应的 内存标签。
内存标签存储在 专用 RAM 区域(正常使用不可访问)。每 16B 内存标签有 4 位标签,最多占用 3% 的 RAM。
ARM 引入了以下指令来操作这些专用 RAM 内存中的标签:
CPU 在 指令执行期间 检查标签,如果存在不匹配,则会引发异常。 这是最慢且最安全的模式。
CPU 异步 检查标签,当发现不匹配时,它会在系统寄存器中的一个寄存器中设置异常位。它比前一种模式 更快,但 无法指出 导致不匹配的确切指令,并且不会立即引发异常,给攻击者一些时间来完成攻击。
???
称为硬件标签基础 KASAN、基于 MTE 的 KASAN 或内核中的 MTE。
内核分配器(如 kmalloc
)将 调用此模块,该模块将准备标签以使用(随机)附加到分配的内核空间和返回的指针。
请注意,它将 仅标记足够的内存粒度(每个 16B)以满足请求的大小。因此,如果请求的大小为 35,而给定的块为 60B,它将用此标签标记前 16*3 = 48B,其余部分将被 标记 为所谓的 无效标签 (0xE)。
标签 0xF 是 匹配所有指针。具有此指针的内存允许 使用任何标签 访问其内存(没有不匹配)。如果在被攻击的内存中使用此标签,可能会阻止 MET 检测到攻击。
因此,只有 14 个值 可以用于生成标签,因为 0xE 和 0xF 是保留的,这使得 重用标签 的概率为 1/17 -> 大约 7%。
如果内核访问 无效标签粒度,将会 检测到不匹配。如果它访问另一个内存位置,如果 内存有不同的标签(或无效标签),将会 检测到不匹配。如果攻击者运气好,内存使用相同的标签,则不会被检测到。几率大约为 7%。
另一个错误发生在分配内存的 最后粒度。如果应用程序请求 35B,则给定的粒度为 32 到 48。因此,从 36 到 47 的字节使用相同的标签,但它们并未被请求。如果攻击者访问 这些额外字节,将不会被检测到。
当 kfree()
被执行时,内存会被重新标记为无效内存标签,因此在 使用后释放 的情况下,当再次访问内存时,将会 检测到不匹配。
然而,在使用后释放的情况下,如果同一 块再次分配并使用与之前相同的标签,攻击者将能够利用此访问,并且不会被检测到(大约 7% 的机会)。
此外,只有 slab
和 page_alloc
使用标记内存,但在未来,这也将用于 vmalloc
、stack
和 globals
(在视频时,这些仍然可以被滥用)。
当 检测到不匹配 时,内核将 崩溃 以防止进一步的利用和攻击重试(MTE 没有误报)。
学习与实践 AWS 黑客技术:HackTricks 培训 AWS 红队专家 (ARTE) 学习与实践 GCP 黑客技术: HackTricks 培训 GCP 红队专家 (GRTE)