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,则 on 会将 MISC_MEMTAG_MODE_{MEMTAG, MEMTAG_ONLY, MEMTAG_OFF} 设置为 (1, 0, 0),off 设置为 (0, 0, 1),同时保留其他标志。

您应该配置您的产品以构建 mtectrl 二进制文件以获得用户空间支持。然后,设置 ro.arm64.memtag.bootctl_supported 系统属性,以向系统表明您的启动加载程序支持 memtag 消息。

用户界面

ro.arm64.memtag.bootctl_supported 属性设置后,“开发者选项”菜单中的一个按钮允许用户在启用 MTE 的情况下重启一次。此按钮的目标受众是想要使用 MTE 测试其应用的开发者。 MTE 开发者选项的屏幕截图。

系统属性

对于高级用途,系统属性 arm64.memtag.bootctl 可以接受以下值的逗号分隔列表

  • memtag: 持久启用用户空间 MTE(设置 MISC_MEMTAG_MODE_MEMTAG
  • memtag-once: 启用用户空间 MTE 一次(设置 MISC_MEMTAG_MODE_MEMTAG_ONCE
  • memtag-kernel: 启用内核空间 MTE(设置 MISC_MEMTAG_MODE_MEMTAG_KERNEL
  • memtag-kernel-once: 启用内核空间 MTE 一次 (MISC_MEMTAG_MODE_MEMTAG_KERNEL_ONCE)
  • memtag-off: 禁用 MTE(设置 MISC_MEMTAG_MODE_MEMTAG_OFF

系统必须重启才能使新设置生效(因为它是由启动加载程序应用的)。