据我了解,MTE 使用了 ARM 的 TBI(最高位忽略)功能,因此虚拟内存地址中的前 4 位中的一些用于携带内存分配的标记。
但是我很好奇 MTE 如何捕捉到这一点:
u8 arr[17];
arr[18] = 1;
arr
要求分配17字节,但MTE是16字节颗粒,所以32字节会得到相同的标签。
所以如果我访问
arr[18]
,我认为标签应该仍然是相同的,所以MTE将无法捕获这个,这是正确的吗?
只有当我访问
arr[32:]
时,MTE才能捕获此信息。
我不确定这是否正确,或者我是否遗漏了一些东西..
最重要的是,操作系统通常会以页粒度分配内存,我不确定这是否会影响任何事情..
是的,你是对的。
MTE 是一个帮助者,而不是一个确定的答案。它无法捕获同一颗粒内的溢出物。
如果攻击者对程序有足够的控制权,它也可能容易受到标签重用的影响。堆喷射和堆按摩是众所周知的技术,虽然变得更加困难,但并非不可能与 MTE 一起使用。
但是,关于操作系统按页面大小分配内存的部分虽然正确,但并不相关。操作系统返回页面,是的,但是分配器(即
malloc
)通过返回子页面大小的块来管理此空间。分配器的重点是有效地使用操作系统返回的页面(否则您最终将为每个分配调用系统调用并浪费几乎所有内存)。stg
这样的指令可以在用户空间中访问)。