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_ONCE
と MISC_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 でアプリをテストするアプリ デベロッパーです。
システム プロパティ
高度な使い方として、システム プロパティ 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
を設定)
新しい設定はブートローダーによって適用されるため、有効にするにはシステムを再起動する必要があります。