zhifei · 2019年08月26日

Memory Tagging Extension (MTE) 简介(一)

几十年来,内存安全一直都是芯片或者产品安全缺陷的主要来源之一。随着软件工程的进步和发展,软件供应商对于安全缺陷的统计日益完善。在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的白皮书

文件名 大小 下载次数 操作
Arm_Memory_Tagging_Extension_Whitepaper.pdf 661.82KB 32 下载
推荐阅读
关注数
4569
内容数
187
Arm发布的PSA旨在为物联网安全提供一套全面的安全指导方针,使从芯片制造商到设备开发商等价值链中的每位成员都能成功实现安全运行。
目录
极术微信服务号
关注极术微信号
实时接收点赞提醒和评论通知
安谋科技学堂公众号
关注安谋科技学堂
实时获取安谋科技及 Arm 教学资源
安谋科技招聘公众号
关注安谋科技招聘
实时获取安谋科技中国职位信息