MTE 引导加载程序支持

Android 13 引入了一个用户空间 ABI,用于将请求的 MTE 模式传达给引导加载程序。这可用于在具有硬件支持但未默认启用 MTE 的设备上启用 MTE,或在启用 MTE 的设备上停用 MTE。

引导加载程序支持

为了支持此 ABI,引导加载程序需要读取 misc 分区中的 misc_memtag_message(在 bootloader_message.h 中定义)。 如果找到了有效的 misc_memtag_messageMISC_VIRTUAL_AB_MAGIC_HEADER 匹配,并且版本号受支持),引导加载程序会计算

memtag = (default_memtag && !(misc.memtag_mode & MISC_MEMTAG_MODE_MEMTAG_OFF)) ||
      misc.memtag_mode & MISC_MEMTAG_MODE_MEMTAG ||
      misc.memtag_mode & MISC_MEMTAG_MODE_MEMTAG_ONCE

memtag_kernel = misc.memtag_mode & MISC_MEMTAG_MODE_MEMTAG_KERNEL ||
      misc.memtag_mode & MISC_MEMTAG_MODE_MEMTAG_KERNEL_ONCE

default_memtag 是 SKU 的默认 memtag 开启/关闭设置。如果 memtag 为 true,引导加载程序会设置 MTE 标记预留,在较低的异常级别启用标记检查,并通过 DT 将标记预留区域传达给内核。如果 memtag 为 false,引导加载程序会将 arm64.nomte 附加到内核命令行。

如果 memtag_kernel 为 true,引导加载程序会将 kasan=on 附加到内核命令行。

引导加载程序必须在每次启动时清除 MISC_MEMTAG_MODE_MEMTAG_ONCEMISC_MEMTAG_MODE_MEMTAG_KERNEL_ONCE

如果引导加载程序支持 fastboot oem mte,则系统会将 MISC_MEMTAG_MODE_{MEMTAG, MEMTAG_ONLY, MEMTAG_OFF} 开启状态设置为 (1, 0, 0),并将其关闭状态设置为 (0, 0, 1),同时保留其他标志。

您应配置您的产品来构建 mtectrl 二进制文件,以支持 userspace。然后,设置 ro.arm64.memtag.bootctl_supported 系统属性,向系统表明您的引导加载程序支持 memtag 消息。

界面

设置 ro.arm64.memtag.bootctl_supported 属性后,您可以使用“开发者选项”菜单中的按钮,在启用 MTE 的情况下重新启动一次。其目标受众是希望使用 MTE 测试其应用的应用开发者。 MTE 开发者选项的屏幕截图。

系统属性

对于高级用途,系统属性 arm64.memtag.bootctl 可以接受以下值(采用逗号分隔列表形式):

  • memtag::持续启用 user-space MTE(设置 MISC_MEMTAG_MODE_MEMTAG
  • memtag-once::启用一次 user-space MTE(设置 MISC_MEMTAG_MODE_MEMTAG_ONCE
  • memtag-kernel:启用 kernel-space MTE(设置 MISC_MEMTAG_MODE_MEMTAG_KERNEL
  • memtag-kernel-once::启用 kernel-space MTE 一次 (MISC_MEMTAG_MODE_MEMTAG_KERNEL_ONCE)
  • memtag-off::停用 MTE(设置 MISC_MEMTAG_MODE_MEMTAG_OFF

必须重新启动系统,才能使新设置生效(由引导加载程序应用的设置)。