Memory Tagging Extension (MTE) 简介(一)

首发极术社区
作者:zhifei
如希望加入关于安全的Arm PSA专业技术交流群,请添加极术小姐姐(id:aijishu20)邀请进入,请备注知乎PSA及自己的专业方向,否则不予通过。

几十年来,内存安全一直都是芯片或者产品安全缺陷的主要来源之一。随着软件工程的进步和发展,软件供应商对于安全缺陷的统计日益完善。在2019年蓝帽 (BlueHat)大会上,微软的研究表明,在微软产品中百分之七十的安全问题来自于内存安全违例。谷歌的类似研究也表明,安卓移动产品中,超过百分之七十五的安全缺陷来自于内存安全违例。

为了缓解内存安全违例的威胁,过去也研发了一些相应的技术。比如ASAN 和 HWSAN。 然而,这些技术的部署将极大损害电池的寿命或者有比较高的性能代价。这导致此类技术难以被广泛使用和部署在产品中。

Armv8.5-A 架构新推出的内存标签扩展(Memory Tagging Extension, 后面简称为MTE), 尝试从芯片架构设计层面来解决这类内存安全违例的技术难题。MTE是一种能够兼顾性能和可扩展性的硬件设计方案,能够极大减少非安全软件编程语言中的内存安全违例数量,或者是减少此类内存安全违例被恶意利用的可能性。

那么是什么是内存安全违例呢?其主要分为两大类:空间局部安全性和时间局部安全性。MTE 不需要额外设备辅助就能检测出这两类内存安全违例。

空间局部安全性: 内存对象的访问超出了该内存对象所允许的最大有效范围。在下面的伪代码实例中, ptr指向一个 16 字节的内存对象,所允许的有效数组下标位 0 ~ 15。 ptr[17] 产生的内存访问将产生不可预期的结果。常见的堆栈溢出就是利用了此类方法。

char* ptr = new char[16];
ptr[17] = 0x30; // memory violation

时间局部安全性:当一个内存对象在它的有效作用域之外继续被访问会导致空间局部安全性,特别是当该内存对象已经被释放以后。在下面的伪代码例子中, 指针ptr继续被 memcpy() 所访问,就会导致一个难以检测的内存安全违例。

if (True)
{
char* ptr = malloc();
// operate the ptr
delete ptr; // end of ptr life cycle
}
memcpy(dst_mem, ptr, 0x10); // memory violation

MTE的作用
MTE的有益之处,在于它能够在内存被使用前和使用后进行内存安全缺陷的定位。MTE的设计目标,就是能快速监测内存安全违例从而提供软件代码的鲁棒性,以此来抵御恶意代码的攻击。MTE 对内存访问添加了一个锁和钥匙的机制。如果钥匙匹配上了,那么对应的锁可以被打开,相应的内存访问就是被允许的;否则该内存访问被记录下来或者以发生错误的形式上报。通过这个机制,过去难以被捕捉的内存安全错误能够被更容易的监测到,同时也有助于一般性的系统调试。
另一方面,具有MTE特性的在产品在被正式部署之前就能定位和消除安全缺陷,将极大减少产品代码中的被攻击面,从而增加了系统测试的有效性。

MTE的部署
当然,作为一个硬件设计方案,MTE 必然具有一定的硬件成本。相应的,MTE 被设计成在不同的产品阶段能够以不同的配置组合进行灵活部署的方式。用户可以在 MTE 的系统开销和内存安全监测精确性之间进行权衡,选择最灵活和可扩展性的设计方案。

进一步阅读,可以参考MTE的白皮书

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值