1.MTE概念
MTE(内存标记扩展)是ARM v8.5-A新增的一项缓解内存安全的机制。在Android Linux现有的安全机制中,类似的机制有ASAN、HWSAN。但两者因为性能开销代价高昂,不适用于广泛部署(仅调试使用)。MTE当前带来了一种高性能、可扩展的硬件解决方案,可降低以不安全语言编写的代码中可能存在的内存安全违规风险。
注:MTE不仅可用在研发自测、内存问题调试,也可以用于Fuzz。
2.MTE支持条件
ARM解释: v8.5及以上
Qcom平台解释:ARM v9(MSM8450)以上
Android解释:Android对MTE的支持将在2021年/2022年初发布带有MTE的芯片时完成。截至于2023年底,最新的旗舰设备(Pixel、OPPO)开发者选项中已具备MTE功能。
3.MTE的开关
内核层CONFIG_ARM64_MTE=y时开启,此Kconfig由平台根据环境自行控制,无需工程师手动开关。依赖情况如下:
1687config ARM64_MTE
1688 bool "Memory Tagging Extension support"
1689 default y
1690 depends on ARM64_AS_HAS_MTE && ARM64_TAGGED_ADDR_ABI
1691 depends on AS_HAS_ARMV8_5
1692 # Required for tag checking in the uaccess routines
1693 depends on ARM64_PAN
1694 depends on AS_HAS_LSE_ATOMICS
1695 select ARCH_USES_HIGH_VMA_FLAGS
1696 help
Google Play中也提供了APP(Sanitizer Test APP[外网,需要科学上网])可用于测试MTE,例如:
4.MTE检测目标
MTE认为内存安全违规主要分2种:空间安全、时间安全。
- 空间安全:
对象在真实边界之外被访问,例如溢出、越界等。可被利用来改变函数指针、保存寄存器等目标地址。
- 时间安全:
在对象引用的内存释放、过期后使用。例如UAF等,攻击者可以放置一个新的恶意对象来代替预期目标。