ARM的MTE如何防止off-by-one内存错误?

问题描述 投票:0回答:1

据我了解,MTE 使用了 ARM 的 TBI(最高位忽略)功能,因此虚拟内存地址中的前 4 位中的一些用于携带内存分配的标记。

但是我很好奇 MTE 如何捕捉到这一点:

u8 arr[17];
arr[18] = 1;

arr
要求分配17字节,但MTE是16字节颗粒,所以32字节会得到相同的标签。

所以如果我访问

arr[18]
,我认为标签应该仍然是相同的,所以MTE将无法捕获这个,这是正确的吗?

只有当我访问

arr[32:]
时,MTE才能捕获此信息。

我不确定这是否正确,或者我是否遗漏了一些东西..

最重要的是,操作系统通常会以页粒度分配内存,我不确定这是否会影响任何事情..

memory arm cpu-architecture
1个回答
0
投票

是的,你是对的。

MTE 是一个帮助者,而不是一个确定的答案。它无法捕获同一颗粒内的溢出物。

如果攻击者对程序有足够的控制权,它也可能容易受到标签重用的影响。堆喷射和堆按摩是众所周知的技术,虽然变得更加困难,但并非不可能与 MTE 一起使用。

但是,关于操作系统按页面大小分配内存的部分虽然正确,但并不相关。操作系统返回页面,是的,但是分配器(即

malloc
)通过返回子页面大小的块来管理此空间。分配器的重点是有效地使用操作系统返回的页面(否则您最终将为每个分配调用系统调用并浪费几乎所有内存)。
分配器为内存着色,而不是操作系统(事实上,像
stg
这样的指令可以在用户空间中访问)。

© www.soinside.com 2019 - 2024. All rights reserved.