MTE 可以在 Android 内核和 Android 系统中的任何进程中独立启用。Google 不强制执行任何特定配置,旨在为设备制造商提供最大的灵活性。
本文档介绍了我们认为可以在 Android 用户始终开启的漏洞缓解措施的安全性和成本之间取得良好平衡的 MTE 设置和范围。
内核
内核中的 MTE 通过命令行配置。默认情况下,在同步模式下处于开启状态。由于以下几个原因,这可能会在未来发生变化
- 事实证明,它会显著影响性能,因此需要进行优化工作。
- 人们普遍认为内核代码质量不足以在强制(即故障时崩溃)模式下交付 MTE。
目前的建议是在生产设备上禁用内核 MTE。为此,请将 kasan=off
添加到内核命令行。
用户空间
Google 提供了一个默认的用户空间二进制文件列表,用于通过 MTE 进行保护。该列表由 Android 安全团队提供,其中包含特权组件和/或处理不受信任输入的组件。建议使用 MTE 的最新原生二进制文件列表可以在 Android 构建系统中的 memtag-common.mk 文件中找到。此外,多个系统应用也包含在内:目前为 Nfc、蓝牙和 SecureElement。默认情况下,这些二进制文件和应用在异步模式下启用。
目前的建议是使用默认目标列表(无需更改)。此外,建议评估 BSP 和 OEM 对核心系统的补充,并在对安全敏感的补充上启用 MTE。
应用
上面列出的三个系统应用是目前唯一使用 MTE 的应用。为了让第三方应用启用 MTE,其 AndroidManifest.xml
需要指定 android:memtagMode
,且值不能为 off
。因此,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
)会导致任何已请求异步模式的用户空间进程在在该核心上运行时静默自动升级到同步(或非对称)模式。此设置可以在设备启动时的 .rc 文件中完成。
我们建议测量一到两种其他配置,以检查它们是否满足您的性能和功耗要求。一些值得探索的有趣配置
- 所有核心上的非对称模式。
- 大核心上的非对称模式,其他核心上的同步模式。
要验证进程是否正在请求异步模式(可能自动升级),请检查以下行是否同时包含 PR_MTE_TCF_SYNC 和 PR_MTE_TCF_ASYNC
debuggerd <PID> | head -30 | grep tagged_addr
遗憾的是,目前还没有简单的方法来查看进程的有效模式;但任何显示上面列出的两个值的进程都将受到自动升级行为的影响。