MTE ブートローダーのサポート

Android 13 には、リクエストされた MTE モードをブートローダーに伝えるユーザー空間用の ABI が導入されています。これを使用すると、ハードウェアはサポートされているがデフォルトでは初期設定で MTE が有効になっていないデバイスで MTE を有効にしたり、逆に初期設定で MTE が有効になっているデバイスで MTE を無効にしたりできます。

ブートローダーのサポート

この ABI をサポートするには、ブートローダーが misc パーティションから(bootloader_message.h で定義されている)misc_memtag_message を読み取る必要があります。 有効な misc_memtag_message が見つかると(MISC_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 バイナリをビルドするようプロダクトを設定する必要があります。次に、ro.arm64.memtag.bootctl_supported システム プロパティを設定して、ブートローダーが memtag メッセージをサポートしていることをシステムに示します。

ユーザー インターフェース

ro.arm64.memtag.bootctl_supported プロパティが設定されている場合、開発者向けオプション メニューのボタンを使って、ユーザーは MTE を有効にした状態で 1 回再起動できます。この場合の対象ユーザーは、MTE でアプリをテストするアプリ デベロッパーです。 MTE の開発者向けオプションのスクリーンショット。

システム プロパティ

高度な使い方として、システム プロパティ arm64.memtag.bootctl は次の値からなるカンマ区切りのリストを取得できます。

  • memtag: ユーザー空間の MTE を永続的に有効にする(MISC_MEMTAG_MODE_MEMTAG を設定)
  • memtag-once: ユーザー空間の MTE を 1 回有効にする(MISC_MEMTAG_MODE_MEMTAG_ONCE を設定)
  • memtag-kernel: カーネル空間の MTE を有効にする(MISC_MEMTAG_MODE_MEMTAG_KERNEL を設定)
  • memtag-kernel-once: カーネル空間の MTE を 1 回有効にする(MISC_MEMTAG_MODE_MEMTAG_KERNEL_ONCE を設定)
  • memtag-off: MTE を無効にする(MISC_MEMTAG_MODE_MEMTAG_OFF を設定)

新しい設定はブートローダーによって適用されるため、有効にするにはシステムを再起動する必要があります。