ARM在2018年9月提出的内存安全概念,最终写入ARMv8.5体系结构。
MTE
MTE具有很强的地址访问完整性硬件级保护,预计访存开销在3%~5%,CPU开销小于1%。
- MTE当前仅对AARCH64
- 两类标签
- 内存标签,每对齐的16字节内存单元有一个4位的标签
- 指针标签,每个指针在最高字节处有一个4位标签
- 常规读写指令LD/ST对两类标签进行检查,如果不匹配就触发硬件异常
- 在AARCH64中新增加专门用于标签操作的指令
栈和堆的内存分配过程
分配
- 按照16字节对齐方式进行内存分配
- 随机选择4位的标签
- 将标签写入指针
- 将标签写入内存
释放
- 对释放的内存重新写入不同的标签
缓冲区溢出异常
按照上述过程申请安全内存,假设指针和内存的标签相同;如果内存访问越界,指针和内存的标签就会不匹配,触发异常。
释放后访问异常
按照上述过程申请安全内存,假设指针和内存的标签相同,正常访问结束后,释放该内存时将改写内存标签。在释放之后,指针的标签和内存已经不一样了,如果还使用该指针访问这段内存,指针和内存的标签就会不匹配,触发异常。
MTE指令
- 写指针标签
- IRG Xd, Xn
- ADDG Xd, Xn, #<immA>, #<immB>
- 写内存标签
- STG [Xn], #<imm>
- STGP Xa, Xb, [Xn], #<imm>