MTE 配置

MTE 可以在 Android 内核中以及 Android 系统的任何进程中独立启用。Google 不强制要求使用任何特定配置,目的是为设备制造商提供最大的灵活性。

本文档介绍了 MTE 设置和范围,在我们看来,MTE 可以作为始终开启的漏洞缓解措施,很好地平衡 Android 用户的安全性和成本。

Kernel

内核中的 MTE 通过命令行进行配置。同步模式下默认处于开启状态。由于以下几个原因,将来可能会发生变化:

  • 事实证明,它会显著影响性能,需要进行优化。
  • 人们普遍认为,内核代码质量不足以在强制(即失败时恐慌)模式下提供 MTE。

目前的建议是在正式版设备上停用内核 MTE。为此,请将 kasan=off 添加到内核命令行中。

用户空间

Google 提供了要通过 MTE 保护的用户空间二进制程序的默认列表。该列表包含来自 Android 安全团队的输入内容,其中包含特权组件和/或处理不可信输入内容的组件。可在 Android 构建系统的 memtag-common.mk 文件中找到推荐与 MTE 搭配使用的原生二进制程序的最新列表。此外,还包含多个系统应用:目前有 NFC、蓝牙和 SecureElement。在异步模式下,这些二进制程序和应用会默认启用。

当前的建议是使用默认目标列表(无需进行任何更改)。此外,建议评估核心系统中添加的 BSP 和 OEM 内容,并在对安全要求较高的系统上启用 MTE。

应用

上面列出的三个系统应用是目前仅有的使用 MTE 的应用。要让某个第三方应用启用 MTE,其 AndroidManifest.xml 需要使用 off 以外的值指定 android:memtagMode。因此,Geekbench 或 AnTuTu 等常见基准套件无法通过 MTE 运行。如果内核 MTE 也处于停用状态(请参阅上面的 kasan=off),那么基准对性能的影响应该会非常有限(如果有的话)。

对于其他应用,我们正在积极开发 Chrome 中的 MTE 支持。Play 商店中当前的 Chrome 版本在清单中包含 memtagMode=async 设置。我们希望 Android 生态系统中许多注重安全的应用(例如银行应用)最终也能做到这一点。另一方面,我们预计某些需要峰值 CPU 性能的应用(如游戏)将选择让 MTE 保持停用状态。

其他模式

上述指令在所有地方都仅使用异步 MTE 模式。其他模式的速度可能几乎相同或完全相同,具体取决于硬件。它们还可以改进诊断并在一定程度上增强漏洞缓解措施属性。

我们建议您测试一两种其他配置,看看它们是否足以满足您的性能/功耗要求。您可以通过写入到 /sys/devices/system/cpu/cpu*/mte_tcf_preferred 为系统中的每个 CPU 核心设置 MTE 模式。例如,写入 sync(或 asymm)会导致已请求异步模式的任何用户空间进程在该核心上运行时以静默方式自动升级到 Sync(或 Asymm)。您可以在设备启动时在 .rc 文件中完成此设置。

我们建议测量一两种其他配置,以检查它们是否满足您的性能和功耗要求。下面是一些值得探索的有趣配置:

  • 在所有核心上采用 Asymm
  • 在大型核心上采用 Asymm,在其他核心上采用 Sync

如需验证进程是否正在请求异步模式(可能自动升级),请检查以下代码行是否包含 PR_MTE_TCF_SYNCPR_MTE_TCF_ASYNC

  debuggerd <PID> | head -30 | grep tagged_addr

遗憾的是,无法轻松查看进程的有效模式;但同时显示上述两个值的所有进程都会受到自动升级行为的影响。